-
-
[原创]ASProtect 1.22-1.23Beta21 手脱+手动修复
-
发表于:
2006-3-6 00:46
5189
-
[原创]ASProtect 1.22-1.23Beta21 手脱+手动修复
只是我自己的练习,好多前辈都做过了,没必要的话版主就别加精华了,发上来目的是送给和我一样的菜鸟。高手过吧,别浪费时间了。我最近想低调些。有点事心烦。
【脱壳作者】 刹那恍惚
【作者邮箱】 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解题方法汇总!