首页
社区
课程
招聘
[原创]ASProtect 1.22-1.23Beta21 手脱+手动修复
发表于: 2006-3-6 00:46 5189

[原创]ASProtect 1.22-1.23Beta21 手脱+手动修复

2006-3-6 00:46
5189
只是我自己的练习,好多前辈都做过了,没必要的话版主就别加精华了,发上来目的是送给和我一样的菜鸟。高手过吧,别浪费时间了。我最近想低调些。有点事心烦。

【脱壳作者】 刹那恍惚
【作者邮箱】 RegKiller2002@yahoo.com.cn
【作者 QQ 】 14403147
【使用工具】 OllyDBG 汉化第二版,LordPE Deluxe 增强版,ImportREC v1.6F,PEiD v0.94,FI 4.01a
【脱壳平台】 WinXP SP2
【软件名称】 ASPack 2.12
【软件大小】 197 KB
【加壳方式】 ASProtect 1.22 - 1.23 Beta 21 -> Alexey Solodovnikov
【脱壳声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)

--------------------------------------------------------------------------------
【脱壳内容】

老规矩设置Ollydbg忽略"除非法访问内存"外的所有异常,用IsDebug 1.4插件去掉Ollydbg的调试器标志。

1 侦壳:用PEiD查壳 ASProtect 1.22 - 1.23 Beta 21

OD 载入

00401000 >  68 01704600     PUSH ASPACK.00467001                     ; OD 载入后停在此处
00401005    E8 01000000     CALL ASPACK.0040100B
0040100A    C3              RETN
0040100B    C3              RETN

Shift+F9 运行记下异常的次数直到程序执行。

00DC0739    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 01 次异常
00DC01B5    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 02 次异常
00DC01FD    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 03 次异常
00DC034B    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 04 次异常
00DC038E    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 05 次异常
00DBF145    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 06 次异常
00DBF1AD    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 07 次异常
00DBF249    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 08 次异常
00DBF33D    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 09 次异常
00DBF3AE    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 10 次异常
00DBF410    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 11 次异常
00DC03FF    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 12 次异常
00DC0442    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 13 次异常
00DC04EA    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 14 次异常
00DBEF33    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 15 次异常
00DBEFA5    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 16 次异常
00DBF4AF    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 17 次异常
00DBF58F    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 18 次异常
00DBFAAA    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 19 次异常
00DBFB09    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 20 次异常
00DBFCD1    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 21 次异常
00DC090B    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 22 次异常
00DC099F    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 23 次异常
00DC0DFC    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 24 次异常
00DC0E3F    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 25 次异常
00DC0F07    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 26 次异常
00DC05CC    8B43 02         MOV EAX,DWORD PTR DS:[EBX+2]             ; 第 27 次异常
00DC0F72    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 28 次异常
00DC1013    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 29 次异常
00DC108E    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 30 次异常
00DC128B    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 31 次异常
00DC00E1    3100            XOR DWORD PTR DS:[EAX],EAX               ; 第 32 次异常

在第 33 次 Shift+F9 后程序执行了,OK,OD 从新载入程序。我们停在第 32 次异常的位置然后看堆栈提示信息

0012FF64  /0012FFE0  指向下一个 SEH 记录的指针
0012FF68  |00DC00C4  SE处理程序

我们在这句 0012FF68 处用鼠标右键"反汇编窗口跟随"后来到这里下断

00DC00C4    8B4424 0C       MOV EAX,DWORD PTR SS:[ESP+C]             ; 来到这里,F2 下断

异常处理完毕后会断在 00DC00C4 处。

现在取消断点 ALT+M 打开内存映射窗口并在如下段下"设置内存访问断点"然后 F9 运行直接来到OEP

00442CE8    55              PUSH EBP                                 ; 内存访问断下后来到此处 OEP
00442CE9    8BEC            MOV EBP,ESP
00442CEB    83C4 F4         ADD ESP,-0C
00442CEE    E8 D506FCFF     CALL ASPACK.004033C8
00442CF3    E8 941CFCFF     CALL ASPACK.0040498C
00442CF8    E8 A34FFCFF     CALL ASPACK.00407CA0
00442CFD    E8 1AC2FCFF     CALL ASPACK.0040EF1C
00442D02    E8 01C3FCFF     CALL ASPACK.0040F008
00442D07    E8 58E2FCFF     CALL ASPACK.00410F64
00442D0C    E8 2349FDFF     CALL ASPACK.00417634
00442D11    E8 CA16FEFF     CALL ASPACK.004243E0
00442D16    E8 6983FEFF     CALL ASPACK.0042B084
00442D1B    E8 5896FEFF     CALL ASPACK.0042C378
00442D20    E8 D796FEFF     CALL ASPACK.0042C3FC
00442D25    E8 42A2FEFF     CALL ASPACK.0042CF6C
00442D2A    E8 09A8FEFF     CALL ASPACK.0042D538
00442D2F    E8 6CB7FEFF     CALL ASPACK.0042E4A0
00442D34    E8 ABB7FEFF     CALL ASPACK.0042E4E4
00442D39    E8 36B8FEFF     CALL ASPACK.0042E574
00442D3E    E8 41DFFEFF     CALL ASPACK.00430C84
00442D43    E8 4CAFFFFF     CALL ASPACK.0043DC94

现在可以用 LordPE DUMP 了。用 Import REC v1.6 修复IAT OEP=42CE8,自动搜索IAT,获得输入信息。

有 245 个没识别出来的,用"跟踪级别 1"追后还剩 8 个未识别的。

继续用 Import REC 的 ASProtect 1.22 插件追后全部有效。修复抓取文件.

虽然已经修复 IAT 了。但是程序执行失败,如下提示:

Exception EAccessViolation in module dumped_.exe at 009BB76C.
Access violation at address 00DBC9A0. Read of address 00DBC9A0.

ASProtect 1.22 从程序中抽走了我们的代码。下面我们修复抽走的代码

错误处 1

用 OD 加载已脱壳程序,F9 运行后出错,看堆栈提示:

0012FFB0   00442D67  返回到 dumped_.<模块入口点>+7F 来自 00DBC9A0
0012FFB4   0012FFE0  指向下一个 SEH 记录的指针
0012FFB8   00403304  SE处理程序

在 0012FFB0 处用鼠标右键"反汇编窗口跟随"

00442D61  |.  FF15 10494400 CALL DWORD PTR DS:[444910]
00442D67  |.  A1 30564400   MOV EAX,DWORD PTR DS:[445630]            ;  来到这里

向上看 00442D61 处的 DS:[00444910]=00DBC9A0

如果你前面的 OD 没关,那么用就用前面那个 OD CTRL+G 到 00422D61 处下 F2 断点。

如果关了可以重复上面步骤用 OD 从新打开没脱壳的程序然后去 00422D61 处下断。

我们跟踪没脱壳的程序来修复已脱壳的程序。

00442D61    FF15 10494400   CALL DWORD PTR DS:[444910]               ; 断下后 F7 跟进
00442D67    A1 30564400     MOV EAX,DWORD PTR DS:[445630]

00DBC9A0    833D A835DC00 0>CMP DWORD PTR DS:[DC35A8],0              ; 跟到此处
00DBC9A7    74 06           JE SHORT 00DBC9AF
00DBC9A9    FF15 A835DC00   CALL DWORD PTR DS:[DC35A8]               ; ASPACK.00442BEC
00DBC9AF    C3              RETN

此时 DS:[00DC35A8]=00442BEC

回到脱壳后的 OD 里,同样来到 00442D61。此时 DS:[00444910]=00DBC9A0 在此处用鼠标右键"数据窗口跟随地址"

然后修正 00444910 里的 00DBC9A0 为 00442BEC,修复后保存文件。试运行后弹出错误窗口:

Access violation at address 00DBC8F8. Read of address 00DBC8F8.

确定后程序运行,但无法正常使用,继续用 OD 同样方法修复。

错误处 2

用 OD 加载已脱壳程序,F9 运行后出错,看堆栈提示:

0012FDFC   0043F5E2  返回到 dumped_.0043F5E2 来自 00DBC8F8
0012FE00   0012FE54  指向下一个 SEH 记录的指针
0012FE04   0043F8F4  SE处理程序

在 0012FDFC 处用鼠标右键"反汇编窗口跟随"

0043F5DC   .  FF15 08494400 CALL DWORD PTR DS:[444908]
0043F5E2   .  E9 83000000   JMP dumped_.0043F66A                     ;  来到这里

向上看 0043F5DC 处的 DS:[00444908]=00DBC8F8

跟踪未脱壳的程序。

0043F5DC    FF15 08494400   CALL DWORD PTR DS:[444908]               ; 断下后 F7 跟进
0043F5E2    E9 83000000     JMP ASPACK.0043F66A

00DBC8F8    833D 6036DC00 0>CMP DWORD PTR DS:[DC3660],0              ; 跟到此处
00DBC8FF    75 0D           JNZ SHORT 00DBC90E
00DBC901    A1 7035DC00     MOV EAX,DWORD PTR DS:[DC3570]
00DBC906    8B15 7435DC00   MOV EDX,DWORD PTR DS:[DC3574]
00DBC90C    EB 0B           JMP SHORT 00DBC919
00DBC90E    A1 6036DC00     MOV EAX,DWORD PTR DS:[DC3660]
00DBC913    8B15 6436DC00   MOV EDX,DWORD PTR DS:[DC3664]
00DBC919    52              PUSH EDX
00DBC91A    50              PUSH EAX
00DBC91B    E8 D4FDFFFF     CALL 00DBC6F4
00DBC920    C3              RETN

注意这句 00DBC920 只是个返回。那么我们就在脱壳后的程序里随便找个 RETN 来修复就可以了。

我找的是

修正 DS:[00444908]=00DBC8F8 里的 00DBC8F8 为 0043F6D5 修复后保存文件。试运行后弹出错误窗口:

Access violation at address 00DBC924. Read of address 00DBC924.

确定后程序运行,但无法正常使用,继续用 OD 同样方法修复。

错误处 3

用 OD 加载已脱壳程序,F9 运行后出错,看堆栈提示:

0012FDFC   0043F670  返回到 dumped_.0043F670 来自 00DBC924
0012FE00   0012FE54  指向下一个 SEH 记录的指针
0012FE04   0043F8F4  SE处理程序

在 0012FDFC 处用鼠标右键"反汇编窗口跟随"

0043F66A   > \FF15 0C494400 CALL DWORD PTR DS:[44490C]
0043F670   .  B2 01         MOV DL,1                                 ;  来到这里

向上看 0043F66A 处的 DS:[0044490C]=00DBC924

跟踪未脱壳的程序。

0043F66A    FF15 0C494400   CALL DWORD PTR DS:[44490C]               ; 断下后 F7 跟进
0043F670    B2 01           MOV DL,1

00DBC924    833D 6036DC00 0>CMP DWORD PTR DS:[DC3660],0              ; 跟到此处
00DBC92B    75 0D           JNZ SHORT 00DBC93A
00DBC92D    A1 7035DC00     MOV EAX,DWORD PTR DS:[DC3570]
00DBC932    8B15 7435DC00   MOV EDX,DWORD PTR DS:[DC3574]
00DBC938    EB 0B           JMP SHORT 00DBC945
00DBC93A    A1 6036DC00     MOV EAX,DWORD PTR DS:[DC3660]
00DBC93F    8B15 6436DC00   MOV EDX,DWORD PTR DS:[DC3664]
00DBC945    E8 1EFEFFFF     CALL 00DBC768
00DBC94A    C3              RETN

看了一下,与第 2 处一样问题。修复方法同上。

这里我在附近找了一个 RENT 地址为 0043F6D5

修复 0043F66A 处的 DS:[0044490C]=00DBC924 里的 00DBC924 为 0043F6D5 保存后测试程序正常。

减肥

用 LordPE 删除虚拟地址为 46000 48000 4B000 76000 的四个段,然后重建。

原脱壳后文件大小:484 KB

优化后大小:434 KB

--------------------------------------------------------------------------------
【脱壳总结】

这篇文章的重点我个人觉得其实还是锻炼手动修复的能力
--------------------------------------------------------------------------------
【版权声明】 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!

动画下载:看雪好像不太欢迎动画,我论坛上有,不在此做广告了,免的有人说我,想要的自己想办法找我论坛去下。

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 191
活跃值: (335)
能力值: ( LV9,RANK:450 )
在线值:
发帖
回帖
粉丝
2
沙发自己坐了。
2006-3-6 00:53
0
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
学习,谢谢!
2006-3-6 09:19
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
4
我最近想低调些。有点事心烦。

呵呵,热情过去之后就是沉默了

2006-3-6 09:47
0
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
为什么 我有个软件加的壳和你的是一样的 但是我的只有16次异常,所以脱壳方法 不能和你的这个一样 不知道为什么!
2006-3-22 18:20
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
现在取消断点 ALT+M 打开内存映射窗口并在如下段下"设置内存访问断点"然后 F9 运行直接来到OEP


呵呵。这个地方漏了一句吧
2006-3-22 18:26
0
雪    币: 236
活跃值: (35)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
楼上的 我也照他们说的 那样 内存断点也试过了 但是 还是不行哦 也许入口被手动改过!
2006-3-22 18:32
0
雪    币: 202
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wdx
8
谢谢,正在学习
2006-3-23 10:33
0
游客
登录 | 注册 方可回帖
返回
//