找回密码
 立即注册
查看: 2211|回复: 2

内存断点原理4

[复制链接]

19

主题

167

回帖

1830

积分

高级会员

积分
1830
命运舞姬 发表于 2015-6-25 08:50:51 | 显示全部楼层 |阅读模式
vi.下面来讨论一下内存断点的局限性问题。
是不是什么壳都可以用内存中断啊?
不是每个都可以的,一些像UPXASPACK就不行。
为什么?
呵呵~follew me
情况1.
我们来看看UPX的壳

首先,他的壳代码在UPX1段。

这里是他要跳到OEP的地方



CODE:


0040ED4F /77 11    ja short NOTEPAD_.0040ED62   
0040ED51 |01C3    add ebx,eax
0040ED53 |8B03    mov eax,dword ptr ds:[ebx]
0040ED55 |86C4    xchg ah,al
0040ED57 |C1C0 10    rol eax,10      //
在解码
0040ED5A |86C4    xchg ah,al
0040ED5C |01F0    add eax,esi
0040ED5E |8903    mov dword ptr ds:[ebx],eax
0040ED60 ^|EB E2    jmp short NOTEPAD_.0040ED44
0040ED62 \24 0F    and al,0F
0040ED64 C1E0 10    shl eax,10
0040ED67 66:8B07    mov ax,word ptr ds:[edi]
0040ED6A 83C7 02    add edi,2
0040ED6D ^ EB E2    jmp short NOTEPAD_.0040ED51 //
回跳解码
0040ED6F 61    popad
0040ED70 - E9 5723FFFF jmp NOTEPAD_.004010CC    //
跳到OEP


[Copy to clipboard]


我们看到他在对code段解压完毕的时候马上就JMPOEP去了,那么我们根本就来不及使用内存断点的办法。

你可能说,我可以在

0040ED6F 61    popad //
这一句下段然后使用啊

呵呵~~当然可以,不过你把花在下内存断点的时间,多按下几次F8不更好?!

也就是说当一个壳如果他在JMP OEP前的一行代码仍在都在对code段解压,那么我们就不能再使用这种办法了!

或者说我们没必要使用内存断点更贴切一点!

情况2.
对于一些在OEP处有stolen code的代码
我们来看看一个OEP



CODE:


0049E2F4 u> 55    push ebp       //OEP
0049E2F5 8BEC    mov ebp,esp
0049E2F7 83C4 F4    add esp,-0C
0049E2FA B8 BCE04900 mov eax,unpack.0049E0BC
0049E2FF E8 048CF6FF call unpack.00406F08     //
这里调用子程序
0049E304 A1 B8FE4900 mov eax,dword ptr ds:[49FEB8]
0049E309 50    push eax
0049E30A 6A 00    push 0
0049E30C 68 1F000F00 push 0F001F
0049E311 E8 E68EF6FF call <jmp.&kernel32.OpenFileMappingA> //API
0049E316 A3 60194A00 mov dword ptr ds:[4A1960],eax
0049E31B 833D 60194A00 00 cmp dword ptr ds:[4A1960],0


[Copy to clipboard]
这个软件在被PESPIN加壳了以后这些全被偷掉了!

也就是说,壳在模拟OEP代码的时候必然会执行



QUOTE:


0049E2FF E8 048CF6FF call unpack.00406F08 //
这一步


而这个地方是callcode段的。如果我们使用内存访问断点,那么就停在这个子程序的地方



CODE:


00406F08 50    push eax        //
会停在这里
00406F09 6A 00    push 0
00406F0B E8 F8FEFFFF call <jmp.&kernel32.GetModuleHandleA>
00406F10 BA 04F14900 mov edx,unpack.0049F104
00406F15 52    push edx


[Copy to clipboard]


这里既不是处理stolen code的地方,也不是FOEP的地方。这就会对我们的判断产生误导。

当然你可以alt+F9返回到壳处理stolen的地方,然后用内存断点,或者按几下F8到达FOEP处,但试问如果你拿到一个未知的壳的时候又怎么知道应该这么处理呢?

还有其他一些情况留给大家总结吧!
在下的砖已抛出,各位的玉不久矣。

3.
总结:
好了说了很多,大家应该对内存断点的办法有了全面的了解,如果了解了内存断点的原理就不难明白他的使用方法,不难明白为什么有写壳不能使用内存断点的办法,其实任何的一种办法都需要经验的积累。相信如果大家在回答开篇的3个问题,已经不难了。

60

主题

508

回帖

5470

积分

钻石会员

学无止境

积分
5470

卓越会员

QQ
海潮 发表于 2015-6-25 13:38:05 来自手机 | 显示全部楼层
沙发~学习
回复

使用道具 举报

2

主题

43

回帖

60

积分

注册会员

积分
60
332936 发表于 2017-12-15 11:32:33 | 显示全部楼层
每天坚持学习,慢慢进步,加油!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|虫虫联盟 ( 备案号:蜀ICP备15018121号-1 )

GMT+8, 2026-4-20 15:20 , Processed in 2.430242 second(s), 27 queries .

Powered by Discuz! X5.0 Licensed

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表