ASProtect 1.2 1.2c脱壳分析
第一步:用PEID载入软件为ASProtect 1.2 / 1.2c-> Alexey Solodovnikov。
第二步:用OD载入软件,
<ModuleEn> 68 01F04800 PUSH ASProtec.0048F001 停在此处
00401005 C3 RETN
我们在调试设置中除“内存访问异常”不忽略外,其余都忽略,隐藏OD后,F9运行,
00DB009D 3100 XOR DWORD PTR DS:[EAX],EAX 异常在这里
00DB009F EB 01 JMP SHORT 00DB00A2
继续按Shift+F9运行,注意观察堆栈区
按了十六次,看堆栈区
0013D738 0013D740 指针到下一个 SEH 记录
0013D73C 00DB0217 SE 句柄
0013D740 0013FFE0 指针到下一个 SEH 记录
0013D744 00DB0A6F SE 句柄
0013D748 0013FF90
0013D74C 00DA0000
0013D750 00D80000
0013D754 00DB0038
0013D758 00000000
0013D75C 00DC1C44 ASCII "+U69wAAApMo=" 出现硬盘指纹
0013D760 00000000
继续按Shift+F9运行一次 ,再看堆栈区
0013D738 0013D740 指针到下一个 SEH 记录
0013D73C 00DB09E2 SE 句柄
0013D740 0013FFE0 指针到下一个 SEH 记录
0013D744 00DB0A6F SE 句柄
0013D748 0013FF90
0013D74C 00DA0000
0013D750 00D80000
0013D754 00DB0038
0013D758 00000000 硬盘指纹消失
0013D75C 00DC5D50 ASCII "SOFTWARE\ASProtect"
0013D760 00000000
OK
00DB0A2B 3100 XOR DWORD PTR DS:[EAX],EAX 异常停在此处
00DB0A2D EB 01 JMP SHORT 00DB0A30
00DB0A2F 68 648F0500 PUSH 58F64
00DB0A34 0000 ADD BYTE PTR DS:[EAX],AL
00DB0A36 00EB ADD BL,CH
00DB0A38 02E8 ADD CH,AL
00DB0A3A 0158 33 ADD DWORD PTR DS:[EAX+33],EBX
00DB0A3D C05A 59 59 RCR BYTE PTR DS:[EDX+59],59 ; 移动常数超出 1..31 的范围
00DB0A41 64:8910 MOV DWORD PTR FS:[EAX],EDX
00DB0A44 68 760ADB00 PUSH 0DB0A76
00DB0A49 8D85 C8D7FFFF LEA EAX,DWORD PTR SS:[EBP-2838]
00DB0A4F BA 02000000 MOV EDX,2
00DB0A54 E8 5727FFFF CALL 00DA31B0
00DB0A59 8D45 C8 LEA EAX,DWORD PTR SS:[EBP-38]
00DB0A5C E8 2F27FFFF CALL 00DA3190
00DB0A61 8D45 D0 LEA EAX,DWORD PTR SS:[EBP-30]
00DB0A64 BA 02000000 MOV EDX,2
00DB0A69 E8 4227FFFF CALL 00DA31B0
00DB0A6E C3 RETN 按F2下断在此,Shift+F9运行,中断了,F7返回00DADFB0
00DADFB0 68 952D21FD PUSH FD212D95 返回在此
00DADFB5 68 680F0000 PUSH 0F68
00DADFBA 68 44D00000 PUSH 0D044
00DADFBF 68 00600100 PUSH 16000
00DADFC4 FF35 1430DB00 PUSH DWORD PTR DS:[DB3014]
00DADFCA E8 71E8FFFF CALL 00DAC840
00DADFCF 310424 XOR DWORD PTR SS:[ESP],EAX
00DADFD2 8B05 1430DB00 MOV EAX,DWORD PTR DS:[DB3014]
00DADFD8 010424 ADD DWORD PTR SS:[ESP],EAX
00DADFDB C3 RETN
AIT+M,找到00401000句,按F2下断
内存镜像,项目 22
地址=00401000
大小=00059000 (364544.)
Owner=ASProtec 00400000
区段=
包含=code
类型=Imag 01001002
访问=R
初始访问=RWE
Shift+f9运行三次,来到OEP处
00458FD8 55 PUSH EBP 来到此处,为OEP
00458FD9 8BEC MOV EBP,ESP
00458FDB 83C4 F4 ADD ESP,-0C
00458FDE E8 99A3FAFF CALL ASProtec.0040337C
00458FE3 E8 F0B8FAFF CALL ASProtec.004048D8
00458FE8 E8 23FAFAFF CALL ASProtec.00408A10
00458FED E8 9667FBFF CALL ASProtec.0040F788
00458FF2 E8 AD6BFBFF CALL ASProtec.0040FBA4
00458FF7 E8 048BFBFF CALL ASProtec.00411B00
00458FFC E8 7F03FCFF CALL ASProtec.00419380
00459001 E8 AAD4FCFF CALL ASProtec.004264B0
00459006 E8 5556FDFF CALL ASProtec.0042E660
0045900B E8 4074FDFF CALL ASProtec.00430450
00459010 E8 4706FEFF CALL ASProtec.0043965C
00459015 E8 32C1FEFF CALL ASProtec.0044514C
0045901A E8 21C8FEFF CALL ASProtec.00445840
0045901F E8 0440FFFF CALL ASProtec.0044D028
00459024 E8 4340FFFF CALL ASProtec.0044D06C
00459029 E8 EE40FFFF CALL ASProtec.0044D11C
0045902E E8 8942FFFF CALL ASProtec.0044D2BC
00459033 E8 7C55FFFF CALL ASProtec.0044E5B4
00459038 E8 5F61FFFF CALL ASProtec.0044F19C
0045903D A1 28564600 MOV EAX,DWORD PTR DS:[465628]
第四步:用OD插件DUMP它。程序不能运行,再用ImportREC V1.6F 载入程序,OEP=58FD8,点“IAT自动搜索”
――“获得输入信息”,有很多无效指针,先用“追踪等级I级”修复,再用插件ASProtect 1.22追踪,OK全部为有效指针,修复它吧!
第五步:运行修复后的程序还是不能正常运行,用OD载入修复后的程序,F9运行,出现异常
注意堆栈区
0013FE28 00454965 返回到 ASProtec.00454965 来自 00DAC6D8 注意这行
0013FE2C 0013FE5C 指针到下一个 SEH 记录
0013FE30 00454B5B SE 句柄
我们在反汇编中跟随,返回到CPU区如下
00454954 |. 8B80 6C020000 MOV EAX,DWORD PTR DS:[EAX+26C]
0045495A |. E8 89FAFBFF CALL ASProtec.004143E8
0045495F |. FF15 AC4F4600 CALL DWORD PTR DS:[464FAC] 是这个Call出错了
00454965 |. 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C] 返回到此,往上走
00454968 |. 33C0 XOR EAX,EAX
0045496A |. E8 C1DEFAFF CALL ASProtec.00402830
0045496F |. 8B4D F4 MOV ECX,DWORD PTR SS:[EBP-C]
00454972 |. B2 01 MOV DL,1
在命令行下“D 464FAC”,在数据窗口可看到
00464FAC 00DAC6D8 这个值要修改 ,修改为“00401238”
00464FB0 00DAC6D8
00464FB4 00000000
00464FB8 00000000
00464FBC 00000000
00464FC0 00000000
00464FC4 00000000
修改方法:我们随便在程序中找个retn。Ctrl+F,输入“retn”,回车 (00401238 . C3 RETN 我们就找这个吧 ,然后在刚才的要修改的地方改成“00401238”这个值
然后复制到可执行文件,保存!
再次运行,还有错!晕,再载入修改后的程序,按第五步再操作一下,注意堆栈区
0013FE28 00454B40 返回到 ASProtec.00454B40 来自 00DAC6D8
0013FE2C 0013FE5C 指针到下一个 SEH 记录
0013FE30 00454B5B SE 句柄
0013FE34 0013FE54
返回到00454B40句后,可以找到是00454B3A句出错
00454B3A > FF15 B04F4600 CALL DWORD PTR DS:[464FB0] 修改
00454B40 . 33C0 XOR EAX,EAX
按同样方法,修改值为“00401238”,复制到可执行文件,保存!
再运行,OK!万事大吉了!
[课程]Linux pwn 探索篇!