能力值:
( LV9,RANK:3410 )
|
-
-
2 楼
手动脱壳
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
我手动脱壳后该怎么修复?用哪些工具呢?
|
能力值:
( LV2,RANK:10 )
|
-
-
4 楼
哪位能帮帮我?多谢!
|
能力值:
(RANK:10 )
|
-
-
5 楼
用这个修复ImportREC
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
在网上看到许多关于fsg2.0的手动脱壳方法,如SFX,硬件访问断点等,但是这些教程只讲了一半,没有讲在脱壳后不能运行的情况下如何修复输入表,今天我就借一个小程序(crackme1.exe)说明一下。高手就不用看啦!!!
首先用OD载入crackme.exe,看到如下代码:
00400154 C> 8725 1C7E4000 xchg dword ptr ds:[407E1C],esp
0040015A 61 popad
0040015B 94 xchg eax,esp
0040015C 55 push ebp
0040015D A4 movs byte ptr es:[edi],byte ptr ds:[esi]
两下f8看堆栈:
00407E28 004001DE Crackme1.004001DE
00407E2C 00401000 Crackme1.00401000
00407E30 > 7C801D77 kernel32.LoadLibraryA
00407E34 > 7C80AC28 kernel32.GetProcAddress
然后在00407E2C 00401000 Crackme1.00401000处点右键选在反汇编窗口中跟随,这样我们就来到了这里:
00401000 . 0000 add byte ptr ds:[eax],al ; /pModule
00401002 . 0000 add byte ptr ds:[eax],al ; \GetModuleHandleA
00401004 ? 0000 add byte ptr ds:[eax],al
00401006 ? 0000 add byte ptr ds:[eax],al
然后按一下F4就可以看到如下代码:
00401000 . 6A 00 push 0 ; /pModule = NULL
00401002 . E8 42020000 call Crackme1.00401249 ; \GetModuleHandleA
00401007 . A3 10244000 mov dword ptr ds:[402410],eax
0040100C . 6A 00 push 0 ; /lParam = NULL
到这就可以先脱壳了,入口地址点被修改为1000,脱壳后得到unpack.exe。但是双击不能运行,下面我们开始修复输入表,先看这一句:
00401002 . E8 42020000 call Crackme1.00401249 ; \GetModuleHandleA
这一句可以简单的理解为读取输入表,那好我们来这00401249,看到以下代码:
00401219 $- FF25 6C304000 jmp dword ptr ds:[40306C] ; USER32.wsprintfA
0040121F $- FF25 70304000 jmp dword ptr ds:[403070] ; USER32.DialogBoxParamA
00401225 $- FF25 74304000 jmp dword ptr ds:[403074] ; USER32.EndDialog
0040122B $- FF25 78304000 jmp dword ptr ds:[403078] ; USER32.GetDlgItemTextA
00401231 $- FF25 7C304000 jmp dword ptr ds:[40307C] ; USER32.LoadIconA
00401237 $- FF25 80304000 jmp dword ptr ds:[403080] ; USER32.MessageBoxA
0040123D $- FF25 84304000 jmp dword ptr ds:[403084] ; USER32.SendMessageA
00401243 $- FF25 88304000 jmp dword ptr ds:[403088] ; USER32.SetDlgItemTextA
00401249 $- FF25 90304000jmp dword ptr ds:[403090] ; kernel32.GetModuleHandleA
0040124F FF25 94304000 jmp dword ptr ds:[403094] ; kernel32.ExitProcess
到了这一步我们就成功80%了,我们直接来到第一句所跳转的地址40306c,哈哈看到关键啦:
0040306B 00 db 00
0040306C . ADA8D177 dd USER32.wsprintfA
00403070 . 1CB1D377 dd USER32.DialogBoxParamA
00403074 . 5062D277 dd USER32.EndDialog
00403078 . 1EACD677 dd USER32.GetDlgItemTextA
0040307C . 2413D277 dd USER32.LoadIconA
00403080 . EA04D577 dd USER32.MessageBoxA
00403084 . 9AF3D277 dd USER32.SendMessageA
00403088 . 4AC9D377 dd USER32.SetDlgItemTextA
0040308C FF db FF
0040308D FF db FF
0040308E FF db FF
0040308F 7F db 7F
00403090 . 29B5807C dd kernel32.GetModuleHandleA
00403094 . A2CA817C dd kernel32.ExitProcess
00403098 FF db FF
这就是我们想要的!!!!RVA=306c 大小为3098-306c=2c
现在我们可以先关掉OD啦,先休息一下!!!
现在我们运行crackme1.exe(不是unpack.exe),然后打开ImportREC1.6,选中crackme1.exe,在下面的OEP窗口中输入1000,点自动获取IAT,可以看到RVA为00003090,大小为00000004,这两个值都是错误的,我们要手动填入我们刚才得到的那两个值RAV=306c 大小为3098-306c=2c。然后点击获得输入表,可以看到上面的窗口中出现了有效:NO。我们点击显示无效的,就可以看到一个看到一个无效的指针,直接剪切掉(不是删除)!!!!哈哈,看到了吧,所有指针都有效啦。现在可以点击修复DUMP,选中我们刚才脱出来的unpack.exe就可以了。让我们试一下新生成的unpack_.exe吧。一切正常,收工,回家。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
楼上的能把crackme1.exe传上来吗,学习一下~~
|
能力值:
( LV2,RANK:10 )
|
-
-
8 楼
多谢liuruixin,感谢各位的支持!~
|
|
|