首页
社区
课程
招聘
forgot的unpackme 1.7xxx的脱壳(灌水)
发表于: 2005-3-7 16:45 7677

forgot的unpackme 1.7xxx的脱壳(灌水)

2005-3-7 16:45
7677

forgot的unpackme 1.7xxx的脱壳(灌水)

     日期:2005年3月7日   脱壳人:csjwaman[DFCG]
―――――――――――――――――――――――――――――――――――

――――――――

【软件名称】:forgot的unpackme 1.7xxx
【下载地址】:见附件。
【脱壳声明】:初学Crack,只是感兴趣,没有其它目的。失误之处敬请诸位大侠

赐教!
【操作系统】:win2k
【脱壳工具】:OD等传统工具

―――――――――――――――――――――――――――――――――――

――――――――
 
【脱壳过程】:

看了simonzh2000的脱文感觉太复杂。菜如我者还是找个简单点办法吧:)当然如果要深入理解还是请看simonzh2000的脱文。

forgot的unpackme 1.7xxx 和unpackme 1.7的变化,我感觉只是加了代码修改检

测和内在断点检测。当时由于没注意,死FORGOT让我重启了机子。后来注意了这

两个检测,就通过了。但脱壳的文件还是不能运行!原来是我把被偷的代码看错了,把40F034看成了40F304!!!难怪无法正常运行,还好FLY兄弟指出。在此谢谢了。下面请看过程。现在还发这个可能有灌水之嫌噢:)

第一步,找d-process处:

用OD载入程序,忽略所有异常,bp WriteProcessMemory,F9运行程序,断下:

77E878F8 >  55              PUSH EBP////断下。
77E878F9    8BEC            MOV EBP,ESP
77E878FB    51              PUSH ECX
77E878FC    51              PUSH ECX
77E878FD    8B45 0C         MOV EAX,DWORD PTR SS:[EBP+C]
77E87900    53              PUSH EBX
77E87901    8945 F8         MOV DWORD PTR SS:[EBP-8],EAX
77E87904    56              PUSH ESI
77E87905    8B5D 14         MOV EBX,DWORD PTR SS:[EBP+14]
77E87908    8D45 14         LEA EAX,DWORD PTR SS:[EBP+14]

观察堆栈数据:

003271E4   0032B337  /CALL 到 WriteProcessMemory 来自 0032B332
003271E8   00000028  |hProcess = 00000028
003271EC   0032CA44  |Address = 32CA44////重要!记下备用。
003271F0   0032C3B3  |Buffer = 0032C3B3
003271F4   0000029A  |BytesToWrite = 29A (666.)////重要!记下备用。
003271F8   00000000  \pBytesWritten = NULL

好,F9直接运行程序,等出现界面时,运行LordPE选中映像文件小的那个进程,

然后部分DUMP,把从32CA44处开始大小为29A的数据DUMP下来,命名为32CA44.bin。

第二步,变双进程为单进程:

重新载入程序,bp CreateProcessA,运行程序,断下:

77E84FA8 >  55              PUSH EBP////断在这儿。
77E84FA9    8BEC            MOV EBP,ESP
77E84FAB    FF75 2C         PUSH DWORD PTR SS:[EBP+2C]
77E84FAE    FF75 28         PUSH DWORD PTR SS:[EBP+28]
77E84FB1    FF75 24         PUSH DWORD PTR SS:[EBP+24]
77E84FB4    FF75 20         PUSH DWORD PTR SS:[EBP+20]
77E84FB7    FF75 1C         PUSH DWORD PTR SS:[EBP+1C]
77E84FBA    FF75 18         PUSH DWORD PTR SS:[EBP+18]

观察堆栈数据:

003271D0   0032A21A  /CALL 到 CreateProcessA 来自 0032A215
003271D4   00328F87  |ModuleFileName =

"d:\我的文档\aman\crack\17x\17x.exe"
003271D8   0032A20B  |CommandLine = "X"////调试标志。
003271DC   00000000  |pProcessSecurity = NULL
003271E0   00000000  |pThreadSecurity = NULL
003271E4   00000000  |InheritHandles = FALSE
003271E8   00000003  |CreationFlags =

DEBUG_PROCESS|DEBUG_ONLY_THIS_PROCESS
003271EC   00000000  |pEnvironment = NULL
003271F0   00000000  |CurrentDir = NULL
003271F4   0032755C  |pStartupInfo = 0032755C
003271F8   0032754C  \pProcessInfo = 0032754C

重新载入程序,bp GetCommandLineA,运行程序,断下:

77E86DF3 >  A1 4CB3EB77     MOV EAX,DWORD PTR DS:[77EBB34C]////断在这里。取消断点。
77E86DF8    C3              RETN

返回到:

0032836A    68 9F6F56B6     PUSH B6566F9F////返回到这里。
0032836F    50              PUSH EAX
00328370    E8 5D000000     CALL 003283D2
00328375    EB FF           JMP SHORT 00328376
00328377    71 78           JNO SHORT 003283F1
00328379    C2 5000         RETN 50

搜索二进制字符“803e58”,找到:

00328602    FF70 ED         PUSH DWORD PTR DS:[EAX-13]
00328605  ^ 71 EB           JNO SHORT 003285F2
00328607  ^ EB FA           JMP SHORT 00328603
00328609  ^ EB 80           JMP SHORT 0032858B/////找到这里。这里有个花指令。
0032860B    3E:58           POP EAX  
0032860D    0F84 8A410000   JE 0032C79D
00328613    68 9F6F56B6     PUSH B6566F9F
00328618    50              PUSH EAX

NOP掉花指令后:

00328609    90              NOP////弄清楚了后就恢复代码,“有病治病,无病防病”,省得后面有代码完整性检测的麻烦:)
0032860A    803E 58         CMP BYTE PTR DS:[ESI],58////58为调试标志。

用于判断是否为子进程。
0032860D    0F84 8A410000   JE 0032C79D////此处改Z标志位让跳!可以变为单进程。
00328613    68 9F6F56B6     PUSH B6566F9F
00328618    50              PUSH EAX

第三步,修补程序:

修改上面这个跳转后,用十六进制工具把32CA44.bin的数据复盖掉OD的DUMP区从0032CA44处开始的29A个字节数据。

第四步,查找入口:

做完上述工作后,在OD的CPU窗口,Ctrl+G,输入0032CA44,点确定后来到:

0032CA3B  ^\71 EB           JNO SHORT 0032CA28
0032CA3D  ^ EB FA           JMP SHORT 0032CA39
0032CA3F  ^ EB F0           JMP SHORT 0032CA31////NOP掉。
0032CA41    0FC7C8          CMPXCHG8B EAX////NOP掉。
0032CA44    FFC3            INC EBX/////来到这里。
0032CA46    FFC8            DEC EAX
0032CA48    F7D8            NEG EAX
0032CA4A    F7C1 2DF16825   TEST ECX,2568F12D
0032CA50    8BD9            MOV EBX,ECX
0032CA52    01CB            ADD EBX,ECX
0032CA54    85CB            TEST EBX,ECX

在0032CA44处F2下断,F9断下后取消断点!这里好象不必恢复刚才NOP掉的代码。

搜索二进制字符“6150C3”,找到:

0032FDF6  ^\71 EB           JNO SHORT 0032FDE3
0032FDF8  ^ EB FA           JMP SHORT 0032FDF4
0032FDFA    EB 50           JMP SHORT 0032FE4C
0032FDFC    8D78 02         LEA EDI,DWORD PTR DS:[EAX+2]
0032FDFF    EB 02           JMP SHORT 0032FE03////在这里F2下断。
0032FE01    61              POPAD////找到这里。
0032FE02    50              PUSH EAX
0032FE03    C3              RETN////返回入口!

在0032FDFF处断下后,EAX=403A3F,这就是入口地址。

00403A3F    FFD7            CALL NEAR EDI ; 17x.00403A41////返回到这里

。入口代码被修改了。
00403A41    58              POP EAX
00403A42    90              NOP
00403A43    90              NOP
00403A44    E8 FD980000     CALL 17x.0040D346
00403A49    85C0            TEST EAX,EAX
00403A4B    74 26           JE SHORT 17x.00403A73
00403A4D    68 00000200     PUSH 20000
00403A52    6A 40           PUSH 40

00403A3F    FFD7            CALL NEAR EDI
00403A41    58              POP EAX
00403A42    90              NOP
00403A43    90              NOP
00403A44    E8 63910000     CALL 1_7.0040CBAC
00403A49    85C0            TEST EAX,EAX
00403A4B    74 26           JE SHORT 1_7.00403A73
00403A4D    68 00000200     PUSH 20000
00403A52    6A 40           PUSH 40
00403A54    E8 2F910000     CALL 1_7.0040CB88
00403A59    A3 C0E14000     MOV DWORD PTR DS:[40E1C0],EAX
00403A5E    68 BCE04000     PUSH 1_7.0040E0BC
00403A63    E8 10000000     CALL 1_7.00403A78

到入口后观察堆栈区:

003275D0   0040F034  17x.0040F034////这就是被偷的代码。
003275D4   004327F9  返回到 17x.004327F9

补回代码后:

00403A3F    68 34F04000     PUSH 17x.0040F034////这才象入口嘛:)
00403A44    E8 FD980000     CALL 17x.0040D346
00403A49    85C0            TEST EAX,EAX
00403A4B    74 26           JE SHORT 17x.00403A73
00403A4D    68 00000200     PUSH 20000
00403A52    6A 40           PUSH 40
00403A54    E8 C9980000     CALL 17x.0040D322
00403A59    A3 20F24000     MOV DWORD PTR DS:[40F220],EAX
00403A5E    68 11F14000     PUSH 17x.0040F111

起初看错了堆栈区数据,把0040F034看成了0040F304。害得我以为脱壳有问题:(

看来脱壳要细心呀!

第五步,查找IAT加密处

到入口后F7跟踪:

00403A3F    68 34F04000     PUSH 17x.0040F034////F7
00403A44    E8 FD980000     CALL 17x.0040D346////F7进入!

进入后:

0040D304    68 6D7EE677     PUSH kErNeL32.CloseHandle
0040D309    C3              RETN
0040D30A    68 ABC1E777     PUSH kErNeL32.CreateFileA
0040D30F    C3              RETN
0040D310    68 7269E877     PUSH kErNeL32.ExitProcess
0040D315    C3              RETN
0040D316    68 926BE777     PUSH kErNeL32.GetFileSize
0040D31B    C3              RETN
0040D31C    68 D4EDE677     PUSH kErNeL32.GetTickCount
0040D321    C3              RETN
0040D322    68 7DDBE777     PUSH kErNeL32.GlobalAlloc
0040D327    C3              RETN
0040D328    68 E7E4E777     PUSH kErNeL32.GlobalFree
0040D32D    C3              RETN
0040D32E    68 6861E777     PUSH kErNeL32.ReadFile
0040D333    C3              RETN
0040D334    68 4265E777     PUSH kErNeL32.SetFilePointer
0040D339    C3              RETN
0040D33A    68 5063E777     PUSH kErNeL32.WriteFile
0040D33F    C3              RETN
0040D340    68 8733E177     PUSH user32.MessageBoxA
0040D345    C3              RETN
0040D346    68 869DAF76     PUSH comdlg32.GetOpenFileNameA////到这里。
0040D34B    C3              RETN

跳转表都被改成 PUSH XXXXXXXX 然后 RETN 的形式了!看开始处是0040D304。

好,重新载入程序,按上述方法到第四步后,在0040D304处下硬件访问断点(不能下内在访问断点了!否则。。。),然后F9运行程序,断下几次后会来到:

0032F969    03BD FFD24000   ADD EDI,DWORD PTR SS:[EBP+40D2FF]
0032F96F    81C7 00100000   ADD EDI,1000
0032F975    66:8139 FF25    CMP WORD PTR DS:[ECX],25FF
0032F97A    74 02           JE SHORT 0032F97E////会断在这里。这里开始处理IAT跳转表。改为JMP 32F9BB后F8。
0032F97C    EB 05           JMP SHORT 0032F983
0032F97E    3941 02         CMP DWORD PTR DS:[ECX+2],EAX
0032F981    72 07           JB SHORT 0032F98A
0032F983    41              INC ECX
0032F984    3BCF            CMP ECX,EDI
0032F986  ^ 72 ED           JB SHORT 0032F975
0032F988    EB 27           JMP SHORT 0032F9B1
0032F98A    8B59 02         MOV EBX,DWORD PTR DS:[ECX+2]
0032F98D    8B1B            MOV EBX,DWORD PTR DS:[EBX]
0032F98F    C601 68         MOV BYTE PTR DS:[ECX],68////IAT跳转改为PUSH xxxxxxxx,然后再RETN的形式。
0032F992    8959 01         MOV DWORD PTR DS:[ECX+1],EBX
0032F995    C641 05 C3      MOV BYTE PTR DS:[ECX+5],0C3////RETN
0032F999    83C1 06         ADD ECX,6
0032F99C    66:8139 FF25    CMP WORD PTR DS:[ECX],25FF
0032F9A1    75 04           JNZ SHORT 0032F9A7
0032F9A3    3BCF            CMP ECX,EDI
0032F9A5  ^ 72 CE           JB SHORT 0032F975
0032F9A7    83C1 02         ADD ECX,2
0032F9AA    66:8139 FF25    CMP WORD PTR DS:[ECX],25FF
0032F9AF  ^ 74 D9           JE SHORT 0032F98A
0032F9B1    83C1 24         ADD ECX,24
0032F9B4    66:8139 FF25    CMP WORD PTR DS:[ECX],25FF
0032F9B9  ^ 74 CF           JE SHORT 0032F98A
0032F9BB    61              POPAD////到这里后恢复刚才修改的代码。
0032F9BC    E8 0A84FFFF     CALL 00327DCB
0032F9C1    68 9F6F56B6     PUSH B6566F9F
0032F9C6    50              PUSH EAX
0032F9C7    E8 5D000000     CALL 0032FA29

把0032F97A处直接修改为JMP 32F9BB 就可以得到完整的IAT跳转表了。

到入口后就可以用PETOOLS来DUMP了(因为用LORDPE不行!),再用ImportRECv142+修复IAT, OK完工!附件:Dumped_.rar


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 7
支持
分享
最新回复 (6)
雪    币: 319
活跃值: (2459)
能力值: ( LV12,RANK:980 )
在线值:
发帖
回帖
粉丝
2
这个“精”受之有愧噢!
2005-3-7 17:12
0
雪    币: 258
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
3
弓,,,,,,
小f的壳又蹂躏了,,,,,
2005-3-7 17:57
0
雪    币: 161
活跃值: (231)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
厉害,厉害
2005-3-7 18:00
0
雪    币: 61
活跃值: (160)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
5
收下先!!!
2005-3-7 19:26
0
雪    币: 301
活跃值: (300)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
6
学习,支持一下
2005-3-7 21:58
0
雪    币: 303
活跃值: (476)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
请教Arm-CopyMem-ll是用什么方法创建子进程的,为什么
BP CreateProcessA 拦截不到
多谢
2005-3-9 20:12
0
游客
登录 | 注册 方可回帖
返回
//