⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lccrypto.asm

📁 本程序可以在 PE 文件的结尾增加一个新节
💻 ASM
📖 第 1 页 / 共 2 页
字号:
;*********************************************************
;程序名称:LC Crypto
;          本文件只是主程序的源代码
;          注意加密部分的代码是在 attach.asm
;          本程序综合运用了SEH、PE、CRC32知识
;作者:罗聪
;日期:2002-11-29
;整理:2003-3-2
;出处:http://www.LuoCong.com(老罗的缤纷天地)
;注意事项:如欲转载,请保持本程序的完整,并注明:
;转载自“老罗的缤纷天地”(http://www.LuoCong.com)
;>> 在此特别强烈感激 俄罗斯 的 Comrade 大虾,
;>> 跟他的交流使我受益匪浅,他的源代码更使我汗颜!
;*********************************************************


.386
.model flat, stdcall
option casemap:none

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\shell32.inc
include \masm32\include\comdlg32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
includelib \masm32\lib\shell32.lib
includelib \masm32\lib\comdlg32.lib

;*********************************************************
;很有用的宏
;*********************************************************
CTEXT	MACRO y:VARARG
	LOCAL sym
	CONST segment
	ifidni <y>,<>			
		sym db 0		
    else			
		sym db y,0
	endif
	CONST ends
	exitm <offset sym>
ENDM

m2m MACRO M1, M2
	push M2
	pop	M1
ENDM

;*********************************************************
;子程序定义
;*********************************************************
WndProc					proto	:DWORD, :DWORD, :DWORD, :DWORD
Protect					proto
ErrorHandler			proto C	:DWORD, :DWORD, :DWORD, :DWORD
ExceptionFilter			proto	:DWORD
AboutProc				proto	:DWORD, :DWORD, :DWORD, :DWORD
init_crc32table_m		proto
arraycrc32_m			proto

;*********************************************************
;常量定义
;*********************************************************
.const
IDI_LC					equ	1
IDC_BUTTON_BROWSE		equ	3000
IDC_EDIT_FILENAME		equ	3001
IDC_EDIT_PASSWORD		equ	3002
IDC_CHECKBOX_KEEPBACKUP	equ	3003
IDC_BUTTON_PROCESS		equ	3004
IDC_BUTTON_ABOUT		equ	3005
IDC_BUTTON_EXIT			equ	3006
IDC_BUTTON_HELP			equ	3007
IDC_BUTTON_HOMEPAGE		equ	3008
DLG_HELP				equ	3009
IDC_EDIT_PASSWORD_2		equ	3010
IDM_MENU_ABOUT			equ	3011

;*********************************************************
;变量定义
;*********************************************************
.data
szDlgName				db	"LC_DIALOG", 0
szCaption				db	"LC Crypto :: v0.1 by LC", 0
szMenuAbout				db	"&About LC Crypto...", 0
szFileFilter			db	"Executables (*.exe)", 0, "*.exe", 0, 0
szStatusDone			db	"Done!", 0
szError					db	"Error", 0
szErrorThread			db	"Error at %08Xh", 13, 10, "Registers:", 13, 10, "eax = %08Xh ebx = %08Xh ecx = %08Xh", 13, 10, "edx = %08Xh esp = %08Xh ebp = %08Xh", 13, 10, "esi = %08Xh edi = %08Xh", 13, 10, 13, 10, "Recovering...", 0
szErrorFinal			db	"Error at %08Xh", 13, 10, "Quitting...", 0

;*********************************************************
;插入宿主的代码
;*********************************************************
include attach.asm

;*********************************************************
;未初始化的变量定义
;*********************************************************
.data?
hFile					dd						?
szMessage				db						256 dup (?)
SEH						dd						6 dup (?)

data_start				equ						$
mbp						MSGBOXPARAMS			<>
ofn						OPENFILENAME			<>
img_dos_hdr				IMAGE_DOS_HEADER		<>
img_nt_hdrs				IMAGE_NT_HEADERS		<>
img_sect_hdr			IMAGE_SECTION_HEADER	<>
szFileName				db						MAX_PATH dup (?)
szFileNameBak			db						MAX_PATH dup (?)
szPassword				db						16 dup (?)
szPassword_2			db						16 dup (?)
data_size				equ						$ - data_start
bNew					db						attach_size dup (?)
hInstance				dd						?
crc32tble				dd						256 dup(?)	;CRC-32 table

;*********************************************************
;代码段开始
;*********************************************************
.code
main:
	;挂接异常处理模块:
	invoke	SetUnhandledExceptionFilter, addr ExceptionFilter
	push	edi
	xor		eax, eax
	mov		ecx, data_size shr 2
	mov		edi, data_start
	rep		stosd
	.if data_size and 3
		mov	edi, data_start
		mov	ecx, data_size and 3
		rep	stosb
	.endif
	pop	edi

	;不用说了吧:
	invoke	GetModuleHandle, eax
	mov		hInstance, eax
	mov		mbp.hInstance, eax
	mov		ofn.hInstance, eax
	invoke	DialogBoxParam, eax, addr szDlgName, 0, addr WndProc, eax
	invoke	ExitProcess, eax

;*********************************************************
;主程序消息循环
;*********************************************************
WndProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
	.if uMsg == WM_CLOSE
		invoke	EndDialog, hWnd, 0

	.elseif uMsg == WM_INITDIALOG
		;设置我的图标:
		invoke	LoadIcon, hInstance, IDI_LC
		invoke	SendMessage, hWnd, WM_SETICON, ICON_SMALL, eax

		;默认“保留备份文件”选项是打钩的:
		invoke	CheckDlgButton, hWnd, IDC_CHECKBOX_KEEPBACKUP, BST_CHECKED

		;储存hWnd,后面会用到:
		mov eax, hWnd
		mov	mbp.hwndOwner, eax
		mov	ofn.hwndOwner, eax

		;在系统菜单中加入我的“关于”对话框:
		invoke	GetSystemMenu, eax, 0
		push	offset szMenuAbout
		push	IDM_MENU_ABOUT
		push	MFT_STRING
		push	eax
		invoke	AppendMenu, eax, MFT_SEPARATOR, 0, 0
		call	AppendMenu

		;设置每个 Edit 框的最大文本输入字数:
		invoke	SendDlgItemMessage, hWnd, IDC_EDIT_FILENAME, EM_SETLIMITTEXT, sizeof szFileName, 0
		invoke	SendDlgItemMessage, hWnd, IDC_EDIT_PASSWORD, EM_SETLIMITTEXT, sizeof szPassword, 0
		invoke	SendDlgItemMessage, hWnd, IDC_EDIT_PASSWORD_2, EM_SETLIMITTEXT, sizeof szPassword_2, 0

	.elseif uMsg == WM_SYSCOMMAND
		.if	wParam == IDM_MENU_ABOUT
			;打开“关于”对话框:
			invoke DialogBoxParam, hInstance, DLG_HELP, hWnd, offset AboutProc, 0
		.endif

	.elseif uMsg == WM_COMMAND
		mov	eax, wParam
		.if ax == IDC_BUTTON_BROWSE
			;“打开文件”对话框:
			mov	ofn.lStructSize, sizeof ofn
			mov	ofn.lpstrFilter, offset szFileFilter
			mov	ofn.lpstrFile, offset szFileName
			mov	ofn.nMaxFile, sizeof szFileName
			invoke	GetOpenFileName, addr ofn
			;如果选择了一个文件,就把它的文件名输出到“文件名”这个 Edit 中:
			test	eax, eax
			.if !zero?
				invoke	SetDlgItemText, hWnd, IDC_EDIT_FILENAME, addr szFileName
			.endif
		.elseif ax == IDC_BUTTON_PROCESS || ax == IDOK
			;进入加密模块:
			invoke	Protect
		.elseif ax == IDC_BUTTON_ABOUT
			;“关于”对话框:
			invoke DialogBoxParam, hInstance, DLG_HELP, hWnd, offset AboutProc, 0
		.elseif ax == IDC_BUTTON_EXIT
			; Over,走人...
			invoke	SendMessage, hWnd, WM_CLOSE, 0, 0
		.endif

	.else
		mov eax, FALSE
		ret
	.endif

	xor	eax, eax
	ret
WndProc endp

;*********************************************************
;“关于”对话框
;*********************************************************
AboutProc	proc uses edx hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
	.if uMsg == WM_CLOSE
		invoke EndDialog, hWnd, 0

	.elseif	uMsg == WM_INITDIALOG
		;设置我的图标:
		invoke LoadIcon, hInstance, IDI_LC
		invoke SendMessage, hWnd, WM_SETICON, ICON_SMALL, eax

	.elseif uMsg == WM_COMMAND
		mov eax, wParam
		mov edx, eax
		shr edx, 16
		movzx eax, ax
		.if edx == BN_CLICKED
			.if eax == IDCANCEL || eax == IDOK
				invoke EndDialog, hWnd, NULL
			.elseif eax == IDC_BUTTON_HOMEPAGE
				;打开我的主页:
				invoke ShellExecute, hWnd, CTEXT("open"), CTEXT("http://www.luocong.com"), NULL, NULL, SW_SHOWNORMAL
			.elseif eax == IDC_BUTTON_HELP
				;打开 help.chm :
				invoke ShellExecute, hWnd, CTEXT("open"), CTEXT("help.chm"), NULL, NULL, SW_SHOWNORMAL
			.endif
		.endif

	.else
		mov eax, FALSE
		ret
	.endif

	mov eax, TRUE
	ret
AboutProc	endp

;*********************************************************
;写入加密节的模块
;*********************************************************
Protect proc	uses ebx ecx edx esi edi
	LOCAL bOK: BOOL

	mov bOK, TRUE

	;挂接 SEH 处理链,不用多说了吧,呵呵:
	assume	fs:nothing
	push	offset ErrorHandler
	push	fs:[0]
	mov		[SEH], esp
	mov		[SEH+4], ebp
	mov		[SEH+8], ebx
	mov		[SEH+12], esi
	mov		[SEH+16], edi
	mov		[SEH+20], offset @@safe
	mov		fs:[0], esp

	;获得文件名和密码:
	invoke	GetDlgItemText, [mbp.hwndOwner], IDC_EDIT_FILENAME, addr szFileName, sizeof szFileName
	invoke	GetDlgItemText, [mbp.hwndOwner], IDC_EDIT_PASSWORD, addr szPassword, sizeof szPassword
	invoke	GetDlgItemText, [mbp.hwndOwner], IDC_EDIT_PASSWORD_2, addr szPassword_2, sizeof szPassword_2

	;打开文件:
	invoke CreateFile, addr szFileName, GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL

	;如果打开文件失败,进行处理:
	.if eax == INVALID_HANDLE_VALUE
		invoke MessageBox, mbp.hwndOwner, CTEXT("打开文件失败!"), addr szCaption, MB_OK or MB_ICONHAND
		invoke GetDlgItem, mbp.hwndOwner, IDC_EDIT_FILENAME
		invoke SetFocus, eax
		invoke SendMessage, eax, EM_SETSEL, 0, -1
		mov bOK, FALSE
		jmp _Err_CreateFile_Exit
	.endif

	;复制文件句柄:
	mov hFile, eax

	;取得密码的长度:
	invoke lstrlen, addr szPassword

	;如果密码长度为0,进行处理:
	.if eax == 0
		invoke MessageBox, mbp.hwndOwner, CTEXT("请先输入密码!"), addr szCaption, MB_OK or MB_ICONHAND
		invoke GetDlgItem, mbp.hwndOwner, IDC_EDIT_PASSWORD
		invoke SetFocus, eax
		mov bOK, FALSE
		jmp @@safe
	.endif

	;比较两次输入的密码是否相同,如不同,进行处理:
	invoke lstrcmp, addr szPassword, addr szPassword_2
	.if eax != 0
		invoke MessageBox, mbp.hwndOwner, CTEXT("两次输入的密码不符,请检查您的输入!"), addr szCaption, MB_OK or MB_ICONHAND
		mov bOK, FALSE
		jmp @@safe
	.endif

	;判断“保留备份文件”是否被选中,如果选中了,则备份原文件,备份文件名是在原文件名的最后加“.bak”:
	invoke IsDlgButtonChecked, mbp.hwndOwner, IDC_CHECKBOX_KEEPBACKUP
	.if eax == BST_CHECKED
		invoke lstrcpy, addr szFileNameBak, addr szFileName
		invoke lstrcat, addr szFileNameBak, CTEXT(".bak")
		invoke CopyFile, addr szFileName, addr szFileNameBak, FALSE
	.endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -