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

📄 trsmc.asm

📁 此为本书的配套光盘.本书结合实例
💻 ASM
📖 第 1 页 / 共 2 页
字号:

;-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; 保存关键数据
SaveBlockData		proc uses ebx ecx edx esi edi lpAddress:LPVOID,pImageInfo:LPVOID
	LOCAL	dwImageBase	:	DWORD
	LOCAL	dwImagePtr	:	DWORD
			mov		[dwImageBase],0
			mov		[dwImagePtr],0
			mov		edi,pImageInfo
			test	edi,edi
			jz		loc_fail_ret
			assume	edi:ptr IMAGE_INFO
			mov		eax,[edi].ImageBase
			mov		[dwImageBase],eax
			mov		eax,[edi].ImagePtr
			mov		[dwImagePtr],eax
			mov		esi,lpAddress
			mov		edi,offset AddrOfBlock1
			xor		edx,edx
			xor		ebx,ebx
			; 保存Block1的地址
			xor		eax,eax
			xchg	eax,dword ptr [esi]
			sub		eax,[dwImageBase]
			add		eax,[dwImagePtr]
			stosd
			; 保存Block1的大小
			xor		eax,eax
			xchg	eax,dword ptr [esi+4]
			stosd
			add		ebx,eax
			; 保存Block2的地址
			xor		eax,eax
			xchg	eax,dword ptr [esi+8]
			sub		eax,[dwImageBase]
			add		eax,[dwImagePtr]
			stosd
			; 保存Block2的大小
			xor		eax,eax
			xchg	eax,dword ptr [esi+0Ch]
			stosd
			add		edx,eax
			add		ebx,eax
			; 保存Block3的地址
			xor		eax,eax
			xchg	eax,dword ptr [esi+10h]
			sub		eax,[dwImageBase]
			add		eax,[dwImagePtr]
			stosd
			; 保存Block3的大小
			xor		eax,eax
			xchg	eax,dword ptr [esi+14h]
			stosd
			add		edx,eax
			add		ebx,eax
			; 保存需要加密的块的总字节数
			mov		[SizeOfSmcBlocks],edx
			mov		[SizeOfAllBlocks],ebx
			; 保存Block4的地址
			xor		eax,eax
			xchg	eax,dword ptr [esi+18h]
			sub		eax,[dwImageBase]
			add		eax,[dwImagePtr]
			stosd
			mov		eax,TRUE
			jmp		loc_ret
loc_fail_ret:
			IFDEF	DEBUG_BUG
				int 3
			ENDIF
			mov		eax,FALSE
loc_ret:	ret
SaveBlockData		endp

;-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; 建立用于加密的密钥流
CreateKeyStream		proc uses ebx ecx edx esi edi
	LOCAL	StreamPtr	:	DWORD
			mov		[StreamPtr],0
			;-=-=申请内存用于保存密钥流数据=-=-
			mov		eax,[SizeOfSmcBlocks]
			shl		eax,2
			invoke	VirtualAlloc,NULL,eax,MEM_COMMIT,PAGE_READWRITE
			test	eax,eax
			jz		loc_fail_ret
			mov		[StreamPtr],eax
			;-=-=建立用于加密Block2块的密钥流=-=-
			mov		edi,[StreamPtr]			;
			mov		esi,[AddrOfBlock2]		;
			xor		ecx,ecx					;
			mov		edx,INIT_KEY			; EDX 为初始密钥
loc_loop1:	push	esi						;
			push	ecx						; 入栈保存 ESI 和 ECX
			mov		esi,[AddrOfBlock1]		;
			add		ecx,[SizeOfBlock1]		;
@@:			lodsd							; 
			xor		edx,eax					; 
			xor		edx,ecx					; Key = Key ^ Block1[i] ^ SizeOfBlock1
			loop	@B						;
			pop		ecx						;
			pop		esi						; 从堆栈中恢复 ESI 和 ECX 原来的值
			mov		eax,edx					;
			stosd							; 保存密钥
			xor		edx,HASH_NUM1			;
			xor		edx,ecx					; Key = Key ^ HASH_NUM1 ^ SizeOfBlock2
			inc		ecx						;
			cmp		ecx,[SizeOfBlock2]		;
			jnz		loc_loop1				;
			;-=-=建立用于加密Block3块的密钥流=-=-
			mov		esi,[AddrOfBlock3]		;
			xor		ecx,ecx					;
loc_loop2:	push	esi						;
			push	ecx						; 入栈保存 ESI 和 ECX
			mov		esi,[AddrOfBlock2]		;
			add		ecx,[SizeOfBlock2]		;
@@:			lodsd							; 
			xor		edx,eax					; 
			xor		edx,ecx					; Key = Key ^ Block2[i] ^ SizeOfBlock2
			loop	@B						;
			pop		ecx						;
			pop		esi						; 从堆栈中恢复 ESI 和 ECX 原来的值
			mov		eax,edx					;
			stosd							;
			xor		edx,HASH_NUM2			;
			xor		edx,ecx					; Key = Key ^ HASH_NUM2 ^ SizeOfBlock2
			inc		ecx						;
			cmp		ecx,[SizeOfBlock3]		;
			jnz		loc_loop2				;

			mov		eax,[StreamPtr]
			jmp		loc_ret
loc_fail_ret:
			xor		eax,eax
loc_ret:	ret
CreateKeyStream		endp

;-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; 释放内存
ReleaseMemory		proc uses ebx ecx edx esi edi	lpMemory:LPVOID
			cmp		lpMemory,0
			jz		@F
			invoke	VirtualFree,lpMemory,0,MEM_RELEASE
@@:			ret
ReleaseMemory		endp

;-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; 加密函数:没有做更多的改动,依然是个简单的加密方法
EncryptFunc	proc uses ebx ecx edx esi edi lpBuffer:LPVOID,nBuffSize:DWORD
			mov		esi,lpBuffer
			mov		edi,esi
			mov		ecx,nBuffSize
loc_loop:	lodsb
			inc		al
			stosb
			loop	loc_loop
			ret
EncryptFunc	endp

;-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; 使用密钥流加密代码块
StreamEncrypt		proc uses ebx ecx edx esi edi pKeyStream:LPVOID
			;-=-=加密Block2块代码=-=-
			mov		edi,[AddrOfBlock2]
			mov		esi,pKeyStream
			mov		ecx,[SizeOfBlock2]
loc_loop1:	lodsd
			xor		dword ptr [edi],eax
			add		edi,4
			loop	loc_loop1
			;-=-=加密Block3块代码=-=-
			mov		edi,[AddrOfBlock3]
			mov		ecx,[SizeOfBlock3]
loc_loop2:	lodsd
			xor		dword ptr [edi],eax
			add		edi,4
			loop	loc_loop2
			push	[SizeOfAllBlocks]
			push	[AddrOfBlock1]
			call	EncryptFunc
			ret
StreamEncrypt		endp

;-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; 保存映象到文件
SaveImageToFile		proc uses ebx ecx edx esi edi pszFileName:LPVOID,pImageInfo:LPVOID
	LOCAL	hFile		:	DWORD
	LOCAL	dwImagePtr	:	DWORD
	LOCAL	dwHeaderSize:	DWORD
	LOCAL	dwWriteBytes:	DWORD
	LOCAL	dwResult	:	DWORD
	LOCAL	dwScnNum	:	DWORD
	LOCAL	dwScnHeaderPtr	:	DWORD
			mov		[hFile],0
			mov		[dwImagePtr],0
			mov		[dwHeaderSize],0
			mov		[dwWriteBytes],0
			mov		[dwResult],0
			mov		[dwScnNum],0
			mov		[dwScnHeaderPtr],0
			mov		edi,pImageInfo
			assume	edi:ptr IMAGE_INFO
			test	edi,edi
			jz		loc_fail_ret
			cmp		[edi].ImagePtr,0
			jz		loc_fail_ret
			mov		eax,[edi].ImagePtr
			mov		[dwImagePtr],eax
			mov		eax,[edi].HeaderSize
			mov		[dwHeaderSize],eax
			mov		eax,[edi].ScnNum
			mov		[dwScnNum],eax
			mov		eax,[edi].ScnHeaderPtr
			mov		[dwScnHeaderPtr],eax
			;-=-=打开文件写-=-=
			push	NULL
			push	FILE_ATTRIBUTE_NORMAL
			push	CREATE_ALWAYS
			push	NULL
			push	FILE_SHARE_READ
			push	GENERIC_WRITE
			push	pszFileName
			call	CreateFileA
			cmp		eax,INVALID_HANDLE_VALUE
			jnz		@F
			invoke	MessageBoxA,NULL,addr szErrMsg1,addr szErrTitle,MB_OK
			jmp		loc_fail_ret
@@:			mov		[hFile],eax
			;-=-=写入文件头=-=-
			push	NULL
			lea		eax,[dwWriteBytes]
			push	eax
			push	[dwHeaderSize]
			push	[dwImagePtr]
			push	[hFile]
			call	WriteFile
			mov		eax,[dwWriteBytes]
			cmp		eax,[dwHeaderSize]
			jz		@F
			invoke	MessageBoxA,NULL,addr szErrMsg6,addr szErrTitle,MB_OK
			jmp		loc_fail_ret

@@:			mov		esi,[dwScnHeaderPtr]
			assume	esi:ptr IMAGE_SECTION_HEADER
			mov		ecx,[dwScnNum]
loc_loop:	push	ecx
			push	esi
			;-=-=写入区段数据=-=-
			push	NULL
			lea		eax,[dwWriteBytes]
			push	eax
			push	[esi].SizeOfRawData
			mov		eax,[esi].VirtualAddress
			add		eax,[dwImagePtr]
			push	eax
			push	[hFile]
			call	WriteFile
			pop		esi
			pop		ecx
			mov		eax,[dwWriteBytes]
			cmp		eax,[esi].SizeOfRawData
			jz		@F
			invoke	MessageBoxA,NULL,addr szErrMsg6,addr szErrTitle,MB_OK
			jmp		loc_fail_ret
@@:			add		esi,sizeof IMAGE_SECTION_HEADER
			loop	loc_loop
			mov		[dwResult],TRUE
			jmp		loc_safe_ret
loc_fail_ret:
			mov		[dwResult],FALSE
loc_safe_ret:
			cmp		[hFile],0
			jz		@F
			invoke	CloseHandle,[hFile]
@@:			mov		eax,[dwResult]
			ret
SaveImageToFile		endp

;-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; 程序入口
Main:
			;-=-=创建和程序执行时相同的内存映象=-=-
			invoke	CreateImage,addr szOrgFileName,addr sImageInfo
			cmp		eax,FALSE
			jz		gm0_safe_exit
			;-=-=查找特征字符串定位到数据信息处=-=-
			invoke	SearchBlockDataAddr,addr sImageInfo
			test	eax,eax
			jz		gm0_safe_exit
			;-=-=保存每个代码块的偏移地址和大小=-=-
			invoke	SaveBlockData,eax,addr sImageInfo
			;-=-=计算得到密钥流数据=-=-
			invoke	CreateKeyStream
			cmp		eax,FALSE
			jz		gm0_safe_exit
			mov		[KeyStreamPtr],eax
			;-=-=对代码使用密钥流进行加密=-=-
			invoke	StreamEncrypt,[KeyStreamPtr]
			;-=-=保存映象到文件中=-=-
			invoke	SaveImageToFile,addr szNewFileName,addr sImageInfo
gm0_safe_exit:
			mov		edi,[sImageInfo].ImagePtr
			test	edi,edi
			jz		@F
			invoke	ReleaseMemory,edi
@@:			mov		edi,[KeyStreamPtr]
			test	edi,edi
			jz		@F
			invoke	ReleaseMemory,edi
@@:			invoke	ExitProcess,0

end Main

⌨️ 快捷键说明

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