;by Immlep
;www.ptteam.com
;target:EPEunpackme 910.exe
;http://www.ptteam.com/EPEunpackme.rar

昨天看到某大侠在群里发Loveboom的epe910的脱壳机(后来获悉这个位大侠就是loveboom本人,打倒loveboom  !!).....的图片,痒痒的,不过机归机,脱归脱,上次心血来潮,用EPE注册版加个UnpackMe,不要问我拿注册版,这是某兄弟在没有玩破解之前话了X00元RMB买的,自己的软件倒是没有加,被我用来加UnPackMe,真是.......

话说UnpackMe是加了,放了两天,都快发霉了,可事情就发生在今天早上,睡过头了!睡过头了?这个脱壳本来是没什么关系的,可是,我睡过头了阿,你不知道啊,今天早上3、4有课啊,看看现在是什么时间十点半了,早就上到了第三节了,啊,这还不惨!天又下着雨,去到教室要走十几分钟,去到之后都快上到第四节了,人的惰性,由此而生,My God!我又逃课了,但是逃课也要找点事做啊,难道我就这样浪费了两节+被老师点名的危险+6.25*2块RMB(按一年5500的学费来算的话,一年40周,每周22节课!总共就880节课),天啊,这12.5RMB可不能浪费啊,但是我看到了桌面上的EPE UnpackMe的时候,我露出了奸诈的笑容,嘻嘻嘻嘻!!你小子,上次有人拿500RMB要我做了你,我没干,今天我就要为了12.5RMB把你做了。

结束掉explorer进程,用OD载入EPEunpackme 910.exe,在OD中忽略“内存反问异常”,F9运行,发生第一次INT3异常,Go,这里我不罗嗦了,我只教你修改代码,具体的自己慢慢去跟踪,第一次异常停下来是修改下面的代码。

711E4142       0F95C0                  SETNE AL ;效俭
711E5FD1       0F95C0                  SETNE AL ;效俭 
711E4081       8B55 F8                 MOV EDX, DWORD PTR [EBP-8]  ;函数处理

修改如下
711E4142       0F94C0                  SETE AL
711E5FD1       0F94C0                  SETE AL
711E4081       8B55 FC                 MOV EDX, DWORD PTR [EBP-4]

711E5AED处的代码(修改程序中的函数调用JMP类):
711E5AED       66:C700 FF25             MOV WORD PTR [EAX], 25FF
711E5AF2       8B55 FC                  MOV EDX, DWORD PTR [EBP-4]
711E5AF5       8950 02                  MOV DWORD PTR [EAX+2], EDX
711E5AF8       8BD0                     MOV EDX, EAX
711E5AFA       8B5D E8                  MOV EBX, DWORD PTR [EBP-18]
711E5AFD       83C3 06                  ADD EBX, 6
711E5B00       8B45 E0                  MOV EAX, DWORD PTR [EBP-20]                                            ; V2200591.711DC6DC
711E5B03       03C0                     ADD EAX, EAX
711E5B05       03D8                     ADD EBX, EAX
711E5B07       8B45 E8                  MOV EAX, DWORD PTR [EBP-18]
711E5B0A       8B00                     MOV EAX, DWORD PTR [EAX]
711E5B0C       0FB70B                   MOVZX ECX, WORD PTR [EBX]
711E5B0F       81E9 00300000            SUB ECX, 3000
711E5B15       03C1                     ADD EAX, ECX
711E5B17       0345 DC                  ADD EAX, DWORD PTR [EBP-24]
711E5B1A       48                       DEC EAX
711E5B1B       2BD0                     SUB EDX, EAX
711E5B1D       83EA 04                  SUB EDX, 4
711E5B20       8910                     MOV DWORD PTR [EAX], EDX

修改如下:
711E5AED       8B5D E8                  MOV EBX, DWORD PTR [EBP-18]
711E5AF0       83C3 06                  ADD EBX, 6
711E5AF3       8B45 E0                  MOV EAX, DWORD PTR [EBP-20]                                          
711E5AF6       03C0                     ADD EAX, EAX
711E5AF8       03D8                     ADD EBX, EAX
711E5AFA       8B45 E8                  MOV EAX, DWORD PTR [EBP-18]
711E5AFD       8B00                     MOV EAX, DWORD PTR [EAX]
711E5AFF       0FB70B                   MOVZX ECX, WORD PTR [EBX]
711E5B02       81E9 00300000            SUB ECX, 3000
711E5B08       03C1                     ADD EAX, ECX
711E5B0A       0345 DC                  ADD EAX, DWORD PTR [EBP-24]
711E5B0D       83E8 02                  SUB EAX, 2
711E5B10       66:C700 FF25             MOV WORD PTR [EAX], 25FF
711E5B15       8B55 FC                  MOV EDX, DWORD PTR [EBP-4]
711E5B18       8950 02                  MOV DWORD PTR [EAX+2], EDX
711E5B1B       90                       NOP
711E5B1C       90                       NOP
711E5B1D       90                       NOP
711E5B1E       90                       NOP
711E5B1F       90                       NOP
711E5B20       90                       NOP
711E5B21       90                       NOP


十六进制代码为:
8B 5D E8 83 C3 06 8B 45 E0 03 C0 03 D8 8B 45 E8 8B 00 0F B7 0B 81 E9 00 30 00 00 03 C1 03 45 DC
83 E8 02 66 C7 00 FF 25 8B 55 FC 89 50 02 90 90 90 90 90 90 90


711E5B2C处的代码(修改程序中的函数调用JMP类和CALL):
711E5B2C       66:C700 FF25             MOV WORD PTR [EAX], 25FF
711E5B31       8B55 FC                  MOV EDX, DWORD PTR [EBP-4]
711E5B34       8950 02                  MOV DWORD PTR [EAX+2], EDX
711E5B37       8BD0                     MOV EDX, EAX
711E5B39       8B5D E8                  MOV EBX, DWORD PTR [EBP-18]
711E5B3C       83C3 06                  ADD EBX, 6
711E5B3F       8B45 E0                  MOV EAX, DWORD PTR [EBP-20]                                            ; V2200591.711DC6DC
711E5B42       03C0                     ADD EAX, EAX
711E5B44       03D8                     ADD EBX, EAX
711E5B46       8B45 E8                  MOV EAX, DWORD PTR [EBP-18]
711E5B49       8B00                     MOV EAX, DWORD PTR [EAX]
711E5B4B       0FB70B                   MOVZX ECX, WORD PTR [EBX]
711E5B4E       81E9 00300000            SUB ECX, 3000
711E5B54       03C1                     ADD EAX, ECX
711E5B56       0345 DC                  ADD EAX, DWORD PTR [EBP-24]
711E5B59       2BD0                     SUB EDX, EAX
711E5B5B       83EA 04                  SUB EDX, 4
711E5B5E       8910                     MOV DWORD PTR [EAX], EDX

修改为:
711E5B2C       90                       NOP
711E5B2D       90                       NOP
711E5B2E       90                       NOP
711E5B2F       90                       NOP
711E5B30       90                       NOP
711E5B31       90                       NOP
711E5B32       90                       NOP
711E5B33       90                       NOP
711E5B34       90                       NOP
711E5B35       90                       NOP
711E5B36       90                       NOP
711E5B37       90                       NOP
711E5B38       90                       NOP
711E5B39       8B5D E8                  MOV EBX, DWORD PTR [EBP-18]
711E5B3C       83C3 06                  ADD EBX, 6
711E5B3F       8B45 E0                  MOV EAX, DWORD PTR [EBP-20]                                            ; V2200591.711DC6DC
711E5B42       03C0                     ADD EAX, EAX
711E5B44       03D8                     ADD EBX, EAX
711E5B46       8B45 E8                  MOV EAX, DWORD PTR [EBP-18]
711E5B49       8B00                     MOV EAX, DWORD PTR [EAX]
711E5B4B       0FB70B                   MOVZX ECX, WORD PTR [EBX]
711E5B4E       81E9 00300000            SUB ECX, 3000
711E5B54       03C1                     ADD EAX, ECX
711E5B56       0345 DC                  ADD EAX, DWORD PTR [EBP-24]
711E5B59     - E9 B0C4288F              JMP EPEunpac.0047200E              ;代码空间不足,所以我找到程序入口点下面的地址0047200E来写入代码
711E5B5E       90                       NOP
711E5B5F       90                       NOP

十六进制代码为:
90 90 90 90 90 90 90 90 90 90 90 90 90 8B 5D E8 83 C3 06 8B 45 E0 03 C0 03 D8 8B 45 E8 8B 00 0F
B7 0B 81 E9 00 30 00 00 03 C1 03 45 DC E9 B0 C4 28 8F 90 90


0047200E处写入补丁代码:
0047200E       8078 FF E8               CMP BYTE PTR [EAX-1], 0E8
00472012       75 10                    JNZ SHORT EPEunpac.00472024
00472014       83E8 02                  SUB EAX, 2
00472017       66:C700 FF15             MOV WORD PTR [EAX], 15FF
0047201C       8B55 FC                  MOV EDX, DWORD PTR [EBP-4]
0047201F       8950 02                  MOV DWORD PTR [EAX+2], EDX
00472022       EB 0E                    JMP SHORT EPEunpac.00472032
00472024       83E8 02                  SUB EAX, 2
00472027       66:C700 FF25             MOV WORD PTR [EAX], 25FF
0047202C       8B55 FC                  MOV EDX, DWORD PTR [EBP-4]
0047202F       8950 02                  MOV DWORD PTR [EAX+2], EDX
00472032     - E9 273BD770              JMP V2200591.711E5B5E          ;跳回到711E5B5E执行。


十六进制代码:
80 78 FF E8 75 10 83 E8 02 66 C7 00 FF 15 8B 55 FC 89 50 02 EB 0E 83 E8 02 66 C7 00 FF 25 8B 55
FC 89 50 02 E9 27 3B D7 70



OK修改完毕,Shift+F9忽略异常,在最后一次异常是程序修改EIP到OEP,这里我算了一下,我这里是十六次异常。


0012FF98   0012FFE0  Pointer to next SEH record
0012FF9C   711DADBD  SE handler



711DADBD       53                       PUSH EBX                                                        
711DADBE       52                       PUSH EDX                                                        
711DADBF       8B5C24 14                MOV EBX, DWORD PTR [ESP+14]
711DADC3       8B93 C4000000            MOV EDX, DWORD PTR [EBX+C4]
711DADC9       8B83 C0000000            MOV EAX, DWORD PTR [EBX+C0]
711DADCF       A3 F4162071              MOV DWORD PTR [712016F4], EAX
711DADD4       E8 DF060000              CALL V2200591.711DB4B8
711DADD9       9C                       PUSHFD
711DADDA       58                       POP EAX                                                               
711DADDB       A3 F4162071              MOV DWORD PTR [712016F4], EAX
711DADE0       E8 D3060000              CALL V2200591.711DB4B8
711DADE5       8B83 B8000000            MOV EAX, DWORD PTR [EBX+B8]
711DADEB       40                       INC EAX
711DADEC       8983 B8000000            MOV DWORD PTR [EBX+B8], EAX
711DADF2       8B4424 0C                MOV EAX, DWORD PTR [ESP+C]
711DADF6       8B00                     MOV EAX, DWORD PTR [EAX]
711DADF8       3D 03000080              CMP EAX, 80000003
711DADFD       75 71                    JNZ SHORT V2200591.711DAE70
711DADFF       803D 21172071 01         CMP BYTE PTR [71201721], 1
711DAE06       74 4F                    JE SHORT V2200591.711DAE57
711DAE08       8B42 0C                  MOV EAX, DWORD PTR [EDX+C]
711DAE0B       8983 9C000000            MOV DWORD PTR [EBX+9C], EAX
711DAE11       8B42 10                  MOV EAX, DWORD PTR [EDX+10]
711DAE14       8983 A0000000            MOV DWORD PTR [EBX+A0], EAX
711DAE1A       8B42 14                  MOV EAX, DWORD PTR [EDX+14]
711DAE1D       8983 B4000000            MOV DWORD PTR [EBX+B4], EAX
711DAE23       8B42 1C                  MOV EAX, DWORD PTR [EDX+1C]
711DAE26       8983 A4000000            MOV DWORD PTR [EBX+A4], EAX
711DAE2C       8B42 20                  MOV EAX, DWORD PTR [EDX+20]
711DAE2F       8983 A8000000            MOV DWORD PTR [EBX+A8], EAX
711DAE35       8B42 24                  MOV EAX, DWORD PTR [EDX+24]
711DAE38       8983 AC000000            MOV DWORD PTR [EBX+AC], EAX
711DAE3E       8B42 28                  MOV EAX, DWORD PTR [EDX+28]
711DAE41       8983 B0000000            MOV DWORD PTR [EBX+B0], EAX                   ;最后一次异常时EAX的就是OEP了。
711DAE47       8B02                     MOV EAX, DWORD PTR [EDX]
711DAE49       8942 24                  MOV DWORD PTR [EDX+24], EAX
711DAE4C       89D0                     MOV EAX, EDX                                                         
711DAE4E       83C0 24                  ADD EAX, 24
711DAE51       8983 C4000000            MOV DWORD PTR [EBX+C4], EAX
711DAE57       31C0                     XOR EAX, EAX
711DAE59       8943 04                  MOV DWORD PTR [EBX+4], EAX
711DAE5C       8943 08                  MOV DWORD PTR [EBX+8], EAX
711DAE5F       8943 0C                  MOV DWORD PTR [EBX+C], EAX
711DAE62       8943 10                  MOV DWORD PTR [EBX+10], EAX
711DAE65       C743 18 55010000         MOV DWORD PTR [EBX+18], 155
711DAE6C       5A                       POP EDX                                                                
711DAE6D       5B                       POP EBX                                                            
711DAE6E       C3                       RETN


找到OEP后,在OEP下断点,F9中断在OEP处,Dump,用IMPREC修复输入表,搞定,忙着,好像不能跨平台,kao~最近怎么脱壳都有问题,不知道是我的RPWT还是我的机子的JPWT还是我的XP的XPWT,哎,算了,还是回家吧。

注:ImpRec可能看不到EPE的进程,因为EPE修改了ZwOpenProcess处的代码,临时的办法就是所以用OD载入ImpRec,把ZwOpenProcess入口处被修改的代码改回去,这样在ImpRec就可以看到进程了。


PS:其实跟以前得s版差不多。。