machenglin 发表于 2006-5-31 01:39:18

用脚本、补区段脱Asprotect SKE 2.x壳笔记

【文章标题】: 用脚本、补区段脱Asprotect SKE 2.x壳笔记
【作    者】: machenglin
【软件名称】: ccproje 5.13
【下载地址】: 自己搜索下载
【加壳方式】: Asprotect SKE 2.x
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
首先感谢[一蓑烟雨]论坛fly兄弟给我们提供了这个学习平台。

Volx大侠的脚本确实是非常成功的,非常感谢他的辛勤劳动,这是我用他的脚本练习过程中的笔记,结合SYSCOM大侠的补区段大法,完成Asprotect SKE 2.x壳的过程,我尽量的记录详细一点,试图使初学脱壳者能理解容易些,请各位大侠不要笑话我罗嗦。


00401000 c>68 01D0DE00      push ccproje.00DED001            ; OD入口处
00401005   E8 01000000      call ccproje.0040100B
0040100A   C3               retn
0040100B   C3               retn
0040100C   2B02               sub eax,dword ptr ds:
0040100E   37               aaa
0040100F   8D77 F6            lea esi,dword ptr ds:
00401012   - E1 E8            loopde short ccproje.00400FFC
-------------------------------------------------------------------------------------------------
Aspr2.XX_IATfixer脚本停在OEP了。

016C039C   E8 5FFC0600      call 01730000                      ; OEP=00040190C
016C03A1   50               push eax
016C03A2   E9 3B060000      jmp 016C09E2
016C03A7   68 85056C01      push 16C0585
016C03AC   E8 4FFC0600      call 01730000
016C03B1   52               push edx
016C03B2   E9 98000000      jmp 016C044F
016C03B7   43               inc ebx
016C03B8   E9 5B010000      jmp 016C0518
016C03BD   F2:                prefix repne:
016C03BE   EB 01            jmp short 016C03C1
016C03C0   F0:83C4 08         lock add esp,8                     ; 不允许锁定前缀

Alt+l,查看硬件断点1位于014FCCB4。
IATstartaddr:00A4115C
IATsize:11F8

OEP=016C039C-400000=012C039C
RVA=00A4115C-400000=0064115C

Volx大侠的脚本已经解决了Asprotect SKE 2.x壳的诸多问题,手动修复stolen code,确实很完美,但本人功底太浅,OEP的前面部分基本还能蒙上,后来就陷在壳里了,还跳不出来,还是等修炼N段时间再尝试吧。

SYSCOM大侠的教程,采用补区段的方法很适合我们菜鸟,用lordpe区域转存,dump出程序中stolen code和VM区段,如果不清楚那些是stolen code和VM区段,一看OEP部分在哪个区段,二看壳用到哪几个区段,不妨多dump些区段备用。

VM Address          Size
===========================================================
014D0000         47000    <-ASProtect 解密 CODE 区段   
01520000         14000    <-ASProtect 资料 DATA 区段
016C0000            2000    <-OEPStolen Code
016D0000            2000    <-M1   Stolen Code
016E0000            2000    <-M1   Stolen Code
016F0000            1000    <-M2   Stolen Code
01700000            1000    <-M2   Stolen Code
01710000            1000    <-M2   Stolen Code
01720000            1000    <-M3   Stolen Code
01730000            1000    <-M3   Stolen Code
01740000            1000    <-M3   Stolen Code   
===========================================================

这里提醒一下,把dump出的区段附加在dumped_后面时,所有VM Address要减去基址,如:
014D0000-400000=10D0000。
把dump出的区段附加完成后,用lordpe修复PE Header。

重新在OD中载入程序,开始处理壳的自校验。

=================================================================================================

===处理壳自校验===

感谢SYSCOM大侠的教程,他是这样描述:
//////////////////////////////////////////////////////////////////////////////////////////////
Route CHECK,算是壳的自我检查,它是由 A,B 两数值,作互减运算。

A=GetCurrentThreadID
B=CALL Route Address

运算后 ...
B=B-A

当你脱壳之后,B=会发生错误 ERROR 111 ,所以我们只要,抓出正确的 CALL Route Address,就可以通过CHECK SUM ,也就是在 ,的 STACK 位址。所以我们使用
MOVEAX, ,来还原 B 值 +5 后修正 B 值 Address

9F70CE-MOVEAX,
9F70D1-CALL EAX            =>GetCurrentThreadID
9FD0D3-SUB,EAX      =>B=B-A
9FD0D6-MOVEAX,   
//////////////////////////////////////////////////////////////////////////////////////////////

014F8A58    /EB 01            jmp short dumped_1.014F8A5B         ; ①↓014F8A5B
014F8A5A    |698B 73308B7B 14A1>imul ecx,dword ptr ds:,37>
014F8A64   50               push eax
014F8A65   018B 4034FFD0      add dword ptr ds:,ecx
014F8A6B   2945 0C            sub dword ptr ss:,eax
014F8A6B   2945 0C            sub dword ptr ss:,eax
014F8A6E   8B45 0C            mov eax,dword ptr ss:
014F8A71   2B43 18            sub eax,dword ptr ds:
014F8A74   2B43 68            sub eax,dword ptr ds:
014F8A77   8945 FC            mov dword ptr ss:,eax
014F8A7A   8D43 24            lea eax,dword ptr ds:
014F8A7D   8945 F8            mov dword ptr ss:,eax
014F8A80   85FF               test edi,edi
014F8A82   76 38            jbe short dumped_1.014F8ABC
014F8A84   EB 01            jmp short dumped_1.014F8A87
014F8A86   C7               ???                                     ; 未知命令
014F8A87   8B45 F8            mov eax,dword ptr ss:
014F8A8A   0FB600             movzx eax,byte ptr ds:
014F8A8D   8B5483 40          mov edx,dword ptr ds:
014F8A91   8BC6               mov eax,esi
014F8A93   FFD2               call edx
014F8A95   3B45 FC            cmp eax,dword ptr ss:
014F8A98   75 1A            jnz short dumped_1.014F8AB4
014F8A9A   8B45 10            mov eax,dword ptr ss:
014F8A9D   50               push eax
014F8A9E   8B45 14            mov eax,dword ptr ss:
014F8AA1   50               push eax
014F8AA2   E8 19FAFFFF      call dumped_1.014F84C0
014F8AA7   50               push eax
014F8AA8   8BCE               mov ecx,esi
014F8AAA   8B55 18            mov edx,dword ptr ss:
014F8AAD   8BC3               mov eax,ebx
014F8AAF   E8 D4FDFFFF      call dumped_1.014F8888
014F8AB4   4F               dec edi
014F8AB5   0373 6C            add esi,dword ptr ds:
014F8AB8   85FF               test edi,edi
014F8ABA   ^ 77 CB            ja short dumped_1.014F8A87
014F8ABC   68 D88A4F01      push dumped_1.014F8AD8                  ; ASCII "111"
014F8AC1   E8 66C3FEFF      call dumped_1.014E4E2C

由014F8A58跳到这里。
014F8A5B   8B73 30            mov esi,dword ptr ds:         ; dumped_1.016C10F9
014F8A5E   8B7B 14            mov edi,dword ptr ds:
014F8A61   A1 F0375001      mov eax,dword ptr ds:
014F8A66   8B40 34            mov eax,dword ptr ds:      ; 从这里开始修改。
014F8A69   FFD0               call eax
014F8A6B   2945 0C            sub dword ptr ss:,eax
014F8A6E   8B45 0C            mov eax,dword ptr ss:
014F8A71   2B43 18            sub eax,dword ptr ds:
014F8A74   2B43 68            sub eax,dword ptr ds:
014F8A77   8945 FC            mov dword ptr ss:,eax

二进制
90 90 8B 44 24 58 83 E8 05 90 90

修改后的代码,保存文件。
014F8A5B   8B73 30            mov esi,dword ptr ds:         ; dumped_1.016C10F9
014F8A5E   8B7B 14            mov edi,dword ptr ds:
014F8A61   A1 F0375001      mov eax,dword ptr ds:
014F8A66   90               nop
014F8A67   90               nop
014F8A68   8B4424 58          mov eax,dword ptr ss:
014F8A6C   83E8 05            sub eax,5
014F8A6F   90               nop
014F8A70   90               nop
014F8A71   2B43 18            sub eax,dword ptr ds:
014F8A74   2B43 68            sub eax,dword ptr ds:
014F8A77   8945 FC            mov dword ptr ss:,eax

F9,开始运行,软件界面一闪后,程序退出了,看来还有自校验。
================================================================================================

===处理文件自校验===

重新加载程序,下断点 BP GetFileSize。

F9大约8次,注意程序返回到本地领空,F8步进。
===================================================================
0012FA50   005BD602   /CALL 到 GetFileSize 来自 dumped_1.005BD5FD
0012FA54   000001B0   |hFile = 000001B0 (window)
0012FA58   00000000   \pFileSizeHigh = NULL
===================================================================
断在这里。
7C810C8F k>8BFF               mov edi,edi
7C810C91   55               push ebp
7C810C92   8BEC               mov ebp,esp
7C810C94   51               push ecx
7C810C95   51               push ecx
7C810C96   8D45 F8            lea eax,dword ptr ss:
7C810C99   50               push eax
7C810C9A   FF75 08            push dword ptr ss:
7C810C9D   E8 7FFFFFFF      call kernel32.GetFileSizeEx
7C810CA2   85C0               test eax,eax
7C810CA4   ^ 0F84 EA8FFFFF      je kernel32.7C809C94

继续跟踪,来到这里,修改0040B43E。

0040B437   E8 5C211B00      call dumped_1.005BD598
0040B43C   84C0               test al,al
0040B43E   75 5E            jnz short dumped_1.0040B49E             ; 修改jnz-->jmp
0040B440   33DB               xor ebx,ebx
0040B442   EB 4C            jmp short dumped_1.0040B490
0040B444   8BD3               mov edx,ebx
0040B446   A1 F879A300      mov eax,dword ptr ds:
0040B44B   E8 18B54000      call dumped_1.00816968
0040B450   8B15 14227500      mov edx,dword ptr ds:         ; umped_1.Tbx::TTBXItem::
0040B456   E8 6D894A00      call dumped_1.008B3DC8
0040B45B   85C0               test eax,eax
0040B45D   74 30            je short dumped_1.0040B48F
0040B45F   8BD3               mov edx,ebx
0040B461   A1 F879A300      mov eax,dword ptr ds:
0040B466   E8 FDB44000      call dumped_1.00816968
0040B46B   8B15 14227500      mov edx,dword ptr ds:         ; umped_1.Tbx::TTBXItem::
0040B471   E8 52894A00      call dumped_1.008B3DC8

F9,运行很畅快,脱壳过程算是结束了。

--------------------------------------------------------------------------------
【总结】
对于初学者,选用脚本、补区段的方法,相对成功率高些。

--------------------------------------------------------------------------------
【版权声明】: 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

windycandy 发表于 2006-5-31 07:40:18

顶~~~~~~~~~,支持并学习ing~~~~~~

野猫III 发表于 2006-5-31 07:58:40

又多学习了一篇该壳的脱文,先收藏后学习啦。。。


+++++++++++++++++++++++++++++++++++


什么时候图解给我们呀。。。

语音视频演示更欢迎!

[ 本帖最后由 野猫III 于 2006-5-31 22:08 编辑 ]

yyjpcx 发表于 2006-6-1 00:22:43

好文!~~~

学习下

zhimingcom 发表于 2006-6-9 12:21:59

看不懂,以后再来看这高深的

sonfly 发表于 2007-2-18 10:29:07

又是转来的。。郁。。。

ljy3282393 发表于 2007-4-30 23:01:46

好文!学习下!

小子贼野 发表于 2007-5-1 21:25:03

原帖由 野猫III 于 2006-5-31 07:58 发表 https://www.chinapyg.com/images/common/back.gif
又多学习了一篇该壳的脱文,先收藏后学习啦。。。


+++++++++++++++++++++++++++++++++++


什么时候图解给我们呀。。。

语音视频演示更欢迎!

说出了像我这样的菜鸟的心声

junlaoboss 发表于 2007-12-4 12:50:51

看的一塌糊涂,刚开始还行,越往后就不明白了
希望哪个高手能做个视频教程,让新手步出这个误区!

hanjinxin 发表于 2007-12-6 12:52:58

不是很懂,不过值得研究
页: [1] 2
查看完整版本: 用脚本、补区段脱Asprotect SKE 2.x壳笔记