📄 trsmc.asm
字号:
;-=-=-=-=-=-=--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
; 保存关键数据
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 + -