首页
社区
课程
招聘
新兵训练场第二期(12.7更新,第三题改掉)
2006-11-29 00:28 21335

新兵训练场第二期(12.7更新,第三题改掉)

2006-11-29 00:28
21335
收藏
点赞7
打赏
分享
最新回复 (43)
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-30 23:26
26
0
回25楼:

第一题的提示中,我给了两个连接,第一个连接是我写的一篇PEDIY的教学文章,其中就有简单描述过如何利用消息环定位相关MENU或者BUTTON的WM_COMMAND(即点击)处理代码的过程。

我在那篇文章只是定位消息处理代码,然后为我添加的BUTTON增加功能。该方法同样也可以用于定位其他BUTTON的处理流程。

我希望你真的有看过我给出的提示

第三题也是一样,看看我更新后的提示吧。难点只是找OEP而已。假如你通过了第一期的第三个问,只要再看看别的程序(没加壳的)的OEP是怎么样的,根本没有什么难度。完全不需要什么PE知识。只是训练另一种定位目标代码的方法,另外希望通过这个训练,让大家学会总结代码特征,以便下次碰到能快速识别。

我暂时还没打算教大家脱壳,我自己也没学好,我只是在训练大家的基本功而已。最后我希望大家都记住我每期开头的那句话。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-12-1 23:47
27
0
经过两天来的充电,一番奋战,终于对老大所讲的“如何利用消息环定位相关MENU或者BUTTON的WM_COMMAND(即点击)处理代码的过程”有了一些认识,把第一题的的第三种方法找出来了,敬请大家指正

第一题
3、
先用资源工具reshacker把菜单栏中暂停?的ID看出来,为2202(其实也可不必的):
POPUP "调试(&D)"
{
        MENUITEM "运行(&R)\tF9",  2201
        MENUITEM "暂停(&P)\tF12",  2202
        MENUITEM "重新开始(&S)\tCtrl+F2",  2203
        MENUITEM "关闭(&C)\tAlt+F2",  2204
        MENUITEM SEPARATOR
        MENUITEM "单步步入(&I)\tF7",  2205
……
然后用命令bpx enablemenuitem下断点,按alt+B可以看到Breakpoints表有二十来多处用到这个断点的
先全部禁用,然后按F9运行被调试的OD,用这个被调试的OD打开一个程序,按F9运行,然后回到第一个OD,把这些禁用的断点全部激活→切换到第二个OD中,点主菜单“调试”,即断下,来到004335C4 :
004335BD  |> \52            push    edx                              ; /Flags
004335BE  |.  68 3B080000   push    83B                              ; |ItemID = 83B (2107.)
004335C3  |.  53            push    ebx                              ; |hMenu
004335C4  |.  E8 15BE0700   call    <jmp.&USER32.EnableMenuItem>     ; \EnableMenuItem
004335C9  |.  B9 01000000   mov     ecx, 1
……
0043362C  |> \52            push    edx                              ; /Flags
0043362D  |.  68 9A080000   push    89A                              ; |ItemID = 89A (2202.)
00433632  |.  53            push    ebx                              ; |hMenu
00433633  |.  E8 A6BD0700   call    <jmp.&USER32.EnableMenuItem>     ; \EnableMenuItem
……
00433808  |.  68 C8090000   push    9C8                              ; |ItemID = 9C8 (2504.)
0043380D  |.  53            push    ebx                              ; |hMenu
0043380E  |.  E8 CBBB0700   call    <jmp.&USER32.EnableMenuItem>     ; \EnableMenuItem
00433813  |.  E9 2F0A0000   jmp     00434247
00433818  |>  8BCB          mov     ecx, ebx                         ;  Case 111 (WM_COMMAND) of switch 004323ED

可以看到,主菜单上的多个键ID都在这里,它们由Case 111 (WM_COMMAND) of switch 004323ED进行处理,(还有一些由系统默认处理了,如打开、关闭、放大等,所以说是多个键,而不是全部键在这里)
因此,我们在00433818处下断,而把其它断点禁用,按F9运行,切换第二个OD,在“调试”中点暂停,即断在433818处,按F8,一直前进,来到00433CB3处:
00433C9C  |> \6A 00         push    0                                ; /Arg1 = 00000000; Case 89A of switch 0043382F
00433C9E  |.  E8 35DEFFFF   call    _Animate                         ; \_Animate
00433CA3  |.  59            pop     ecx
00433CA4  |.  833D 5C5A4D00>cmp     dword ptr [4D5A5C], 3
00433CAB  |.  0F85 61050000 jnz     00434212
00433CB1  |.  6A 01         push    1                                ; /Arg1 = 00000001
00433CB3  |.  E8 D8050000   call    _Suspendprocess                  ; \_Suspendprocess

在00433CB3 中按F7进入,即来到_Runsinglethread

00434290 >/$  55            push    ebp
00434291  |.  8BEC          mov     ebp, esp
00434293  |.  83C4 F8       add     esp, -8
00434296  |.  53            push    ebx
00434297  |.  56            push    esi
00434298  |.  57            push    edi
00434299  |.  BB FC564D00   mov     ebx, 004D56FC
0043429E  |.  6A 00         push    0                                ; /Arg1 = 00000000
004342A0  |.  E8 E3440400   call    _Runsinglethread                 ; \_Runsinglethread
004342A5  |.  59            pop     ecx

哎,其实现在想起来,也挺简单的啊
头有点晕了,休息下先 
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-3 00:00
28
0
27楼答对了

WM COMMAND其实就是只要你点MENU或者BUTTON,程序都会收到这个消息。所以不需要MENU或者BUTTON的ID。

只要定位出WNDPROC就OK了。定位WNDPROC的方法主要看类的注册API,或者通过其他功能来定位。例如“附加”,我知道点那个MENU的时候会打开一个窗口,那么我在建立窗口的API下断,然后通过堆栈找到返回地址,一层一层向上找就OK了

找到比较是否为WM COMMAND的位置,假设WM COMMAND为真,就会跳到处理该消息的代码,在该代码下断,你点某一个MENU或者BUTTON,就会断下,然后一直单步,就可以到达处理该MENU或者BUTTON的代码了。

这个方法是很简单,不过新手只知道字符参考,没有字符参考就不知道怎么做了。水平高点的,在GETWINDOWTEXT或者GETDLGITEMTEXT下断,假如程序检查这些API的内部是否被下断(BP实际就是在该API里面插入CC,即INT3),又或者打开USER32。DLL,通过导出表找到该API的代码,读到程序空间使用。

无论如何,通过这题的测试,你以后就不需要发帖问“为什么XXX断不下来啊?”“XXX该怎么下断?”
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-12-3 00:08
29
0

呵呵,多谢老大的指点。对于这道题,解决之后,再来看,果然思路清晰多了。确实得到了锻炼啊
多谢多谢
雪    币: 256
活跃值: (230)
能力值: ( LV12,RANK:770 )
在线值:
发帖
回帖
粉丝
qiweixue 19 2006-12-5 08:50
30
0
我也是入门的学生...
请斑竹多多照顾
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
由唳 2006-12-5 19:21
31
0
我还在充电中
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-12-5 19:33
32
0
革命尚未成功,同志仍须努力
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-5 21:52
33
0
最后一题用不着这么久吧?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-12-5 23:47
34
0
先看几天加壳与脱壳的教程再来解呀
现在分析似乎不得要领,连老大给的参考链接都不是很明白的
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-5 23:56
35
0
不用分析

ATTACH=附加功能

先运行程序,然后附加,打开线程窗口,切换到主线程,通过看堆栈的返回地址,一层一层向上寻找OEP

不明白是因为不知道要切换线程吧?调试器附加程序时会额外产生一条线程的,然后停在该新线程位置。
雪    币: 1969
活跃值: (46)
能力值: (RANK:550 )
在线值:
发帖
回帖
粉丝
hawking 12 2006-12-7 16:02
36
0
跟着学习了一遍,感觉很多基础的东东又多了一份了解。严重期待第3期......
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-7 16:45
37
0
晕了,忘记程序有ANTI DUMP要处理

不好意思,现在改改题目
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-12-7 23:42
38
0
第三题在经过老大35楼的指点后,才知道原来还有主线程啊,很多资料怎么都没提到呢。不过,仍然做不出来,原来是有ANTI DUMP要处理啊。也间接说明了我水平还很差劲的
下面是针对修改问题后的一部分回答,还不是很确定:
用OD加载MSLRHv0.32a,按ALT+F9来到00452607
此处的上上下下就是很多的花指令:
00452607    C00F B6                 ror     byte ptr [edi], 0B6
……
00452613    EB 05                   jmp     short 0045261A
00452615    E8 EB044000             call    00852B05
0045261A  ^ EB FA                   jmp     short 00452616
0045261C    E8 0A000000             call    0045262B
00452621    E8 EB0C0000             call    00453311
00452626    E8 F6FFFFFF             call    00452621
0045262B    E8 F2FFFFFF             call    00452622
00452630    83C4 08                 add     esp, 8
00452633    74 04                   je      short 00452639
00452635    75 02                   jnz     short 00452639
00452637    EB 02                   jmp     short 0045263B
00452639    EB 01                   jmp     short 0045263C

其配置文件的主要内容如:
 
S = EB05??????????
R = 90909090909090

S = E80A000000??EB0C????E8F6FFFFFFE8F2FFFFFF83C408
R = 9090909090909090909090909090909090909090909090

S = 74047502????EB01??
R = 909090909090909090
我想,基本上是这样的吧
不知对老大的题意是否理解正确,还请指教
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-8 00:09
39
0
第三题主要就是让大家熟悉一下插件的。现在改成熟悉去花指令的插件了。没有正确不正确的,主要就是要学会用。

一般是先跟一次,大概了解哪里是垃圾代码,哪里不是。然后将垃圾全部变成90。

分析到程序自校验的地方,使用花指令插件的还原功能,过了自校验再继续去花指令继续分析。

不过这个技能也不是必须掌握的,只是看着舒服。另外问号别用太多了。要不容易把正常代码给覆盖了

准备一下第三期
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
由于 2006-12-8 08:47
40
0
最初由 笨笨雄 发布
第三题主要就是让大家熟悉一下插件的。现在改成熟悉去花指令的插件了。没有正确不正确的,主要就是要学会用。

一般是先跟一次,大概了解哪里是垃圾代码,哪里不是。然后将垃圾全部变成90。

分析到程序自校验的地方,使用花指令插件的还原功能,过了自校验再继续去花指令继续分析。
........


其实最好有个操作教程,有一些图片还是必要的,不然象我等老菜是有看没有懂
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-8 12:46
41
0
最初由 由于 发布
其实最好有个操作教程,有一些图片还是必要的,不然象我等老菜是有看没有懂


这个插件不复杂啊

试着用,总不能有什么好东西出现,都要特地写一篇教程出来吧?
雪    币: 350
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
要学会编 2006-12-18 04:45
42
0
花了十个小时的时间,终于把第一期第一题弄明白了,不是一般的明白,跟带着连题目相关的指令 堆栈 伪操作符 也都明白了。
学汇编,真是看懂单条指令容易,读懂整段代码难啊。先把这第二期找出来,做个记号
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-12-18 10:32
43
0
搞清楚全局变量和局部变量就OK了,从已知发掘未知
雪    币: 249
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pwangeng 2010-2-24 19:27
44
0
用peid大开OD,然后子系统->输入表找遍了各个dll都没发现_Runsinglethread,那如何理解“一般情况,已脱壳或无壳的程序调用的API都在输入表中。”? 或者此处其实应该差看输出表呢?
游客
登录 | 注册 方可回帖
返回