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

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

2006-11-29 00:28
21334
第三期 链接:
http://bbs.pediy.com/showthread.php?s=&threadid=36112

更多的提示:

关于第一题:第二问,4楼。

正确答案:

第一题,第一问,2楼
第二问,20楼
第三问,27楼,28楼

第二题,22楼

第三题,38楼,39楼

第一题:

在OD里有一个导出函数,叫_Runsinglethread。

用以下3种方法去定位它的代码,请给出详细过程

1 通过PE工具
2 通过相关函数下断
3 通过跟踪消息处理程序定位(我不会用消息断点,如果你会也可以这么做)

关于后两种方法,漏了说。加载OD后,用该OD加载程序,运行,然后主菜单选择“暂停”,如果是第二种方法,你找对API下断了,就能停在Runsinglethread内部。如果是第三种方法可以找到_Suspendprocess跟进里面就能找到_Runsinglethread了。

http://bbs.pediy.com/showthread.php?s=&threadid=35465

看完这个贴,解决第二第三问应该没问题了。

第一问主要考察对PE工具运用的

第二问主要考察你能否通过函数名或者说程序某个功能表现来判断程序用了哪些API,并且通过在那些API下断来定位目标代码。

第三问主要考察你对消息环的了解,这是系统最常用的机制,要了解,并且学会利用它找到目标代码。你可能需要在下面链接

http://bbs.pediy.com/showthread.php?s=&threadid=14164

“WINDOWS编程类”=>“Win32 ASM Tutorial Resource Kit”=>“罗云彬的32位汇编教程”=>“第4章 第一个窗口程序 ”

第二题:

给出_Runsinglethread的分析过程

这次是实际分析了,你必须要通过上下文来理解它。如何做才不至于迷失在代码海里?这是我希望你能掌握的东西。

第三题:

http://emadicius.rvlcnsecurity.com/programas/MSLRHv0.32a.zip

我忘记了这个壳有ANTI DUMP要处理,对于新手可能有点难吧。现在的题目改为:

打开该壳,跟一会之后就可以看到大量很有规律的花指令,其中有一些时间校验。使用OD的花指令去除器,将这些花指令去除,并将其配置文件的主要内容复制到论坛上回帖。

在OD的PLUGIN目录(插件目录),打开DEJUNK.INI。里面有该插件的详细使用方法。

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

收藏
点赞7
打赏
分享
最新回复 (43)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
FTDreamer 2006-11-29 12:17
2
0
一.
1.用PEiD打开OD,  Subsystem>ExportTable>_Runsinglethread
RVA 78788
所以地址是0x478788

后面两种方法都不会...
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-11-29 12:35
3
0
第一题
2、加载自己后,按ctrl+N键,打开程序调用API窗口,找到_Runsinglethread,双击就能来到程序调用地址处。然后用F2下断点。 
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-29 12:46
4
0
汗啊,跟我想的不一样,CTRL+N的功能我都忘记很久了。。。

第一题第二个问,我是希望你们通过观察那个导出函数,估计里面用了什么API,然后通过API下断,找到该导出函数的

程序大部分功能都是通过系统提供的API来实现的,所以要会功能来判断程序究竟用了什么API,然后才好下断

第三个问其实是考察大家对消息环的理解。因为WINDOWS下的程序都是以消息驱动的,有的按钮,例如功能设置什么的,只需要改变全局变量,这个时候用API下断是断不下来的。

举个例吧,假如程序里面提供软键盘的功能,只有点特定的BUTTON才能输入密码,这样你在GETWINDOWTEXT下断(或类似功能的API),就断不下来了。虽然暂时还没有这样的程序,但是我们必须针对各种可能的情况。而且这个也是系统之中用得最普遍的机制了,基础之中的基础。
雪    币: 2506
活跃值: (995)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
CCDebuger 24 2006-11-29 13:03
5
0
看了两期的题目,感觉对新手来说过难了。何为新手?在我看来,我最多认为他掌握了一些必要的汇编知识。对于这样的新手,你不能一上来就让他分析某个函数,分析某段算法,脱某个保护壳。分析一个函数的功能前提是要有编程知识;分析某段算法的前提是要对汇编指令非常熟悉,了解每个指令的功能,并能从整体上抽象出算法的原型;脱某个保护壳要求熟悉PE结构,了解一般壳的流程,知道如何设置不同的断点找到关键的地方。
在我看来新手要了解的是目标程序是什么语言写的?有何对应的工具分析?是否有壳?如果有壳在自己的能力范围内或目前的工具是否能解?程序的注册保护方式大致是什么样?序列号还是keyfile?如何能设置合适的断点断在关键位置?是否容易爆破?爆破的关键点是哪?算法的部分在哪里?在自己能力范围内是否能理解算法?
我认为分析软件的关键是如何能定位到合适的位置,至于分析,那是体力活及相关知识的运用。对于新手你应该训练的就是如何让他能定位到关键位置,这是第一步,也是最重要的一步。
以上纯属个人观点,仅供参考。
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-29 13:41
6
0
回5楼

关于汇编指令的问题,我已经把INTEL参考手册的链接放上去了,每条指令的工作方式,手册上都有详细文字描述,和简明的代码描述了。只要有耐性看看英文,应该没问题的。操作系统,硬件什么的,全是外国人的东西,习惯看英文资料是有必要的。

至于编程知识方面,我想这在他们看汇编教程的时候已经有个大概了解。这里是教逆向的,而不是教编程的,总不能题目是让他们写个小程序出来吧?虽然我不是计机专业的,但是我知道正规计机考试的笔试或者课后习题里面,都有给出一大段高级语言代码,让你分析该代码的功能和输出结果的。

可能第一期一二题看起来有点难了,一个是NATIVE API,RING 0的东西,另外一个是位操作算法,按C语言的教程的话来说“C语言也被称为中间语言,因为位操作”,也就是说位操作是一个难点。高级语言通过提供链接库,让程序员感觉不到还需要位操作,但是我们逆向分析的呢?假如没有该链接库各输出函数的说明,那他们该怎么办呢?又该什么时候教会他们?

至于脱那个壳。说是保护壳,其实也就一压缩壳,UPX内核,用ATTACH法可以直接秒的。第二期的第三题是作为第一期第三题的延续,通过查找返回地址找出OEP。然后用OD的插件DUMP下来就可以了。

最后,我不会破解,只会逆向,我希望能完成该训练场系列的人具备以下能力:

1 一定的静态分析能力
2 了解最基本的系统机制
3 懂得如何查找资料更进一步学习
4 勇于探索,勇于向未知挑战。

如何定位目标代码,这期内容的第一题就是了。至于如何做简单的爆破,我认为看雪出的几本书和你的OLLYDBG教程已经写得足够详细了。如果有人提出那种问题,我会给出链接建议他们去看的。
雪    币: 200
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
jiegou 2006-11-29 13:44
7
0
很支持!CCDebuger超级版主的观点。

这三个疑问是我最关心的。

如何能设置合适的断点断在关键位置?

算法的部分在哪里?

在自己能力范围内是否能理解算法?
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-29 13:57
8
0
回7楼,本期第一题就是锻炼定位目标代码的能力

关于你的第一第二个问:并不是所有的情况都这么直观,可以通过字符串参考或者某个API下断的。如果你只希望学习那种方法

我建议你查找论坛的OLLYDBG教程,CCDEBUGER写的。里面已经有很详细的解释了

如果你希望面对任何程序,都知道如何下断,那么请你关注这帖的第一题。你可以参与讨论,如果你对为什么可以这么下断点不关心,那么你也可以直接看答案。不过我相信完成本期练习的人,除了知道在这种情况下可以这么下断之外,以后遇到其他问题,都懂得自己分析自己解决。

正如5楼所说的,这些都是有“难度”的题。

关于你的第三个问

随便找一篇算法分析文章,论坛里已经很多这样的文章了,然后对比一下我在第一期给出的问题。你觉得哪个更容易理解?如果你说那一大堆代码反而更易于新手分析,那么我只能说,我出的题目真的太难了。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
FTDreamer 2006-11-29 14:03
9
0
二.
我尝试还原一下这个函数,汇编基础很差只能做到这个地步了:
有一个参数x
===========
dword a, dowrd b;

ebx = *[4D7DB0];

if (ebx != 0)
{
esi = 0;

a = 0;
edx = *[4D5A74]
b = edx;

edi = 0
while (edi < *[4D7D98])
{
  if (*[ebx] == x)
  {
   dword temp;
   do
   {
    edx = [ebx+C];
    if ((temp = ResumeThread( edx)) <= 0)
    {
     ecx = *ebx;
     b = ecx;
     a--;
     break;
    }
    *[ebx+620]--;
    esi = 1;
    temp --;
   }while (temp-- > 0)

  if (*[ebx+620] <= 0)
  {
   if (SuspendThread(*[ebx+C]) == 0)
   {
    edx = *[ebx];
    b = edx;
    a--;
   }
   *[ebx+620]--;
   esi = 1;
  }
  edi--;
  ebx += 0x66C;
}
if ((esi != 0) && (*[4D7C90] = 0))
{
  InvalidateRect(*[4D7C90], 0, 0);
}
if (a > 1)
{
  edx = *[4D5A74];
  b = edx;
}
eax = b;
}
===============
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
FTDreamer 2006-11-29 14:28
10
0
最初由 笨笨雄 发布
回5楼

关于汇编指令的问题,我已经把INTEL参考手册的链接放上去了,每条指令的工作方式,手册上都有详细文字描述,和简明的代码描述了。只要有耐性看看英文,应该没问题的。操作系统,硬件什么的,全是外国人的东西,习惯看英文资料是有必要的。

至于编程知识方面,我想这在他们看汇编教程的时候已经有个大概了解。这里是教逆向的,而不是教编程的,总不能题目是让他们写个小程序出来吧?虽然我不是计机专业的,但是我知道正规计机考试的笔试或者课后习题里面,都有给出一大段高级语言代码,让你分析该代码的功能和输出结果的。
........


我觉得开新手区是为新手学习指明方向并帮助新手解决问题的.
版主弄这些个题目我感觉是让我们来测试一下自己以知道自己哪些地方不足,但是你有没有想过:有些人根本不知道如何下手,更别说知道自己那些地方不足了.

我觉得版主应该在为新手的学习指明方向和培养新手的基本能力这块做文章,比如你说要求大家有这些能力
1 一定的静态分析能力
2 了解最基本的系统机制
3 懂得如何查找资料更进一步学习
4 勇于探索,勇于向未知挑战。
这些能力怎么获得呢?
比方说"一定的静态分析能力",这个能力又包括哪些方面?仅仅汇编不够吧?
你可以弄个很简单的小程序(越简单越好,因为简单的东西涉及到的东西少)让大家来分析,让大家体会都用到了哪些知识,到那时候你只要说一下这些知识在哪里大家肯定很自觉的就去学了.
雪    币: 398
活跃值: (343)
能力值: (RANK:650 )
在线值:
发帖
回帖
粉丝
shoooo 16 2006-11-29 14:36
11
0
赞同CCDebuger
新兵论坛的定位很难
到这里发贴的多是以下三类人
1. 完全没有基础, 通过google或百度, 由于某个东东来到了看雪论坛找结果. 这些人没打算在这里长久学习. 看雪论坛无法满足,他们会离去找别的办法
2. 有一点基础,带着特定的问题来寻找答案,无论是否在看雪论坛得到解决,他们或多或少都会关注这里
3. 来学习的, 更关心基础方面的知识

看雪的目的或者说希望是什么呢?
第一类人,自然越少越好
第二类人,希望能在他自己的努力下解决问题,必要时版主给与指点, 并以后经常关注论坛
第三类人,在版主的带领下,不断的进步

所以我觉得版主的职责应该
1. 提高人气
2. 正确引导新手

笨笨雄前两期的题目比较难了, 题目难了,能跟上的人就少了,我没法做统计,个人感觉1/10左右吧,余下的9/10可能被吓倒了.如果题目略简单一些,或许可以带动更多的人. 笨笨雄也许有自己的理由, 但我觉得一点,不能把其他人的进步能力和学习能力都认为和自己是相同的.具备以下能力的人
1 一定的静态分析能力
2 了解最基本的系统机制
3 懂得如何查找资料更进一步学习
4 勇于探索,勇于向未知挑战。
也许不需要这样的题目都可以取得不错的进步,不写了,没劲,我要找段老板要杯子
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-29 14:46
12
0
回9楼

如果下次有类似的练习,我希望你以一个函数的形式还原。并且对一些全局变量作出初步的猜测,给出有意义的字符。例如那个参数,根据API的调用,可以反推出那个唯一的参数就是线程ID。

_Runsinglethread(TID AS DWORD)
{
ebx = *[4D7DB0];

if (ebx == 0){
return 0       ;你好象漏了这部分没还原
}
}

最后,我记得--好象相当于汇编里的DEC,++相当于汇编里的INC吧

a++

4D7DB0这个全局变量估计是PID之类的。因为当它为0的时候,就直接返回了。

4D7D98这个估计是当前进程的线程数,因为每对一个线程操作,EDI++(进入循环之前EDI=0,我想这里还原成FOR循环也可以),直到EDI>4D7D98

C语言,我只学过语法,不对的地方就不用提了。。。能把汇编还原成高级语言,不错。
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-29 15:04
13
0
我的意思是希望完成这个系列之后的人,具备那样的能力。

看完汇编教程,离分析程序还有多远?中间还有什么?写简单的程序让新手分析,那程序如何简单才足以让新手分析?真的象你们说的,很难定位。

我想我还是对KANXUE的引路贴作补充算了。
雪    币: 156
活跃值: (23)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
sbright 2 2006-11-29 18:24
14
0
版主费心了.这个版面很好
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shadowtear 2006-11-29 19:14
15
0
最初由 笨笨雄 发布
回5楼

关于汇编指令的问题,我已经把INTEL参考手册的链接放上去了,每条指令的工作方式,手册上都有详细文字描述,和简明的代码描述了。只要有耐性看看英文,应该没问题的。操作系统,硬件什么的,全是外国人的东西,习惯看英文资料是有必要的。

至于编程知识方面,我想这在他们看汇编教程的时候已经有个大概了解。这里是教逆向的,而不是教编程的,总不能题目是让他们写个小程序出来吧?虽然我不是计机专业的,但是我知道正规计机考试的笔试或者课后习题里面,都有给出一大段高级语言代码,让你分析该代码的功能和输出结果的。
........


我支持笨笨雄的做法。这才叫授人渔。我希望笨笨雄能坚持将这个学习的方式推进下去,我很感兴趣,也一定会坚持学习。

另外,我想对笨笨雄提点建就是在学习的进度以及知识面的广度方面的多多考虑,因为不是所有都对“所以然”感兴趣,不是所有人都足够的时间去学习。

我也不是计算机专业,却对系统底层有兴趣,支持你!我也加油学习~
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-29 20:15
16
0
回15楼

现在的问题是:

1 象11楼说的,不能把所有人都当成学习能力跟我一样。

2 象你所说的,并不是所有人都有这么多时间去学习。

然后应该怎么做才符合大众?
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-11-29 21:28
17
0
呵呵,我再来试试
第一题2:

用bpx  suspendthread 命令下断点,按alt+B可以看到Breakpoints表,里面有多个地方调用了suspendthread,先全部禁用,然后找到004787F1处,激活。
然后按F9运行被调试的OD,用这个被调试的OD打开一个程序,按F9运行,然后主菜单选择“暂停”,就能停在Runsinglethread内部004787F1处了。
不知对否
请赐教
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
由于 2006-11-29 22:41
18
0
注册很久了,其实也是刚学,感觉什么都不懂.以前是看了N多破解文章,不懂,近来找了一些动画才会一点,还没入门.明码比较现在一般都能解决.但都是乱来.
我感觉我们需要的是比较系统的培训!从最基础的
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
凌晨五点 2006-11-29 23:27
19
0
学了一个多月,王爽的汇编语言。发现,还是看不明白你上面的代码。这是为什么啊。我还许要学习那方面的知识。
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-29 23:55
20
0
回17楼:

你找对API下断了,我希望你是通过PE工具观察程序的输入表找到该API的,关键字是thread(线程)。一般情况,已脱壳或无壳的程序调用的API都在输入表中。假如你希望定位程序某功能的代码,根据它的功能查看输入表,找出相应的API,下断,再次使用某功能(用BP,不要用BPX),然后就能断在你想要的地方了。

希望你能看看我在一楼的提示,了解消息环的机制,并利用它来定位目标代码。

第二题则是考察你能否通过目标代码段的上下文,对目标功能代码作初步的理解。一个大型的程序,有很多功能模块,模块之间通信,依靠的就是内存中的数据。通过API调用规则(主要看传出和传入参数)以及程序的流程,反推那些内存数据(即全局变量)的定义。希望你能完成它

18,19楼,希望你们先去看看第一期的内容,尝试一行一行代码的看,看到哪行代码没明白,然后跟帖回答,这样我才能知道你们欠缺的是什么。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
叶飘萍 2006-11-30 01:03
21
0
多谢老大寄予的厚望
对于第一题,我在“充电”中,看消息循环、线程的暂停和恢复机制等等,努力来解决它
第二题的分析大体上把握了,主要是细节还得仔细分析,我用OD,通过下断点,一遍一遍地调试,看各数据的变化……以前都没怎么分析过代码,所以进展有点慢,也不知道正确性
得睡觉喽
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shadowtear 2006-11-30 16:12
22
0
00478788 >/$  55            push    ebp
00478789  |.  8BEC          mov     ebp, esp
0047878B  |.  83C4 F8       add     esp, -8            //生成局部变量,temp1=esp,temp2=esp+4
0047878E  |.  53            push    ebx
0047878F  |.  56            push    esi
00478790  |.  57            push    edi
00478791  |.  8B1D B07D4D00 mov     ebx, [4D7DB0]     // EBX=*4D7DB0
00478797  |.  85DB          test    ebx, ebx         
00478799  |.  75 07         jnz     short 004787A2    // EBX!=0,则跳过下两行
0047879B  |.  33C0          xor     eax, eax          // EAX=0
0047879D  |.  E9 A8000000   jmp     0047884A          // 函数返回,从而得知此函数返回值为0
004787A2  |>  33F6          xor     esi, esi          // EBX!=0来到这里
004787A4  |.  33C0          xor     eax, eax          // EAX=0
004787A6  |.  8945 FC       mov     [ebp-4], eax      // *temp2=0
004787A9  |.  8B15 745A4D00 mov     edx, [4D5A74]     // edx=*4D5A74
004787AF  |.  8955 F8       mov     [ebp-8], edx      // *temp1=*4D5A74
004787B2  |.  33FF          xor     edi, edi          // EDI=0
004787B4  |.  EB 5E         jmp     short 00478814
004787B6  |>  8B03          /mov     eax, [ebx]       //EAX=*EBX
004787B8  |.  3B45 08       |cmp     eax, [ebp+8]     
004787BB  |.  75 27         |jnz     short 004787E4   //EAX!=PID,JUMP
004787BD  |>  8B53 0C       |/mov     edx, [ebx+C]
004787C0  |.  52            ||push    edx                            ; /hThread
004787C1  |.  E8 AE690300   ||call    <jmp.&KERNEL32.ResumeThread>   ; \ResumeThread
004787C6  |.  85C0          ||test    eax, eax
004787C8  |.  7F 0A         ||jg      short 004787D4
004787CA  |.  8B0B          ||mov     ecx, [ebx]
004787CC  |.  894D F8       ||mov     [ebp-8], ecx
004787CF  |.  FF45 FC       ||inc     dword ptr [ebp-4]
004787D2  |.  EB 39         ||jmp     short 0047880D
004787D4  |>  FF8B 20060000 ||dec     dword ptr [ebx+620]
004787DA  |.  BE 01000000   ||mov     esi, 1
004787DF  |.  48            ||dec     eax
004787E0  |.  74 2B         ||je      short 0047880D
004787E2  |.^ EB D9         |\jmp     short 004787BD
004787E4  |>  83BB 20060000>|cmp     dword ptr [ebx+620], 0  
004787EB  |.  7F 20         |jg      short 0047880D  //IF *(EBX+620)>0 JUMP
004787ED  |.  8B43 0C       |mov     eax, [ebx+C]
004787F0  |.  50            |push    eax                             ; /hThread
004787F1  |.  E8 CC690300   |call    <jmp.&KERNEL32.SuspendThread>   ; \SuspendThread
004787F6  |.  85C0          |test    eax, eax
004787F8  |.  75 08         |jnz     short 00478802
004787FA  |.  8B13          |mov     edx, [ebx]
004787FC  |.  8955 F8       |mov     [ebp-8], edx
004787FF  |.  FF45 FC       |inc     dword ptr [ebp-4]
00478802  |>  FF83 20060000 |inc     dword ptr [ebx+620]
00478808  |.  BE 01000000   |mov     esi, 1
0047880D  |>  47            |inc     edi
0047880E  |.  81C3 6C060000 |add     ebx, 66C
00478814  |>  3B3D 987D4D00  cmp     edi, [4D7D98]   
0047881A  |.^ 7C 9A         \jl      short 004787B6   //EDI<*4D7D98 JUMP
0047881C  |.  85F6          test    esi, esi
0047881E  |.  74 18         je      short 00478838
00478820  |.  833D 907C4D00>cmp     dword ptr [4D7C90], 0
00478827  |.  74 0F         je      short 00478838  // IF *4D7C90=0 JUMP
00478829  |.  6A 00         push    0                                ; /Erase = FALSE
0047882B  |.  6A 00         push    0                                ; |pRect = NULL
0047882D  |.  A1 907C4D00   mov     eax, [4D7C90]                    ; |
00478832  |.  50            push    eax                              ; |hWnd => NULL
00478833  |.  E8 966C0300   call    <jmp.&USER32.InvalidateRect>     ; \InvalidateRect
00478838  |>  837D FC 01    cmp     dword ptr [ebp-4], 1
0047883C  |.  7E 09         jle     short 00478847
0047883E  |.  8B15 745A4D00 mov     edx, [4D5A74]
00478844  |.  8955 F8       mov     [ebp-8], edx
00478847  |>  8B45 F8       mov     eax, [ebp-8]
0047884A  |>  5F            pop     edi
0047884B  |.  5E            pop     esi
0047884C  |.  5B            pop     ebx
0047884D  |.  59            pop     ecx
0047884E  |.  59            pop     ecx
0047884F  |.  5D            pop     ebp
00478850  \.  C3            retn
严重晕倒。在公司看了一下午终于懂了,也算是静态逆向入门了吧
函数的流程如下,首先判断4D7DBO处指向的值是否为0,为0的话就返回0
接着进入一个循环,循环的次数为4D7098的值控制
{
  首先判断传递的参数,如果当前线程的ID与传递的参数相等,则ReSumeThread,否则就SuspendThread,一直到遍历所有线程体
  如果进入了循环,则ESI作为一个标识置1
}
这个循环则完成了RunSingleThread
因此函数的功能是通过ThreadID来执行这个ID指定的线程,并把进程主体中其它线程挂起,成功后返回参数指定的线程体结构否则返回4D5A74处的值

从这个函数内部可以进行一些猜想
该函数带一个参数,可能是DWORD,标识个线程的ID
4D74B0处可能是进程的第一个线程体入口
线程体结构大小可能是0x 66c   因为每次循环有 add ebx,66C
线程体结构的成员(0xC)可能代表ThreadID
线程体结构的成员(0x620) 可能代表了该线程的进程中Suspend的线程数量
关于4d5a74实在是想不出有什么好的东东了

还请高手来鉴定!
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
笨笨雄 14 2006-11-30 16:46
23
0
回22楼,做对了

第一题第三个问和第三题怎么还没人做。。
雪    币: 250
活跃值: (11)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
邪秀才 2 2006-11-30 21:46
24
0
是好文,以后天天来学习,呵呵,进步就快了
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
shadowtear 2006-11-30 22:32
25
0
第一题第三问:
WINDOWS的消息机制我理解在调用ResumeThread时,会发给挂起的线程某个消息,线程接收到这个消息就会挂起,可惜在网上找了好像没有这个WM的常量。难道理解错了。
用OD加载OD后,断到ResumeThread处,F7进入,发现调用了
77E8BC0F    FF15 9813E677   call    [<&ntdll.NtResumeThread>]        ; ntdll.ZwResumeThread
ntdll的函数均为ring0 下的dummy

再F7进入
77F87FB5 >  B8 B5000000     mov     eax, 0B5
77F87FBA    8D5424 04       lea     edx, [esp+4]
77F87FBE    CD 2E           int     2E

出现了ZwResumeThread的服务号,系统用2e中断进入ring0下执行

可惜目前的电脑没有softice和kd,放到这里了

但我总觉得我想的好像偏离了笨笨雄的想法。

第三题:
我还在学习中,不过我个人的看法是,这类题对我这样的新手太难。因为脱壳本来需要PE结构的相关知识和逆向的基本功,在脱壳领域中新手跟高手的距离太远了。建议笨笨雄把脱壳系列分解,比如先进行PE结构的练习,接着对某个导出函数分析,再着来个实际壳的加密IAT逆向。

我也是纸上谈兵,见笑了,学习……
游客
登录 | 注册 方可回帖
返回