新手脱壳2 单步跟踪脱aspack壳
用的还是先前的HideW程序,只不过这次是加了个aspack0040D001 >60 pushad ; OD载入后停在了这里0040D002 E8 03000000 call HideW.0040D00A
0040D007- E9 EB045D45 jmp 459DD4F7
0040D00C 55 push ebp
0040D00D C3 retn
0040D00E E8 01000000 call HideW.0040D014
0040D013 EB 5D jmp XHideW.0040D072
0040D015 BB EDFFFFFF mov ebx,-0x13
0040D01A 03DD add ebx,ebp
0040D01C 81EB 00D00000 sub ebx,0xD000
像往常一样,F8步过,却发现跑飞了,于是重新开始,F7步入这个call里
0040D00A 5D pop ebp ; 发现就一条有用的指令,即inc ebp
0040D00B 45 inc ebp
0040D00C 55 push ebp
0040D008 /EB 04 jmp XHideW.0040D00E ; 居然retn到这里了 F8JMP过去
0040D00A |5D pop ebp ; 发现就一条有用的指令,即inc ebp
0040D00B |45 inc ebp
0040D00C |55 push ebp
0040D00D |C3 retn
0040D00E \E8 01000000 call HideW.0040D014
0040D013 EB 5D jmp XHideW.0040D072
0040D015 BB EDFFFFFF mov ebx,-0x13
0040D01A 03DD add ebx,ebp
0040D01C 81EB 00D00000 sub ebx,0xD000
0040D022 83BD 22040000 0>cmp dword ptr ss:,0x0
0040D029 899D 22040000 mov dword ptr ss:,ebx
0040D02F 0F85 65030000 jnz HideW.0040D39A
这个地方感觉很神奇,原来刚开始的那个CALL后的0040D007- E9 EB045D45 jmp 459DD4F7根本就不会被执行到
再仔细看一下,这个JMP过去的地址也很奇怪,以后再看到这样的就要多长个心眼了
继续吧,这下面的要F4了,不然一直在循环,出不来
0040D12D 0BC9 or ecx,ecx
0040D12F 74 2E je XHideW.0040D15F ; 这两个跳转均未实现
0040D131 78 2C js XHideW.0040D15F ; 但是循环了几次发现,最终肯定会跳过去的,所以就直接F4执行到那里
0040D133 AC lods byte ptr ds:
0040D134 3C E8 cmp al,0xE8
0040D136 74 0A je XHideW.0040D142
0040D138 EB 00 jmp XHideW.0040D13A
0040D13A 3C E9 cmp al,0xE9
0040D13C 74 04 je XHideW.0040D142
0040D13E 43 inc ebx
0040D13F 49 dec ecx
0040D140^ EB EB jmp XHideW.0040D12D
0040D142 8B06 mov eax,dword ptr ds:
0040D144 EB 00 jmp XHideW.0040D146
0040D146 803E 00 cmp byte ptr ds:,0x0
0040D149^ 75 F3 jnz XHideW.0040D13E
0040D14B 24 00 and al,0x0
0040D14D C1C0 18 rol eax,0x18
0040D150 2BC3 sub eax,ebx
0040D152 8906 mov dword ptr ds:,eax
0040D154 83C3 05 add ebx,0x5
0040D157 83C6 04 add esi,0x4
0040D15A 83E9 05 sub ecx,0x5
0040D15D^ EB CE jmp XHideW.0040D12D ; 这个是往回跳的,就在上面两个跳转的前面
0040D15F 5B pop ebx ; 所以必定会执行到这里
0040D160 5E pop esi
0040D161 59 pop ecx
0040D162 58 pop eax
0040D163 EB 08 jmp XHideW.0040D16D
继续
0040D395^\E9 EBFEFFFF jmp HideW.0040D285 ; 不能向上跳,不然又会到上面那个循环中去了
0040D39A B8 3F110000 mov eax,0x113F
0040D39F 50 push eax
0040D3A0 0385 22040000 add eax,dword ptr ss:
0040D3A6 59 pop ecx
0040D3A7 0BC9 or ecx,ecx
0040D3A9 8985 A8030000 mov dword ptr ss:,eax
0040D3AF 61 popad ;看到POPAD了
0040D3B0 75 08 jnz XHideW.0040D3BA ;跳转,所以下面第一个retn是没执行的
0040D3B2 B8 01000000 mov eax,0x1
0040D3B7 C2 0C00 retn 0xC
0040D3BA 68 00000000 push 0x0
0040D3BF C3 retn ; 这之后就是OEP了
此时的堆栈:
0012FFC0 0040113FHideW.0040113F
0012FFC4 7C817077返回到 kernel32.7C817077
0012FFC8 7C930228ntdll.7C930228
F8后
看来一切都是正确的了
0040113F .6A 00 push 0x0 ; /pModule = NULL
00401141 .E8 86010000 call HideW.004012CC ; \GetModuleHandleA
00401146 .A3 18304000 mov dword ptr ds:,eax
0040114B .C705 3C304000>mov dword ptr ds:,0x30
00401155 .C705 40304000>mov dword ptr ds:,0x3
0040115F .C705 44304000>mov dword ptr ds:,HideW.00>
00401169 .C705 48304000>mov dword ptr ds:,0x0
00401173 .C705 4C304000>mov dword ptr ds:,0x1E
0040117D .FF35 18304000 push dword ptr ds:
00401183 .8F05 50304000 pop dword ptr ds:
00401189 .C705 5C304000>mov dword ptr ds:,0x10
00401193 .C705 60304000>mov dword ptr ds:,0x0
0040119D .C705 64304000>mov dword ptr ds:,HideW.00>;ASCII "DLGCLASS"
004011A7 .68 007F0000 push 0x7F00 ; /RsrcName = IDI_APPLICATION
004011AC .6A 00 push 0x0 ; |hInst = NULL
004011AE .E8 DD000000 call HideW.00401290 ; \LoadIconA
004011B3 .A3 54304000 mov dword ptr ds:,eax
004011B8 .A3 68304000 mov dword ptr ds:,eax
004011BD .68 007F0000 push 0x7F00 ; /RsrcName = IDC_ARROW
004011C2 .6A 00 push 0x0 ; |hInst = NULL
004011C4 .E8 C1000000 call HideW.0040128A ; \LoadCursorA
004011C9 .A3 58304000 mov dword ptr ds:,eax
004011CE .68 3C304000 push HideW.0040303C ; /pWndClassEx = HideW.0040303C
004011D3 .E8 C4000000 call HideW.0040129C ; \RegisterClassExA
004011D8 .6A 00 push 0x0 ; /lParam = 0
004011DA .68 00104000 push HideW.00401000 ; |pDlgProc = HideW.00401000
004011DF .6A 00 push 0x0 ; |hOwner = NULL
004011E1 .6A 65 push 0x65 ; |pTemplate = 65
004011E3 .FF35 18304000 push dword ptr ds: ; |hInst = NULL
004011E9 .E8 78000000 call HideW.00401266 ; \CreateDialogParamA
004011EE .A3 1C304000 mov dword ptr ds:,eax
004011F3 .68 64B04000 push HideW.0040B064 ; /IniFileName = ""
004011F8 .6A 00 push 0x0 ; |Default = 0
004011FA .68 73204000 push HideW.00402073 ; |Key = "ShowSelf"
004011FF .68 6B204000 push HideW.0040206B ; |Section = "Default"
00401204 .E8 C9000000 call HideW.004012D2 ; \GetPrivateProfileIntA
00401209 .50 push eax ; /ShowState
0040120A .FF35 1C304000 push dword ptr ds: ; |hWnd = NULL
00401210 .E8 99000000 call HideW.004012AE ; \ShowWindow
00401215 .FF35 1C304000 push dword ptr ds: ; /hWnd = NULL
0040121B .E8 9A000000 call HideW.004012BA ; \UpdateWindow
00401220 >6A 00 push 0x0 ; /MsgFilterMax = 0
00401222 .6A 00 push 0x0 ; |MsgFilterMin = 0
00401224 .6A 00 push 0x0 ; |hWnd = NULL
00401226 .68 20304000 push HideW.00403020 ; |pMsg = HideW.00403020
0040122B .E8 4E000000 call HideW.0040127E ; \GetMessageA
00401230 .0BC0 or eax,eax
00401232 .74 2A je XHideW.0040125E
00401234 .68 20304000 push HideW.00403020 ; /pMsg = WM_NULL
00401239 .FF35 1C304000 push dword ptr ds: ; |hWnd = NULL
0040123F .E8 40000000 call HideW.00401284 ; \IsDialogMessageA
00401244 .0BC0 or eax,eax
00401246 .75 14 jnz XHideW.0040125C
00401248 .68 20304000 push HideW.00403020 ; /pMsg = WM_NULL
0040124D .E8 62000000 call HideW.004012B4 ; \TranslateMessage
00401252 .68 20304000 push HideW.00403020 ; /pMsg = WM_NULL
00401257 .E8 16000000 call HideW.00401272 ; \DispatchMessageA
0040125C >^ EB C2 jmp XHideW.00401220
0040125E >6A 00 push 0x0 ; /ExitCode = 0
00401260 .E8 5B000000 call HideW.004012C0 ; \ExitProcess
入口点113F,用OD的插件ollydump脱壳之
运行一下,一切正常,脱壳成功
一段小插曲:我开始retn后看到的可不是这样的,以为不是入口点,大牛答曰,这就是入口点了,请点击一下右键,选择分析代码,然后就是上面这个样子了。
附件说明:HideW.exe为aspack加壳的程序
~~HideW.exe为我脱壳后的程序
原未加壳程序见这里:http://wt.52pojie.cn/thread-81036-1-1.html
set.ini是配制文件,上文中有说明
后来请教大牛得知,aspack壳开头部分的call那里其实是一种花指令,而且也很常见。关于花指令的更多内容,请百度大致了解下,我是懒人,且这不是我目前想看的,所以忽略之。
我觉得初学者应学会忽略,有些东西不应死钻,了解就好,专注当前最重要的部分就可以了,等到需要时再去重点学习这一方面的。
附上本人的学习方法 经验
http://wt.52pojie.cn/thread-81211-1-1.html
本帖最后由 梦影 于 2011-2-24 15:35 编辑
先占一楼,等下试试ESP定律
大牛说得对,这个方法确实简单了很多
具体如下
OD载入,F8执行完pushad
然后按下图所示方法下硬件访问断点
然后F9
0040D3AF 61 popad
0040D3B0 75 08 jnz XHideW.0040D3BA ; F9停下来的地方
0040D3B2 B8 01000000 mov eax,0x1
0040D3B7 C2 0C00 retn 0xC
0040D3BA 68 3F114000 push HideW.0040113F
0040D3BF C3 retn
retn回去后就是传说中的OEP了
删除断点:调试-硬件断点-删除
附:
1.ESP定律原理
http://wt.52pojie.cn/forum-viewt ... SP%B6%A8%C2%C9.html
2.硬件断点的原理
http://apps.hi.baidu.com/share/detail/22608303 (很喜欢百度大叔,嘿嘿)
随便写点,算是做笔记吧
难得有这样的耐心! 楼主啊你说的对与我们菜鸟就是浮云啊,来个录像 yjj876020 发表于 2011-2-24 15:06 static/image/common/back.gif
沙发,楼主出了视频教程更加好懂点对于菜鸟
我想文字的话,思路应该更清晰吧
视频我都不知道怎么看,我也从来没有看过视频,一是因为公司电脑有限制(当然exe格式的视频可以看,不过也没声音,所以我打一开始就放弃视频了)家里吧,我不可能弄出声音来,会被家人骂的时间也不多,看视频很浪费时间 (一遍通常是看不明白的)
所以在那个菜鸟成长之路经验帖里也没有推荐视频教程,而都是一些文字教程
其实最重要的是自己动手实践,而不是光看。
小白兔 发表于 2011-2-24 15:10 static/image/common/back.gif
楼主啊你说的对与我们菜鸟就是浮云啊,来个录像
在时间有限,环境有限的情况下,文字是最好的
可以看下帖子中最后的那个链接 希望对你有用,能带来帮助。
如果打不开,请把地址改成www开头的,而不是wt (我这虽然是电信,但是www是打不开的,可能给你带来些许不便之处,抱歉了)
回复 梦影 的帖子
支持,说的在理! ESP定律也是个快速找到OEP的方法,其原理就是利用ESP堆栈平衡原理,既PUSHAD后的ESP值应等于POPAD前的ESP值的原理,当然,单步跟踪更是基础,还有内存镜像法,大牛告诉偶,这些方法都要掌握,然后综合应用,太能在脱强壳的时候发挥左右啊。 zone0826 发表于 2011-2-24 16:46 static/image/common/back.gif
ESP定律也是个快速找到OEP的方法,其原理就是利用ESP堆栈平衡原理,既PUSHAD后的ESP值应等于POPAD前的ESP值 ...
ESP定律的原理我已经了解了
感谢你的回复
目标:内存镜像法
页:
[1]
2