首页
社区
课程
招聘
[讨论]2次内存断点法寻找OEP
发表于: 2006-12-11 14:43 5227

[讨论]2次内存断点法寻找OEP

2006-12-11 14:43
5227
拜读了 Lenus 的<<用内存断点找OEP>>(本版置顶帖,看雪老大的新手教程),对文中unpackme的一点疑惑

大体概述一下2次内存断点法,加壳的程序必定要经过解压过程才能够执行,所以我们就在code段解压缩完毕之后,利用对code段的内存访问断点把oep拦下来,而程序在内存中解压缩的过程是属于内存写入,过程往往是先解压缩code段,接着data段(当然也可能是其他段),所以我们在code段之后的段下内存写入断点,就可以停在code段解压完毕的一刻,此时再对code段下内存访问断点,很容易就能找到oep.

我对文中unpackme的脱壳过程,与作者不同,我忽略了所有异常.对data段下内存写入断点,停在这里:

00392712    F3:A4           rep     movs byte ptr es:[edi], byte ptr>
00392714    5E              pop     esi
00392715    53              push    ebx
00392716    68 00800000     push    8000
0039271B    6A 00           push    0
0039271D    56              push    esi
0039271E    FF95 00070000   call    [ebp+700]
00392724    5B              pop     ebx
00392725    83C3 0C         add     ebx, 0C
00392728  ^ EB B3           jmp     short 003926DD

继续对code段下内存访问断点,停在这里:

00392855    8907            mov     [edi], eax                       ; SHELL32.DragFinish 这里有函数说明,多按几次F9可以看到更多函数,我的理解是code段还在解压过程中
00392857    5A              pop     edx
00392858    0FB642 FF       movzx   eax, byte ptr [edx-1]
0039285C    03D0            add     edx, eax
0039285E    42              inc     edx
0039285F    83C7 04         add     edi, 4
00392862    59              pop     ecx
00392863  ^ E2 A9           loopd   short 0039280E
00392865  ^ E9 63FFFFFF     jmp     003927CD
0039286A    8BB5 93060000   mov     esi, [ebp+693]

我删除了code段内存断点,用F8单步跟踪,发现写入一个函数的完整工程需要执行一个loop,也就是

00392863  ^ E2 A9           loopd   short 0039280E
00392865  ^ E9 63FFFFFF     jmp     003927CD

这两个跳,那现在就F4到
0039286A    8BB5 93060000   mov     esi, [ebp+693]
跳出这个循环

之后F8单步跟踪一小会儿,就发现了
0039298C  - FFE0            jmp     eax                              ; unpackme.004010CC
0039298E    50              push    eax
0039298F    60              pushad

众所周知4010CC是记事本的OEP,但是跟踪过去发现
004010CC    FFD7            call    edi                              ; unpackme.004010CE
004010CE    58              pop     eax
004010CF    83EC 44         sub     esp, 44
004010D2    56              push    esi
004010D3    90              nop
004010D4    E8 B518F9FF     call    0039298E

这样的OEP的代码我不认识,如果不是事先知道4010CC是记事本的OEP那单步跟踪很可能就继续往下,虽然比较明显的一个跨段跳之后可能会怀疑.所以这里就有一个疑问,高手们,你们如何判断OEP的特征的?

Lenus说代码段的第一次内存执行访问,我不是很理解,希望有高手赐教.还有,看了不少关于stolen code的帖子,恕我愚钝,还是不知道怎么判断哪个是OEP入口代码是不是被偷换了.

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
2
如你所见了,在4010CC处DUMP,肯定不行。你必须跟进那个CALL,还有就是当前EDI值是如何得出的。

OEP被偷了还好,碰上多态的更难搞懂

ASProtect SKE Unpacking Approach 98dK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3q4J5N6r3g2S2L8g2)9J5k6h3q4U0j5$3g2K6M7%4u0G2L8%4c8Q4x3X3g2U0L8$3#2Q4x3V1k6@1N6i4c8G2M7X3W2S2L8s2y4Q4x3X3g2Z5N6r3#2D9i4K6y4r3k6X3W2V1i4K6y4p5x3e0j5`.

有兴趣可以看看这个,讲的是变形了的OEP,更加难认了。

个人认为第二次内存断点,是在内存窗口,在CODE段按F2下的断点。

原理是页面保护,将CODE段设置为不可运行。这样当EIP在CODE段范围就会引发内存访问异常,调试器获得控制权。

楼主很久不见了,刚注册时看到你的几个帖,让我少走很多弯路呢。有兴趣去看看新手区的新兵训练场,虽然暂时还没讲到脱壳。
2006-12-11 15:06
0
雪    币: 207
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
实在惭愧
好,我去看看,有地方交流就是好,现在是蚂蚁啃大山,不知道从哪里下口呢
2006-12-11 15:15
0
游客
登录 | 注册 方可回帖
返回