首页
社区
课程
招聘
[旧帖] [求助]学二哥教程中遇到的问题 请朋友们指点 谢谢 0.00雪花
发表于: 2008-4-1 09:15 5725

[旧帖] [求助]学二哥教程中遇到的问题 请朋友们指点 谢谢 0.00雪花

2008-4-1 09:15
5725
学二哥教程中遇到的问题 请朋友们指点 谢谢
我是新人,最近学二哥的脱壳教程。
在进阶第一篇遇到问题   脱一个加了Petite2.2加壳Win98的记事---见附件
就是碰到SEH反调试
开始压进的SEH地址是0040584C
程序在
0040D135 A4 movs byte ptr es:[edi], byte ptr ds:[esi>
会碰到暗桩Shift+F7,进入系统领空,Alt+F9回到程序领空时就到了
0040584C 5A pop edx
004058E6 64:8F05 0000000>pop dword ptr fs:[0]
004058ED 58 pop eax
004058EE 6A 00 push 0
004058F0 53 push ebx
004058F1 33DB xor ebx, ebx
004058F3 68 3D030000 push 33D
004058F8 8B0C24 mov ecx, dword ptr ss:[esp]
004058FB 0FBAE3 00 bt ebx, 0
004058FF /72 16 jb short Notepad.00405917
00405901 |64:8B35 1C00000>mov esi, dword ptr fs:[1C]
00405908 |0FBAF6 00 btr esi, 0
0040590C |64:0335 2200000>add esi, dword ptr fs:[22]
00405913 |46 inc esi
00405914 |66:33DE xor bx, si
00405917 \321C11 xor bl, byte ptr ds:[ecx+edx]
0040591A C1C3 07 rol ebx, 7
0040591D 49 dec ecx
0040591E ^ 7D DB jge short Notepad.004058FB 循环。
00405920 8D48 37 lea ecx, dword ptr ds:[eax+37] F4下来。
00405923 3119 xor dword ptr ds:[ecx], ebx
00405925 3159 04 xor dword ptr ds:[ecx+4], ebx
00405928 3159 08 xor dword ptr ds:[ecx+8], ebx
0040592B 3159 0C xor dword ptr ds:[ecx+C], ebx
0040592E 59 pop ecx
0040592F 315C11 01 xor dword ptr ds:[ecx+edx+1], ebx
00405933 33DB xor ebx, ebx
00405935 8BF2 mov esi, edx
00405937 81BA 71A8FFFF 4>cmp dword ptr ds:[edx+FFFFA871], 0D042;这个是关键的判断
00405941 75 21 jnz short Notepad.00405964

00405964 83C4 2A add esp, 2A 到这里。
00405967 - E9 A9760000 jmp Notepad.0040D015 跳走
这样一步步下来就会跳到0040D015,就会跟OVER。

按照二哥的方法:
先F9运行,提示异常,这时加密的区段解压完毕,我们Ctrl+g,填入00405941,回车。
Shift+F9继续运行,提示单步异常。Shift+F9继续,呵顺利通过单步异常,F2取消断点。

00405941 /75 21 jnz short Notepad.00405964 到这里,F8慢慢往下运行。
00405943 |81EE B7570000 sub esi, 57B7
00405949 |0FB64E 06 movzx ecx, byte ptr ds:[esi+6]
0040594D |6BC9 0A imul ecx, ecx, 0A
00405950 |66:81C1 3E00 add cx, 3E
00405955 |331E xor ebx, dword ptr ds:[esi]
00405957 |D3C3 rol ebx, cl
00405959 |83C6 04 add esi, 4
0040595C |49 dec ecx
0040595D ^|75 F6 jnz short Notepad.00405955
0040595F |3958 04 cmp dword ptr ds:[eax+4], ebx
00405962 |74 08 je short Notepad.0040596C
00405964 \83C4 2A add esp, 2A
00405967 - E9 A9760000 jmp Notepad.0040D015 这里这次没运行,被处理掉了。
0040596C BE 00600000 mov esi, 6000
就可以过了 暗转。

我就是不明白这个原理是什么,是什么代码在反调试,SEH的原理我也学习了哈,明白程序跳到0040584C的原理。
但是后来那个跳转
00405937 81BA 71A8FFFF 4>cmp dword ptr ds:[edx+FFFFA871], 0D042;这个是关键的判断
00405941 75 21 jnz short Notepad.00405964

00405964 83C4 2A add esp, 2A 到这里。
00405967 - E9 A9760000 jmp Notepad.0040D015 跳走
是怎么处理的, 我就看不明白了!

希望知道的朋友指点一下,谢谢了。加我QQ告诉我也行。34085905

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

上传的附件:
收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 225
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
OD载入

0040D042 >mov     eax, 0040D000
0040D047  push    0040584C
0040D04C  push    dword ptr fs:[0]
0040D053  mov     dword ptr fs:[0], esp
0040D05A  pushfw
0040D05C  pushad
0040D05D  push    eax       〈===这里使用ESP定律
0040D05E  push    00400000
0040D063  mov     edi, dword ptr [esp]
0040D066  mov     esi, dword ptr [eax]
0040D068  add     di, 780
0040D06D  lea     esi, dword ptr [esi+eax+8]
0040D071  mov     dword ptr [eax], edi
0040D073  mov     ebx, dword ptr [esi+10]
-----------------------------------------
0040D03D   >popfw    〈===SHIFT+F9到这里,跑2步就到OEP
0040D03F   >add     esp, 8
0040D042 >->jmp     004010CC
0040D047  ->jmp     SHELL32.DragFinish

-----------------------------------------
想锻炼就慢慢跟,很考验耐心的。
2008-4-1 14:15
0
雪    币: 224
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
3
楼上的朋友 谢谢你

可能是我的问题没有写清楚 不好意思
ESP定理跟是可以到达脱壳处 不过好像是已经执行了oep的popad
这个也不是我的问题的关键

我的问题是那个一步步跟不用ESP定理时  暗桩是怎么过的了  就是程序调试的时候按第一种方法为何会跑死!  二个那样下断就跑过去了  我没有想明白!
恳请大家指点!
2008-4-1 14:56
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
OD忽略所有异常后,单步F8走:
0040D05A    66:9C           pushfw
0040D05C    60              pushad          //过了这句
0040D05D    50              push eax       //在这里下用ESP定律,然后Shift+F9,断下后来到这里:

0040D03D    66:9D           popfw
0040D03F    83C4 08         add esp,8
0040D042 >- E9 8540FFFF     jmp Notepad.004010CC    //OEP的入口了,进去就该干什么就干什么吧!~~~
2008-4-1 16:35
0
雪    币: 224
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
5
怎么还是ESP啊
谢谢楼上
继续求答案!!
2008-4-2 08:51
0
雪    币: 224
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
自己再顶一下  希望有人解答

斑竹要帮忙   江湖救急
2008-4-3 11:22
0
雪    币: 295
活跃值: (346)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
7
第一次异常在 40D0135, 由SEH_handler 40584c处理

004058B2,4058B5 走过后, SEH被修改, handler 为405B0E

004058B2    894B 04         mov     dword ptr [ebx+4], ecx
004058B5    64:891D 0000000>mov     dword ptr fs:[0], ebx

下面的几行,在4058E4处产生一单步异常, 由405B0E处理, 而在用F7或F8单步时,不会
执行到405B0E处;

004058DA    60              pushad
004058DB    66:9C           pushfw
004058DD    0FBA3C24 08     btc     dword ptr [esp], 8
004058E2    66:9D           popfw
004058E4    5B              pop     ebx

00405B0E    33C0            xor     eax, eax
00405B10    64:8B18         mov     ebx, dword ptr fs:[eax]
00405B13    8B1B            mov     ebx, dword ptr [ebx]
00405B15    8D63 AE         lea     esp, dword ptr [ebx-52]
00405B18    61              popad
00405B19    833E 00         cmp     dword ptr [esi], 0
00405B1C  ^ 0F84 C2FDFFFF   je      004058E4                    // 最终由这跳回4058E4继续执行
00405B22    0FBA26 1F       bt      dword ptr [esi], 1F
00405B26    73 05           jnb     short 00405B2D
...
00405B90  ^\EB C5           jmp     short 00405B57

在OD中,单步跟会导致00405B0E-00405B90之间的代码执行不到, 最后的结果就是在405937处的比较结果不对。

在第二次异常后, 可在405B0E处下断, shift+F9;

然后可单步到405937, 结果正确。
2008-4-4 02:06
0
雪    币: 224
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
8
十分感谢楼上blackeyes的  指点
我跟一下  确实如此  
看到blackeyes在凌晨02:06为我回帖  感动之余  也明白为什么你能回答我不少人不能回答我的问题。
我在知识与高手有差距  在努力程度上也有差距   感叹。谢谢blackeyes

回到问题经过指点 OD跟了以后,我又产生疑问:
1,在跟踪的时候,Alt+F9不是回到用户空间吗?问什么我这样不能到达SEH的代码段啊?
2,单步跟会导致00405B0E-00405B90之间的代码执行不到,这个是为什么?
可能这样的问题在高手看来有点不该提,可是本人天资钝愚。
还望朋友们不吝赐教!!谢谢!!
2008-4-6 11:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
不知道为什么我单步没有出现楼主所说的情况。很顺利的到达oep啊!
2008-4-6 16:33
0
雪    币: 224
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
10
不是到不了oep,是想知道暗桩的原理!
你没有出现这样的情况。楼上是不是忽略异常了。
麻烦把你的过程贴出来看看。学习下。
2008-4-6 19:40
0
雪    币: 295
活跃值: (346)
能力值: ( LV9,RANK:530 )
在线值:
发帖
回帖
粉丝
11
1. Alt+F9应该是在无Exception 的时候才对;
2. 单步时, OD会在每一步代码都产生一单步异常, 由OD自己处理, 应该是处理指令结果, 刷新OD的各个窗口, 然后让程序停在下一句; 若程序代码也产生了单步异常, OD 还是按是自己产生的单步异常来处理, 因为它分不清是自己产生的还是程序故意产生的. 可以这么说, 单步异常全是给调试器用的, 若程序代码主动导致的单步异常,则都是反调试的.
2008-4-7 14:00
0
雪    币: 224
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
12
谢谢blackeyes的再次解答!
使得我突然明白了---单步异常全是给调试器用的, 若程序代码主动导致的单步异常,则都是反调试的。这下心中的迷惑算是清楚了。

后来我又跟了几遍,对这个程序的壳的流程总算比较清楚了。
00405B1C  ^ 0F84 C2FDFFFF   je      004058E4                    // 最终由这跳回4058E4继续执行
这句也是关键,我今天跟差点有迷糊了。幸亏看了be回帖。  原来已经说清楚了。
再次感叹自己与高手的差距。
2008-4-8 14:47
0
雪    币: 266
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
0040D015 83C4 08 add esp, 8 我们被带到这里。
0040D018 6A 10 push 10
0040D01A 8BD8 mov ebx, eax
0040D01C 66:05 2D00 add ax, 2D
0040D020 50 push eax
0040D021 52 push edx
0040D022 6A 00 push 0
0040D024 8B1B mov ebx, dword ptr ds:[ebx] ebx中被放入40d047
0040D026 FF13 call dword ptr ds:[ebx] 再次单步异常。 这个单步异常怎么跳过呢
0040D028 6A FF push -1
0040D02A FF53 0C call dword ptr ds:[ebx+C]

0040D047 0000 add byte ptr ds:[eax], al 到哪里一看,空地址无代码,陷阱。
0040D049 0000 add byte ptr ds:[eax], al
0040D04B 0000 add byte ptr ds:[eax], al
0040D04D 0000 add byte ptr ds:[eax], al
0040D04F 0000 add byte ptr ds:[eax], al
0040D051 0000 add byte ptr ds:[eax], al
2008-7-3 14:43
0
游客
登录 | 注册 方可回帖
返回
//