首先感谢风林兄,想不通兄二位给遇我的指点和不厌烦的赐教!
前人已经写过很多了,小弟在此多写一点麻烦的东西,高手莫笑,有不对之处请多多指正!
费话不多说,进入正题
PEID查壳为:PEBundle 2.0x - 2.4x-> Jeremy Collake [Overlay] 详细版本小弟还没有查到。
点击选项——调试选项——异常,把里面的忽略全部√上!CTRL+F2重载下程序!
OD载入停在这里
*******************************************************************************************************************
0059F000 哈哈.<模块入口点> 9C pushfd
0059F001 60 pushad
0059F002 E8 02000000 call 哈哈.0059F009
0059F007 33C0 xor eax, eax
0059F009 8BC4 mov eax, esp
0059F00B 83C0 04 add eax, 4
0059F00E 93 xchg eax, ebx
0059F00F 8BE3 mov esp, ebx
0059F011 8B5B FC mov ebx, dword ptr [ebx-4]
0059F014 81EB 07204000 sub ebx, 哈哈.00402007
0059F01A 87DD xchg ebp, ebx
0059F01C 83BD 3D294000 01 cmp dword ptr [ebp+40293D], 1
0059F023 0F84 33040000 je 哈哈.0059F45C
0059F029 80BD 522F4000 00 cmp byte ptr [ebp+402F52], 0
0059F030 74 37 je short 哈哈.0059F069
*************************************************************************************************************************************
注意一开始便有一个CALL,这样的CALL一般不能单步步过(跑题了)
设置好调试选项进入入口点便按
ALT+M,打开内存镜象,找到如图:
.rsrc.按F2下断点,然后按F9运行到断点,接着再按ALT+M,打开内存镜象,找到程序的第一个.rsrc.上面的上上行(也就是00401000处),按F2下断点!然后按F9,然后单步跟踪,遇到已实再的向回跳的J就在下一行点左键然后F4(运行到此位置,目的是让跟踪少些时间)直到如下面代码的地方:
**************************************************************************************************************************************
00534098 95 xchg eax, ebp
00534099 8A07 mov al, byte ptr [edi]
0053409B 47 inc edi
0053409C 08C0 or al, al
0053409E ^ 74 DC je short 哈哈.0053407C
005340A0 89F9 mov ecx, edi
005340A2 79 07 jns short 哈哈.005340AB
005340A4 0FB707 movzx eax, word ptr [edi]
005340A7 47 inc edi
005340A8 50 push eax
005340A9 47 inc edi
005340AA B9 5748F2AE mov ecx, AEF24857
005340AF 55 push ebp
005340B0 FF96 486A1300 call dword ptr [esi+136A48]
005340B6 09C0 or eax, eax
005340B8 74 07 je short 哈哈.005340C1
005340BA 8903 mov dword ptr [ebx], eax
005340BC 83C3 04 add ebx, 4
005340BF ^ EB D8 jmp short 哈哈.00534099 //发现一直在这里循环的跳,同时意一下下面几行有个POPAD,找到这个则OEP就不远了,则在005340C8 处F2下断点然后F9运行,被断下,来到如后面一断所示代码处
005340C1 FF96 4C6A1300 call dword ptr [esi+136A4C]
005340C7 61 popad
005340C8 - E9 1B38EEFF jmp 哈哈.004178E8
005340CD 0000 add byte ptr [eax], al
005340CF 0000 add byte ptr [eax], al
*********************************************************************************************************************************
接前面的代码处:
004178E8 55 push ebp //这里就是OEP了
004178E9 8BEC mov ebp, esp
004178EB 6A FF push -1
004178ED 68 40BE4500 push 哈哈.0045BE40
004178F2 68 4C7A4100 push 哈哈.00417A4C ; jmp 到 msvcrt._except_handler3
004178F7 64:A1 00000000 mov eax, dword ptr fs:[0]
004178FD 50 push eax
004178FE 64:8925 00000000 mov dword ptr fs:[0], esp
00417905 83EC 68 sub esp, 68
00417908 53 push ebx
00417909 56 push esi
0041790A 57 push edi
0041790B 8965 E8 mov dword ptr [ebp-18], esp
0041790E 33DB xor ebx, ebx
00417910 895D FC mov dword ptr [ebp-4], ebx
00417913 6A 02 push 2
00417915 FF15 3C9B4500 call dword ptr [459B3C] ; msvcrt.__set_app_type
0041791B 59 pop ecx
0041791C 830D 04224700 FF or dword ptr [472204], FFFFFFFF
00417923 830D 08224700 FF or dword ptr [472208], FFFFFFFF
0041792A FF15 389B4500 call dword ptr [459B38] ; msvcrt.__p__fmode
00417930 8B0D 8C1A4700 mov ecx, dword ptr [471A8C]
******************************************************************************************************************************************
可以看出是VC++的OEP特征,然后用LOADPE DUMP内存镜像(在此,小弟先用的OD的DUMP插件结果脱出来的无法修复,类似自校验的状况,吃了不少苦头,后来用LOADPE才行)
保存为DUMP.EXE,抓取完后查壳已经无壳,但不能运行,最后用IRC工具打开OD里正在加载的进程(注意前面抓取完后不能关掉OD)在OEP处输入OEP地址:178E8 (按别人的经验和教程里说的是这个值,我也一直没有搞明白为什么不是4178E8呢??可能是处于一个段中的原因吧)
然后点自动查找IAT,再点获取输入表,这时输入表块全显示出来了,但有一些块有无效指针直接删除掉然后修复转存文件,最后就OK了,IRC自动生成一个DUMP_.EXE的文件,运行,正常!
就写到这里吧,主要是为了个人总结,也为了请高手们指点我其中的疑惑,感谢看完!
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)