大家可以先试试脱 PELock 1.06 加壳的 notepad 档及unpackme!(下载附件)
我用Ollydbg 跟到OEP只要 10秒,但Dump下来的档案却有一大堆指针无法修?,
即使用手动修?指针,却没法Fix dump 下来的档案,真怪!!!
另外,之前Fly大大有脱过 PELock 1.06 加壳的unpackme ,这个东西就简单多了, 我用Ollydbg 脱,只要30秒就搞定(用Ollydump无需修复指针就可运行),怎会差这麽多???
我把Fly大大的文章贴在下面,也给大家参考!
模拟跟踪 之 PELock 1.06脱壳――fly杀手unpackme
相关页面:
http://tongtian.net/pediybbs/viewtopic.php?p=11089#
软件大小: 17.35 KB
【加壳方式】:PELock 1.0x -> Bartosz Wojcik 加壳的小东东。
【作者声明】:初学Crack,只是感兴趣,没有″他目的。失误之处敬请诸位大侠赐教!
【调试环境】:WinXP、Ollydbg1.09、PEiD、LordPE、ImportREC
―――――――――――――――――――――――――――――――――
【脱壳过程】:
goodmorning 说:“fly杀手unpackme 专门对付fly,嘿嘿。 ” 晕倒 抽点时间看了一下。反跟踪、花指令、SEH、单步陷阱…… 也算是一个猛壳啦。 因为这只是一个简单的unpackme,有些PELock的效果没有发挥出来,比如这里没能用上Stolen Code、输入表也只有简单的几个函数,所以被偶凑巧搞定了 有兴趣的兄弟可以直接试试pelock.exe主程序,呵呵,偶还没搞定pelock.exe主程序。
――――――――――――――――――――――――
一、运用 模拟跟踪 走到OEP
设置Ollydbg忽略除了“内存访问异常”之外的所有″他异常选项。用Ollydbg手动脱壳,老规矩:用IsDebug 1.4插件去掉Ollydbg的调试器标志。载入后弹出“是压缩代码――要继续进行分析吗?”,点“否”
00405150 F3: prefix rep: //进入OD后停在这!
F9运行,弹出Demo版PELock保护的提示,确定后返回。
00371AD1 8900 mov dword ptr ds:[eax],eax//第1次异常
00371C7E 8900 mov dword ptr ds:[eax],eax//第2次异常
00371E1B 8900 mov dword ptr ds:[eax],eax//第3次异常
00372C8F 8912 mov dword ptr ds:[edx],edx//第4次异常
00372E27 891B mov dword ptr ds:[ebx],ebx//第5次异常
00372EC2 8909 mov dword ptr ds:[ecx],ecx//第6次异常
00374986 8900 mov dword ptr ds:[eax],eax//第7次异常
Shift+F9通过7次异常,再来一次就运行啦,停!看看堆栈:
0012FFB0 0012FFB8 指针到下一个 SEH 记录
0012FFB4 003746D4 SE 句柄 //当然是此处下断啦
在003746D4处下断,Shift+F9断在003746D4处。OK,当然可以F7一步步单步走啦,但是很慢
003746D4 E8 01000000 call 003746DA//此处偶开始 模拟跟踪!
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
关于 模拟跟踪,建议先看看[FCG]的 菩提 兄翻译的《ollydbg的教学-Run trace》,在《看雪论坛精华五》里。
现在让偶们复习如下几个命令,偶这次用到的就是 TC 命令。
TI :跟踪进入直到地址
TO :跟踪步过直到地址
TC :跟踪进入直到满足条件 //脱壳一般使用这个命令较多
TOC:跟踪步过直到满足条件
TR :运行直到返回
TU :运行直到用户代码
☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
当偶们来到003746D4处时下命令:TC EIP>00400000
很快的,程序由于进入系统DLL,地址大于00400000而暂停!
77F833A0 64:8B25 00000000 mov esp,dword ptr fs:[0]//停在这里!
77F833A7 64:8F05 00000000 pop dword ptr fs:[0]
77F833AE 8BE5 mov esp,ebp
77F833B0 5D pop ebp
77F833B1 C2 1400 retn 14
如果直接Ctrl+F9执行到返回的话,程序就运行了,所以偶只好想点办法。
点击 查看->运行跟踪,在最下面就会发现是003748DB处进入系统DLL
003748DB C3 retn //这里返回入系统DLL
所以偶在下面的许多JMP处下断,F9运行,断在00374988处。呵呵,运气不错啦
003748DC EB 02 jmp short 003748E0
003748DE 0FC8 bswap eax
003748E0 EB 02 jmp short 003748E4
003748E2 CD 0A int 0A
003748E4 78 03 js short 003748E9
003748E6 79 01 jns short 003748E9
003748E8 92 xchg eax,edx
003748E9 74 03 je short 003748EE
003748EB 75 01 jnz short 003748EE
003748ED D7 xlat byte ptr ds:[ebx+al]
003748EE EB 02 jmp short 003748F2
003748F0 CD20 EB034CAF vxdcall AF4C03EB
003748F6 B7 EB mov bh,0EB
003748F8 034D 6F add ecx,dword ptr ss:[ebp+6F]
003748FB 68 2BC0EB03 push 3EBC02B
00374900 D5 A4 aad 0A4
00374902 12E8 adc ch,al
00374904 0100 add dword ptr ds:[eax],eax
00374906 0000 add byte ptr ds:[eax],al
00374908 04 8F add al,8F
0037490A 44 inc esp
0037490B 24 FC and al,0FC
0037490D EB 02 jmp short 00374911
0037490F 0F11EB movups xmm3,xmm5
00374912 02CD add cl,ch
00374914 2076 03 and byte ptr ds:[esi+3],dh
00374917 77 01 ja short 0037491A
00374919 F8 clc
0037491A EB 03 jmp short 0037491F
0037491C 57 push edi
0037491D F8 clc
0037491E 48 dec eax
0037491F EB 03 jmp short 00374924
00374921 BF C41FE801 mov edi,1E81FC4
00374926 0000 add byte ptr ds:[eax],al
00374928 00FD add ch,bh
0037492A 8D6424 04 lea esp,dword ptr ss:[esp+4]
0037492E 64:FF30 push dword ptr fs:[eax]
00374931 76 03 jbe short 00374936
00374933 77 01 ja short 00374936
00374935 CC int3
00374936 7E 03 jle short 0037493B
00374938 7F 01 jg short 0037493B
0037493A AB stos dword ptr es:[edi]
0037493B EB 02 jmp short 0037493F
0037493D 74 8E je short 003748CD
0037493F EB 02 jmp short 00374943
00374941 0F12E8 movhlps xmm5,xmm0
00374944 0100 add dword ptr ds:[eax],eax
00374946 0000 add byte ptr ds:[eax],al
00374948 05 8F4424FC add eax,FC24448F
0037494D C1F5 00 sal ebp,0
00374950 78 03 js short 00374955
00374952 79 01 jns short 00374955
00374954 CC int3
00374955 64:8920 mov dword ptr fs:[eax],esp
00374958 EB 02 jmp short 0037495C
0037495A 30DE xor dh,bl
0037495C E8 01000000 call 00374962
00374961 0F8F 4424FCEB jg EC336DAB
00374967 020F add cl,byte ptr ds:[edi]
00374969 3D EB027E75 cmp eax,757E02EB
0037496E 78 03 js short 00374973
00374970 79 01 jns short 00374973
00374972 2AEB sub ch,bl
00374974 031C03 add ebx,dword ptr ds:[ebx+eax]
00374977 6BEB 02 imul ebp,ebx,2
0037497A 0F0F ???
0037497C E8 01000000 call 00374982
00374981 3F aas
00374982 8F4424 FC pop dword ptr ss:[esp-4]
00374986 8900 mov dword ptr ds:[eax],eax
00374988 EB 03 jmp short 0037498D //断在这里
OK,偶继续模拟跟踪啦。取消所有断点,下命令:TC EIP>00400000 几秒钟后Ollydbg自动暂停在OEP处!
查看运行跟踪,发现是从下面的地方跳到OEP的
00374C7A 68 00104000 push 401000 //下面返回的地址
00374C7F EB 01 jmp short 00374C82
00374C81 65:EB 02 jmp short 00374C86
00374C84 CD20 EB027853 vxdcall 537802EB
00374C8A EB 02 jmp short 00374C8E
00374C8C 0FCB bswap ebx
00374C8E EB 02 jmp short 00374C92
00374C90 65:79 C1 jns short 00374C54
00374C93 F600 EB test byte ptr ds:[eax],0EB
00374C96 010F add dword ptr ds:[edi],ecx
00374C98 EB 01 jmp short 00374C9B
00374C9A 65:C1F0 00 sal eax,0
00374C9E C1F0 00 sal eax,0
00374CA1 C3 retn //飞向光明之巅!返回至00401000
BTW:选择适当的时机和条件使用 ★模拟跟踪★ 会节省很多单步跟踪的时间!!
――――――――――――――――――――――――
00401000 E8 7D010000 call unpackme.00401182//在这儿用OllyDump插件直接DUMP
00401005 8BF8 mov edi,eax
00401007 50 push eax
―――――――――――――――――――――――――――――――――
二、修复输入表以及优化脱壳后的程序
运行ImportREC,选择这个进程。把OEP改为00001000,点IT AutoSearch,点“Get Import”,用“追踪层次1”修复,只有一个函数没有识别出来:
0 00002008 ? 0000 00BB0029
正好接着跟踪原程序,在402008处下内存访问断点,退出时断下!
0040117C FF25 08204000 jmp dword ptr ds:[402008]//进入
77E55CA2 FFD6 call esi ; ntdll.ZwTerminateProcess//来到这里退出
发现来到77E55CA2处,所以这个函数应该是kernel32.ExitProcess啦,修正之,运行正常!
简单优化:用LordPE删除.pelock和.newIID区段,然后重建PE。20K->7.78K
―――――――――――――――――――――――――――――――――
, _/
/| _.-~/ \_ , 青春都一饷
( /~ / \~-._ |\
`\\ _/ \ ~\ ) 忍把浮名
_-~~~-.) )__/;;,. \_ //'
/'_,\ --~ \ ~~~- ,;;\___( (.-~~~-. 换了破解轻狂
`~ _( ,_..--\ ( ,;'' / ~-- /._`\
/~~//' /' `~\ ) /--.._, )_ `~
" `~" " `" /~'`\ `\\~~\
" " "~' ""
Cracked By 巢水工作坊――fly [OCN][FCG][NUKE]
2003-12-06 21:25