首页
社区
课程
招聘
传说中的最新脱壳方法<结构化异常断点法>
发表于: 2012-5-24 21:30 4756

传说中的最新脱壳方法<结构化异常断点法>

2012-5-24 21:30
4756
PS:不是原创,见到好的就通通共享上来了,资源区都快发满了,有朋友有意见了,所以暂时转移。

下面是正题:

                           结构化异常断点法

首先使用这个方法的前提条件是,我们再入夹克程序的时候前面几句代码大致如下:
并且我们在OD的调试设置里面需要设置一下,非法访问内存前面的勾要去掉。

0044B968 >  B8 CCE15600     mov eax,NSPACK2_.0056E1CC ; hadler,发生异常后到这个地址执行 向堆栈中压入当前异常处理回调函数地址hander(底下发生内存访问异常,将会调用这个函数)
0044B96D    50              push eax
0044B96E    64:FF35 0000000>push dword ptr fs:[0]
0044B975    64:8925 0000000>mov dword ptr fs:[0],esp      ; 构造一个ERR结构
0044B97C    33C0            xor eax,eax
0044B97E    8908            mov dword ptr ds:[eax],ecx   ; 这里发生异常,非法访问内存,//来到这里的时候,就走不动了,然后观察最下边的提示:

也就是我们说的非法访问内存。因为在NT架构下,0—FFFFh,这个地址空间是禁止进入的,就像我们平时生活,有时候走到危险地段,或者军事要地,秘密地段,也会有一个牌子提示禁止入内,如果你非要闯进去,当你被逮着的时候,保安或者警察就会说,你这是违反法律法规,或者规章制度,当然你是初犯,他们会给你一个改过自新的机会,放你走。

由上面的代码知,bp  0056E1CC(这个地址是第一句mov的地址) ,shift+F9运行到该断点

0056E1CC    B8 D3CF56F0     mov eax,F056CFD3
0056E1D1    8D88 1C120010   lea ecx,dword ptr ds:[eax+1000121C]
0056E1D7    8941 01         mov dword ptr ds:[ecx+1],eax
0056E1DA    8B5424 04       mov edx,dword ptr ss:[esp+4]
0056E1DE    8B52 0C         mov edx,dword ptr ds:[edx+C]
0056E1E1    C602 E9         mov byte ptr ds:[edx],0E9
0056E1E4    83C2 05         add edx,5
0056E1E7    2BCA            sub ecx,edx
0056E1E9    894A FC         mov dword ptr ds:[edx-4],ecx
0056E1EC    33C0            xor eax,eax
0056E1EE    C3              retn   //我们运行到这里,然后对这句代码下一句代码下断点
0056E1EF    B8 78563412     mov eax,12345678  //F2下端点。
0056E1F4    64:8F05 0000000>pop dword ptr fs:[0]
0056E1FB    83C4 04         add esp,4

这段代码就是处理这个异常的代码,处理完成之后他会返回到系统领空,所以我们需要对retn下一句代码下端点,SHIFT+f9,运行到这里,然后取消断点,在这里大家可能会问,你怎么知道在retn下一句代码下端点呢???告诉你,因为结构化异常处理代码(也就是retn上面的几句代码,你分析一下就知道要对这句代码下断点了,因为那几句代码已经把要跳到那里继续执行的地址显示出来了)

为了照顾大部分人,我还是把分析贴出来:
0056E1CC    B8 D3CF56F0     mov eax,F056CFD3         ; eax=F056CFD3
0056E1D1    8D88 1C120010   lea ecx,dword ptr ds:[eax+1000121C]  ; ecx=0056e1ef(这一个地址就是我们需要下断点的地址了)
0056E1D7    8941 01         mov dword ptr ds:[ecx+1],eax    ; 改写我们需要下断点的地址处的操作数,注意我们将要下断点处的操作数变化
0056E1DA    8B5424 04       mov edx,dword ptr ss:[esp+4]
0056E1DE    8B52 0C         mov edx,dword ptr ds:[edx+C]
0056E1E1    C602 E9         mov byte ptr ds:[edx],0E9         ; 将我们发生异常处的指令改成jmp
0056E1E4    83C2 05         add edx,5
0056E1E7    2BCA            sub ecx,edx
0056E1E9    894A FC         mov dword ptr ds:[edx-4],ecx
0056E1EC    33C0            xor eax,eax
0056E1EE    C3              retn
那么我们继续对刚才得到的地址下端点,然后运行到此处

0056E1EF    B8 D3CF56F0     mov eax,F056CFD3 //来到这里
0056E1F4    64:8F05 0000000>pop dword ptr fs:[0]
0056E1FB    83C4 04         add esp,4
0056E1FE    55              push ebp
0056E1FF    53              push ebx
0056E200    51              push ecx
0056E201    57              push edi
0056E202    56              push esi
0056E203    52              push edx
0056E204    8D98 D5110010   lea ebx,dword ptr ds:[eax+100011D5]
0056E20A    8B53 18         mov edx,dword ptr ds:[ebx+18]
0056E20D    52              push edx
0056E20E    8BE8            mov ebp,eax
0056E210    6A 40           push 40
0056E212    68 00100000     push 1000
0056E217    FF73 04         push dword ptr ds:[ebx+4]
0056E21A    6A 00           push 0
0056E21C    8B4B 10         mov ecx,dword ptr ds:[ebx+10]
0056E21F    03CA            add ecx,edx
0056E221    8B01            mov eax,dword ptr ds:[ecx]
0056E223    FFD0            call eax
0056E225    5A              pop edx
0056E226    8BF8            mov edi,eax
0056E228    50              push eax
0056E229    52              push edx
0056E22A    8B33            mov esi,dword ptr ds:[ebx]
0056E22C    8B43 20         mov eax,dword ptr ds:[ebx+20]
0056E22F    03C2            add eax,edx
0056E231    8B08            mov ecx,dword ptr ds:[eax]
0056E233    894B 20         mov dword ptr ds:[ebx+20],ecx
0056E236    8B43 1C         mov eax,dword ptr ds:[ebx+1C]
0056E239    03C2            add eax,edx
0056E23B    8B08            mov ecx,dword ptr ds:[eax]
0056E23D    894B 1C         mov dword ptr ds:[ebx+1C],ecx
0056E240    03F2            add esi,edx
0056E242    8B4B 0C         mov ecx,dword ptr ds:[ebx+C]
0056E245    03CA            add ecx,edx
0056E247    8D43 1C         lea eax,dword ptr ds:[ebx+1C]
0056E24A    50              push eax
0056E24B    57              push edi
0056E24C    56              push esi
0056E24D    FFD1            call ecx
0056E24F    5A              pop edx
0056E250    58              pop eax
0056E251    0343 08         add eax,dword ptr ds:[ebx+8]
0056E254    8BF8            mov edi,eax
0056E256    52              push edx
0056E257    8BF0            mov esi,eax
0056E259    8B46 FC         mov eax,dword ptr ds:[esi-4]
0056E25C    83C0 04         add eax,4
0056E25F    2BF0            sub esi,eax
0056E261    8956 08         mov dword ptr ds:[esi+8],edx
0056E264    8B4B 10         mov ecx,dword ptr ds:[ebx+10]
0056E267    894E 24         mov dword ptr ds:[esi+24],ecx
0056E26A    8B4B 14         mov ecx,dword ptr ds:[ebx+14]
0056E26D    51              push ecx
0056E26E    894E 28         mov dword ptr ds:[esi+28],ecx
0056E271    8B4B 0C         mov ecx,dword ptr ds:[ebx+C]
0056E274    894E 14         mov dword ptr ds:[esi+14],ecx
0056E277    FFD7            call edi
0056E279    8985 C8120010   mov dword ptr ss:[ebp+100012C8],eax
0056E27F    8BF0            mov esi,eax
0056E281    59              pop ecx
0056E282    5A              pop edx
0056E283    EB 0C           jmp short NSPACK2_.0056E291
0056E285    03CA            add ecx,edx
0056E287    68 00800000     push 8000
0056E28C    6A 00           push 0
0056E28E    57              push edi
0056E28F    FF11            call dword ptr ds:[ecx]
0056E291    8BC6            mov eax,esi
0056E293    5A              pop edx
0056E294    5E              pop esi
0056E295    5F              pop edi
0056E296    59              pop ecx
0056E297    5B              pop ebx
0056E298    5D              pop ebp
0056E299    FFE0            jmp eax

F8单步向下走,我们会看到三个call 寄存器的,不管他,继续走,直到看到一个jmp eax,这里就是跳向OEP了

相关附件下载地址:http://115.com/file/bejji7wf#

[课程]Linux pwn 探索篇!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 13
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
不是最新的,很老了。PECompact壳的一种
2012-5-29 19:33
0
雪    币: 1844
活跃值: (35)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
3
旧的也不会,新的更加接受不了
2012-5-29 19:40
0
游客
登录 | 注册 方可回帖
返回
//