能力值:
( LV2,RANK:10 )
|
-
-
2 楼
一.
1.用PEiD打开OD, Subsystem>ExportTable>_Runsinglethread
RVA 78788
所以地址是0x478788
后面两种方法都不会...
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
第一题
2、加载自己后,按ctrl+N键,打开程序调用API窗口,找到_Runsinglethread,双击就能来到程序调用地址处。然后用F2下断点。
|
能力值:
(RANK:570 )
|
-
-
4 楼
汗啊,跟我想的不一样,CTRL+N的功能我都忘记很久了。。。
第一题第二个问,我是希望你们通过观察那个导出函数,估计里面用了什么API,然后通过API下断,找到该导出函数的
程序大部分功能都是通过系统提供的API来实现的,所以要会功能来判断程序究竟用了什么API,然后才好下断
第三个问其实是考察大家对消息环的理解。因为WINDOWS下的程序都是以消息驱动的,有的按钮,例如功能设置什么的,只需要改变全局变量,这个时候用API下断是断不下来的。
举个例吧,假如程序里面提供软键盘的功能,只有点特定的BUTTON才能输入密码,这样你在GETWINDOWTEXT下断(或类似功能的API),就断不下来了。虽然暂时还没有这样的程序,但是我们必须针对各种可能的情况。而且这个也是系统之中用得最普遍的机制了,基础之中的基础。
|
能力值:
(RANK:990 )
|
-
-
5 楼
看了两期的题目,感觉对新手来说过难了。何为新手?在我看来,我最多认为他掌握了一些必要的汇编知识。对于这样的新手,你不能一上来就让他分析某个函数,分析某段算法,脱某个保护壳。分析一个函数的功能前提是要有编程知识;分析某段算法的前提是要对汇编指令非常熟悉,了解每个指令的功能,并能从整体上抽象出算法的原型;脱某个保护壳要求熟悉PE结构,了解一般壳的流程,知道如何设置不同的断点找到关键的地方。
在我看来新手要了解的是目标程序是什么语言写的?有何对应的工具分析?是否有壳?如果有壳在自己的能力范围内或目前的工具是否能解?程序的注册保护方式大致是什么样?序列号还是keyfile?如何能设置合适的断点断在关键位置?是否容易爆破?爆破的关键点是哪?算法的部分在哪里?在自己能力范围内是否能理解算法?
我认为分析软件的关键是如何能定位到合适的位置,至于分析,那是体力活及相关知识的运用。对于新手你应该训练的就是如何让他能定位到关键位置,这是第一步,也是最重要的一步。
以上纯属个人观点,仅供参考。
|
能力值:
(RANK:570 )
|
-
-
6 楼
回5楼
关于汇编指令的问题,我已经把INTEL参考手册的链接放上去了,每条指令的工作方式,手册上都有详细文字描述,和简明的代码描述了。只要有耐性看看英文,应该没问题的。操作系统,硬件什么的,全是外国人的东西,习惯看英文资料是有必要的。
至于编程知识方面,我想这在他们看汇编教程的时候已经有个大概了解。这里是教逆向的,而不是教编程的,总不能题目是让他们写个小程序出来吧?虽然我不是计机专业的,但是我知道正规计机考试的笔试或者课后习题里面,都有给出一大段高级语言代码,让你分析该代码的功能和输出结果的。
可能第一期一二题看起来有点难了,一个是NATIVE API,RING 0的东西,另外一个是位操作算法,按C语言的教程的话来说“C语言也被称为中间语言,因为位操作”,也就是说位操作是一个难点。高级语言通过提供链接库,让程序员感觉不到还需要位操作,但是我们逆向分析的呢?假如没有该链接库各输出函数的说明,那他们该怎么办呢?又该什么时候教会他们?
至于脱那个壳。说是保护壳,其实也就一压缩壳,UPX内核,用ATTACH法可以直接秒的。第二期的第三题是作为第一期第三题的延续,通过查找返回地址找出OEP。然后用OD的插件DUMP下来就可以了。
最后,我不会破解,只会逆向,我希望能完成该训练场系列的人具备以下能力:
1 一定的静态分析能力
2 了解最基本的系统机制
3 懂得如何查找资料更进一步学习
4 勇于探索,勇于向未知挑战。
如何定位目标代码,这期内容的第一题就是了。至于如何做简单的爆破,我认为看雪出的几本书和你的OLLYDBG教程已经写得足够详细了。如果有人提出那种问题,我会给出链接建议他们去看的。
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
很支持!CCDebuger超级版主的观点。
这三个疑问是我最关心的。
如何能设置合适的断点断在关键位置?
算法的部分在哪里?
在自己能力范围内是否能理解算法?
|
能力值:
(RANK:570 )
|
-
-
8 楼
回7楼,本期第一题就是锻炼定位目标代码的能力
关于你的第一第二个问:并不是所有的情况都这么直观,可以通过字符串参考或者某个API下断的。如果你只希望学习那种方法
我建议你查找论坛的OLLYDBG教程,CCDEBUGER写的。里面已经有很详细的解释了
如果你希望面对任何程序,都知道如何下断,那么请你关注这帖的第一题。你可以参与讨论,如果你对为什么可以这么下断点不关心,那么你也可以直接看答案。不过我相信完成本期练习的人,除了知道在这种情况下可以这么下断之外,以后遇到其他问题,都懂得自己分析自己解决。
正如5楼所说的,这些都是有“难度”的题。
关于你的第三个问
随便找一篇算法分析文章,论坛里已经很多这样的文章了,然后对比一下我在第一期给出的问题。你觉得哪个更容易理解?如果你说那一大堆代码反而更易于新手分析,那么我只能说,我出的题目真的太难了。
|
能力值:
( LV2,RANK:10 )
|
-
-
9 楼
二.
我尝试还原一下这个函数,汇编基础很差只能做到这个地步了:
有一个参数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;
}
===============
|
能力值:
( LV2,RANK:10 )
|
-
-
10 楼
最初由 笨笨雄 发布 回5楼
关于汇编指令的问题,我已经把INTEL参考手册的链接放上去了,每条指令的工作方式,手册上都有详细文字描述,和简明的代码描述了。只要有耐性看看英文,应该没问题的。操作系统,硬件什么的,全是外国人的东西,习惯看英文资料是有必要的。
至于编程知识方面,我想这在他们看汇编教程的时候已经有个大概了解。这里是教逆向的,而不是教编程的,总不能题目是让他们写个小程序出来吧?虽然我不是计机专业的,但是我知道正规计机考试的笔试或者课后习题里面,都有给出一大段高级语言代码,让你分析该代码的功能和输出结果的。 ........
我觉得开新手区是为新手学习指明方向并帮助新手解决问题的.
版主弄这些个题目我感觉是让我们来测试一下自己以知道自己哪些地方不足,但是你有没有想过:有些人根本不知道如何下手,更别说知道自己那些地方不足了.
我觉得版主应该在为新手的学习指明方向和培养新手的基本能力这块做文章,比如你说要求大家有这些能力
1 一定的静态分析能力
2 了解最基本的系统机制
3 懂得如何查找资料更进一步学习
4 勇于探索,勇于向未知挑战。
这些能力怎么获得呢?
比方说"一定的静态分析能力",这个能力又包括哪些方面?仅仅汇编不够吧?
你可以弄个很简单的小程序(越简单越好,因为简单的东西涉及到的东西少)让大家来分析,让大家体会都用到了哪些知识,到那时候你只要说一下这些知识在哪里大家肯定很自觉的就去学了.
|
能力值:
(RANK:650 )
|
-
-
11 楼
赞同CCDebuger
新兵论坛的定位很难
到这里发贴的多是以下三类人
1. 完全没有基础, 通过google或百度, 由于某个东东来到了看雪论坛找结果. 这些人没打算在这里长久学习. 看雪论坛无法满足,他们会离去找别的办法
2. 有一点基础,带着特定的问题来寻找答案,无论是否在看雪论坛得到解决,他们或多或少都会关注这里
3. 来学习的, 更关心基础方面的知识
看雪的目的或者说希望是什么呢?
第一类人,自然越少越好
第二类人,希望能在他自己的努力下解决问题,必要时版主给与指点, 并以后经常关注论坛
第三类人,在版主的带领下,不断的进步
所以我觉得版主的职责应该
1. 提高人气
2. 正确引导新手
笨笨雄前两期的题目比较难了, 题目难了,能跟上的人就少了,我没法做统计,个人感觉1/10左右吧,余下的9/10可能被吓倒了.如果题目略简单一些,或许可以带动更多的人. 笨笨雄也许有自己的理由, 但我觉得一点,不能把其他人的进步能力和学习能力都认为和自己是相同的.具备以下能力的人
1 一定的静态分析能力
2 了解最基本的系统机制
3 懂得如何查找资料更进一步学习
4 勇于探索,勇于向未知挑战。
也许不需要这样的题目都可以取得不错的进步,不写了,没劲,我要找段老板要杯子
|
能力值:
(RANK:570 )
|
-
-
12 楼
回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语言,我只学过语法,不对的地方就不用提了。。。能把汇编还原成高级语言,不错。
|
能力值:
(RANK:570 )
|
-
-
13 楼
我的意思是希望完成这个系列之后的人,具备那样的能力。
看完汇编教程,离分析程序还有多远?中间还有什么?写简单的程序让新手分析,那程序如何简单才足以让新手分析?真的象你们说的,很难定位。
我想我还是对KANXUE的引路贴作补充算了。
|
能力值:
( LV6,RANK:90 )
|
-
-
14 楼
版主费心了.这个版面很好
|
能力值:
( LV2,RANK:10 )
|
-
-
15 楼
最初由 笨笨雄 发布 回5楼
关于汇编指令的问题,我已经把INTEL参考手册的链接放上去了,每条指令的工作方式,手册上都有详细文字描述,和简明的代码描述了。只要有耐性看看英文,应该没问题的。操作系统,硬件什么的,全是外国人的东西,习惯看英文资料是有必要的。
至于编程知识方面,我想这在他们看汇编教程的时候已经有个大概了解。这里是教逆向的,而不是教编程的,总不能题目是让他们写个小程序出来吧?虽然我不是计机专业的,但是我知道正规计机考试的笔试或者课后习题里面,都有给出一大段高级语言代码,让你分析该代码的功能和输出结果的。 ........
我支持笨笨雄的做法。这才叫授人渔。我希望笨笨雄能坚持将这个学习的方式推进下去,我很感兴趣,也一定会坚持学习。
另外,我想对笨笨雄提点建就是在学习的进度以及知识面的广度方面的多多考虑,因为不是所有都对“所以然”感兴趣,不是所有人都足够的时间去学习。
我也不是计算机专业,却对系统底层有兴趣,支持你!我也加油学习~
|
能力值:
(RANK:570 )
|
-
-
16 楼
回15楼
现在的问题是:
1 象11楼说的,不能把所有人都当成学习能力跟我一样。
2 象你所说的,并不是所有人都有这么多时间去学习。
然后应该怎么做才符合大众?
|
能力值:
( LV2,RANK:10 )
|
-
-
17 楼
呵呵,我再来试试
第一题2:
用bpx suspendthread 命令下断点,按alt+B可以看到Breakpoints表,里面有多个地方调用了suspendthread,先全部禁用,然后找到004787F1处,激活。
然后按F9运行被调试的OD,用这个被调试的OD打开一个程序,按F9运行,然后主菜单选择“暂停”,就能停在Runsinglethread内部004787F1处了。
不知对否
请赐教
|
能力值:
( LV2,RANK:10 )
|
-
-
18 楼
注册很久了,其实也是刚学,感觉什么都不懂.以前是看了N多破解文章,不懂,近来找了一些动画才会一点,还没入门.明码比较现在一般都能解决.但都是乱来.
我感觉我们需要的是比较系统的培训!从最基础的
|
能力值:
( LV2,RANK:10 )
|
-
-
19 楼
学了一个多月,王爽的汇编语言。发现,还是看不明白你上面的代码。这是为什么啊。我还许要学习那方面的知识。
|
能力值:
(RANK:570 )
|
-
-
20 楼
回17楼:
你找对API下断了,我希望你是通过PE工具观察程序的输入表找到该API的,关键字是thread(线程)。一般情况,已脱壳或无壳的程序调用的API都在输入表中。假如你希望定位程序某功能的代码,根据它的功能查看输入表,找出相应的API,下断,再次使用某功能(用BP,不要用BPX),然后就能断在你想要的地方了。
希望你能看看我在一楼的提示,了解消息环的机制,并利用它来定位目标代码。
第二题则是考察你能否通过目标代码段的上下文,对目标功能代码作初步的理解。一个大型的程序,有很多功能模块,模块之间通信,依靠的就是内存中的数据。通过API调用规则(主要看传出和传入参数)以及程序的流程,反推那些内存数据(即全局变量)的定义。希望你能完成它
18,19楼,希望你们先去看看第一期的内容,尝试一行一行代码的看,看到哪行代码没明白,然后跟帖回答,这样我才能知道你们欠缺的是什么。
|
能力值:
( LV2,RANK:10 )
|
-
-
21 楼
多谢老大寄予的厚望
对于第一题,我在“充电”中,看消息循环、线程的暂停和恢复机制等等,努力来解决它
第二题的分析大体上把握了,主要是细节还得仔细分析,我用OD,通过下断点,一遍一遍地调试,看各数据的变化……以前都没怎么分析过代码,所以进展有点慢,也不知道正确性
得睡觉喽
|
能力值:
( LV2,RANK:10 )
|
-
-
22 楼
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实在是想不出有什么好的东东了
还请高手来鉴定!
|
能力值:
(RANK:570 )
|
-
-
23 楼
回22楼,做对了
第一题第三个问和第三题怎么还没人做。。
|
能力值:
( LV6,RANK:90 )
|
-
-
24 楼
是好文,以后天天来学习,呵呵,进步就快了
|
能力值:
( LV2,RANK:10 )
|
-
-
25 楼
第一题第三问:
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逆向。
我也是纸上谈兵,见笑了,学习……
|
|
|