一.脱壳
OD载入停在这里:
0040763A >55push ebp
0040763B8BECmov ebp,esp// HR ESP 下断点执行esp定律
0040763D83EC 64 sub esp,64
0040764053push ebx
-------------------------------------------------------------------------------------
00407D00- FFE0jmp eax//程序停在这里,单步跳向程序OEP
00407D025Fpop edi
----------------------------------------------------------------------------------
004012A068 582E4000 push UnPackMe.00402E58//这里就是程序的OEP,标准的VB入口,DUMP修复。
004012A5E8 F0FFFFFF call UnPackMe.0040129A//
004012AA0000add byte ptr ds:[eax],al
004012AC0000add byte ptr ds:[eax],al
===================================================================================================
二、去自校验
自校验一般就是对文件大小,创建时间等进行比较来校验文件是否进行了改动,我们就从这方面入手。
OD载入脱壳后的文件。查找所有模块间的调用。会发现如下:
00403DF1CALL DWORD PTR DS:[<&msvbvm60.rtcFileDateTime>]msvbvm60.rtcFileDateTime
004044BBCALL DWORD PTR DS:[<&msvbvm60.rtcFileLen>]msvbvm60.rtcFileLen
这两个函数不就是获取文件时间和大小的么,在这两个函数的每个调用下断,shift + f9运行。
00403DF1FF15 A0104000 CALL DWORD PTR DS:[<&msvbvm60.rtcFileDateTime>] ; 首先断在这里
00403DF78D55 8C LEA EDX,DWORD PTR SS:[EBP-74]
00403DFA8D4D AC LEA ECX,DWORD PTR SS:[EBP-54]
00403DFDC745 94 6838400>MOV DWORD PTR SS:[EBP-6C],unpackme.00403868 ; YYYYMMDDHHMMSS
00403E04C745 8C 0800000>MOV DWORD PTR SS:[EBP-74],8
00403E0BFF15 B8104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaVarDup>] ; msvbvm60.__vbaVarDup
00403E116A 01 PUSH 1
00403E138D4D AC LEA ECX,DWORD PTR SS:[EBP-54]
00403E166A 01 PUSH 1
00403E188D55 BC LEA EDX,DWORD PTR SS:[EBP-44]
00403E1B51PUSH ECX
00403E1C8D45 9C LEA EAX,DWORD PTR SS:[EBP-64]
00403E1F52PUSH EDX
00403E2050PUSH EAX
00403E21FF15 28104000 CALL DWORD PTR DS:[<&msvbvm60.rtcVarFromFormatVar>];
00403E278D4D 9C LEA ECX,DWORD PTR SS:[EBP-64]
00403E2A51PUSH ECX
00403E2BFF15 10104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrVarMove>]; 获取脱壳文件时间
00403E318BD0MOV EDX,EAX ; eax为子程序调用返回值,20081011085348
00403E338D4D E8 LEA ECX,DWORD PTR SS:[EBP-18]
00403E36FFD6CALL ESI
00403E388D55 9C LEA EDX,DWORD PTR SS:[EBP-64]
00403E3B8D45 AC LEA EAX,DWORD PTR SS:[EBP-54]
00403E3E52PUSH EDX
00403E3F8D4D BC LEA ECX,DWORD PTR SS:[EBP-44]
00403E4250PUSH EAX
00403E4351PUSH ECX
00403E446A 03 PUSH 3
00403E46FF15 14104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeVarList>]
00403E4C8B55 E8 MOV EDX,DWORD PTR SS:[EBP-18] ; 脱壳文件的时间
00403E4F83C4 10 ADD ESP,10
00403E5252PUSH EDX; 脱壳文件时间入栈
00403E5368 8C384000 PUSH unpackme.0040388C; 20081005120830原文件时间
00403E58FF15 54104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaStrCmp>] ; 比较两个时间,不等返回1
00403E5EF7D8NEG EAX; 返回值在eax中,为1
00403E601BC0SBB EAX,EAX
00403E62F7D8NEG EAX
00403E6448DEC EAX //NOP掉 ; 减1,nop掉就可以了
00403E658945 E4 MOV DWORD PTR SS:[EBP-1C],EAX; 使eax为1就是两个时间相等,eax为0为两时间不等。
00403E6868 C03E4000 PUSH unpackme.00403EC0
00403E6DEB 40 JMP SHORT unpackme.00403EAF
-----------------------------------------------------------------------------------------------------------------
上面就处理完了时间校验,再F9运行。
004044BBFF15 A8104000 CALL DWORD PTR DS:[<&msvbvm60.rtcFileLen>]; 停在这里,函数返回值在eax中。
004044C18D4D D4 LEA ECX,DWORD PTR SS:[EBP-2C]
004044C48945 D8 MOV DWORD PTR SS:[EBP-28],EAX
脱壳后的文件大小十六进制:E000(十进制:57344)
004044C7FF15 D8104000 CALL DWORD PTR DS:[<&msvbvm60.__vbaFreeStr>] ; 004044CD68 1C454000 PUSH unpackme.0040451C
F8单步向下直到程序返回
。。。。。。。。。。。
------------------------------------------------------------------------------------
返回到这里:
00404295817D E4 C05D0000CMP DWORD PTR SS:[EBP-1C],5DC0 ; 内存地址值与5DC0(24000)进行比较。值为:E000,十进制的57344。脱壳文件的大小。
0040429C7E 54 JLE SHORT unpackme.004042F2 //改为jmp004042F2 ; 小于等于就跳。脱壳前的文件大小为16836,小于24000,而脱壳后的文件大小24000,所以这里一定要跳的不然就OVER。
============================================================================================== 修改两字节: 00403E6448 =>90
0040429C7E =>EB
unpc.rar
经过以上处理后程序就可以正常运行了。保存文件。OK。
|