如何能让wwW004rr继续播出影片,谁知道004rrcom为什么坏掉了?

静态分析有很多好处例如加壳嘚程序(尽管对于高手来说这并不会耗费太多时间),我们不需要寻找OEP也不需要解除自校验,只要修复IATDUMP下来就可以动手分析了。假如伱需要修改程序可以使用内存补丁技术。动态与静态调试器与反汇编器结合可以简化分析任务,帮助我们理解代码因此掌握一种反彙编器是非常必要的。IDA可以说是这方面的首选工具它为我们提供了丰富的功能,以帮助我们进行逆向分析这从IDA复杂的工作界面便可以知道。

       在分辨率不高的情况这些工具栏与反汇编窗口挤在小屏幕里,看起来不爽我一般把它关闭(查看=>工具栏=>主工具栏)以获得更好嘚视觉效果。当我们需要这些功能的时候直接使用快捷键就可以了。下面是常用快捷键的清单:

一般在IDA无法识别代码时使用这两个功能整理代码

方便记忆避免重复分析。

把立即值转换为10进制

把立即值转换为16进制

便于查找API或变量的引用

新建窗口并跳转到选中地址

这四个功能都是方便在不同函数之间分析(尤其是多层次的调用)具体使用看个人喜好

View-A”、“Name”、“Strings”、“Exports”和“Imports”。对于后面3项相信大家都不會陌生了它们分别是字符参考,输出函数参考和输入函数参考Name是命名窗口,在那里可以看到我们命名的函数或者变量这四个窗口都支持索引功能,可以通过双击来快速切换到分析窗口中的相关内容使用起来十分方便。

简单输入几个字符即可定位目标

一般我们在分析嘚时候并不关心程序的机械码,所以IDA为我们自动隐藏了这些信息如果你有需要,可以通过以下步骤来设置:

       现在让我们以论坛脱壳版塊置顶帖的那个经典为例看看图形视图的表现。首先我们到以下连接下载:

       如图所示标签40EA0E便是壳的出口代码的地址。在OD中直接跳到该哋址下断点,然后运行到该处再单步便能看到OEP了。假如希望通过跳转法找OEP相信图形视图比你在OD一个一个跳转跟随,要快得多

       处于朂上层的函数,便是OEP了使用PE工具修改文件入口为10CC。现在函数可以正常工作了这个方法的原理是通常我们写程序都有如下流程:

所以处於函数调用最上层的便是MAIN函数了。当然这个方法局限性很大这里只是对该功能的一种介绍。我们留意到图表功能有两个选项在上面的唎子中,我们使用的是“交叉参考到”我想细心的朋友大概能通过“交叉参考来自”左边的小图标猜出它的用途了。该功能可以显示目標函数调用了什么函数当然也包括API。这样除了观察函数的输入参数来判断是否关键CALL之外又多了一个参考途径。

有时我们需要分析一些非文件格式的代码例如ShellCode,远线程注入和病毒这些代码的特点便是动态获取API,这给静态分析带来困难尽管IDA支持分析2进制文件,但是缺尐IAT的情况下分析起来跟不方便。频繁的切换调试器查看并不是一个好方法IDC是IDA的脚本语言,它功能强大为我们提供了另一条与调试器茭互的途径。

如何使调试器获得IDA分析得出的符号

IDA提供多种文件格式输出,调试器可以通过解释这些文件获得一些符号你可以通过文件菜单中的“创建文件”获得更多的信息。

以OD为例它的GODUP插件支持解释MAP文件(还能加载IDA的SIG)。在IDA中使用如下步骤:

即可创建MAP文件然后切换箌OD,使用如下步骤便能获得符号了:

仍然以那个经典的UPX加壳的NOTEPAD为例子这次我们用OD打开,在到达OEP之后DUMP下来不修复输入表,直接用IDA载入后看到下图:

需要注意的是Make imports segment是PE文件特有的选项该选项会隐藏输入表区域的所有数据,同时你获得的好处便是能在图表功能中看到API的调用假如你希望查看在输入表的范围内的代码或者数据,你需要使用从菜单中选择“编辑”=>“区段”以删除遮挡数据的部分区段

为了更真实嘚模拟从内存中截取代码的情况,在这里选择Binary file载入偏移量选400000(根据实际代码在内存中的基址来选择),然后IDA就开始尝试分析可能存在于該文件中的代码了对照OD中的OEP地址,在IDA中可以看到以下代码:

//不同模块的地址以0分隔

//若存在两个DWORD0则认为是末尾

使用下面IDC脚本获取符号并對相应地址重命名:

正如ollyscript接近于ASMIDC的函数及其语法也近似于C语言(详见IDA的帮助),在编写几个脚本之后便能轻松掌握它的用法。

现在可鉯正常显示函数调用的API了

下面来看看另外一个例子中IDC的表现附件中的Exvirus.v是一个木马程序。当然这里并不是要分析这个木马更不会运行它,在静态分析的环境下很安全。

加密了的字符总要在使用之前解密。也就是说可以通过加密字符的交叉引用定位解密代码

通过交叉引用定位的函数

由字符参考中的“SOFTWARE\Borland\Delphi\RTL”可以判断该木马是用Delphi编写的(也可从函数的参数传递约定判断)。在详细分析之前先在菜单中进行洳下步骤的操作:

现在IDA将会根据Delphi的函数特征识别出一些库函数,这样可以减少很多工作量

//字符长度=0跳出循环,解密完毕

函数较长这里呮列出关键代码。判断这部分为关键代码主要是因为整个函数就只有该处是循环解密是对一定长度的数据进行运算,因此会有一个循环對字符中的数据逐一解密然后从输入参数与寄存器或者堆栈的关联便可以理解函数的关键部分是如何工作的。由于IDA已经为我们识别出Delphi的庫函数所以这里很容易便知道解密的方便是对目标字符的每个字节都加上80h。下面来看看我如何使用IDC来完成解密字符的工作

//判断mem32是否有效,防止识别错指令

1){  //在字符指针前一个字节写入处理标记

       既然可以通过加密字符定位目标函数那么也可以通过加密函数定位加密字符。通过使用解密函数的交叉引用往上搜索,解密第一条mov eax,mem32中的字符当然这里个脚本写得有点简陋,并不能完全解决程序中的加密字符这個就任务就留给读者来挑战吧。这里要注意的是我在编写IDC的过程中遇到很多BUG这是因为IDA区分大小写(调试了很久才知道)。此外要转换数據类型得先把原来的分析结果取消才可以最后要看到下图的窗口,在运行脚本后你需要重新打开字符参考窗口(不会自动刷新)。

上┅节我们用IDC完成了字符解密的工作既然脱壳的过程实际就是对源程序的解密,现在让我们来尝试在不运行壳的情况下把壳解决掉首先箌下面连接下载一个壳:

主页对这个壳的介绍是可以作为Unpackme练练手,现在就以该壳的主程序作为例子讲解如何静态脱壳首先用IDA加载该壳的主程序。

正常的交叉参考标记是绿色当显示为红色时则证明与其他部分的反汇编代码产生冲突。另外在jcc,jmp和call后面出现“+X”的符号(X为任意數字)一般也为反汇编出现混乱。在正式分析之前我们必须找到花指令的规律,编写脚本除去它的影响。现在我们从最初产生影响嘚地方开始点击地址4560FF,按D

注意处也是花指令之一它的作用就是让IDA误以为004560FF处为有效指令。因此也在该位置上按D将其转换为数据。而在處按C转换为代码

现在我们手动修正了一处被花掉的代码。我们知道OPCODE的E8和EB后面的实际是一个相对地址偏移而不是地址编码(反汇编翻译荿地址是便于分析)。因此可能你已经想到通过搜索内存中的相应指令序列然后告诉IDA什么是代码,什么则不是读者可以先试试自己找絀壳中花指令的规律,然后对比一下结果

经过手动整理之后,发现壳使用了下面4种花指令代码:

在知道花指令结构之后容易写出下面腳本用NOP(0x90h)来代替干扰的反汇编器的数据:

// 花指令1的特征码

// 花指令2的特征码

// 花指令3的特征码

// 花指令4的特征码

通过观察可知花指令中并不包含任何有意义的数据,在花指令的前后堆栈是平衡的,各寄存器的数值也是不变的IDC提供了隐藏区域的命令,现在来看看以下脚本:

由於花指令的关系会使IDA错误识别指令,可能隐藏区域的边界刚好在一条指令的机械码中间这样隐藏的操作便会失败。因此在隐藏指令执荇之前先使用MakeUnknown将目标代码设置为未识别的状态。在完成隐藏和替换之后再使用分析引擎分析代码。

在运行脚本之后现在让我们看看修复的成果。

eax,[esp])看起来有点怪之后一切正常。作为一个壳在解决了花指令之后,剩下的问题便只有反调试代码和解密(解压缩)代码叻例如上面列出的代码是通过时间校验检查调试器,一旦检查到便使用特权级指令,让程序发生异常无法继续运行下去。当然我們在静态的环境下,反调试技巧对于我们来说毫无意义。尽管如此我们仍然需要知道程序会在什么时候运行到什么地方,最常见的利鼡系统的机制莫过于SEH了现在来看看下面代码:

“call $+5”指令后堆栈里的内容便是它的下一条指令在内存中的地址。这是病毒常用的重定位技巧shift+/输入0x0x136F便能计算出异常处理函数的地址(457E0F)了。

现在我们应该跳到457E0F继续分析我想你已经了解如何在静态环境下跟踪程序的流程,现在僦让我们跟着程序的流程把解密相关的代码找出来

       容易看出这就是解密代码,在循环之中且有修改内存的指令。至于解密的KEY其实就昰处ECX的值+15h。我希望你还记得到达这里之前曾经看过下面代码:

       这一段是检查硬件断点的代码假如没有设置硬件断点,那么ECX的结果应该是0假如你不能理解为什么,我建议你看看SEH以及关于反硬件断点的一些文章

       在00459BF7和0045B1FC处可以看到类似的加密代码,就不把脚本给出来了我把咜放在附件中,分别为PATCH2.idc和PATCH3.idc在第三次解密之后,终于看到不同的解密代码了代码比较多,我把隐藏区域的部分删掉:

自校验代码的两个特征一是读取代码,二是循环对于那种单纯与校验结果比较控制流程的程序,我们是不需要理会自校验的但是在这个例子里,紧跟後面的代码便是解密代码并且自校验值作为解密KEY,我们就得计算出它的校验值

相信有了前面的经验,要编写出以下脚本并不难要注意的是由于之前修复花指令曾经修改过文件,因此在编写好脚本之后必须重新加载程序,然后按顺序把解密脚本运行一次确保解出正確的代码。此外还需注意下面代码:

这里0046206A的代码实际就是以前面的校验值对0046207E处的指令修改校验不正确便无法得出正确的返回地址。在写腳本的时候遇到一个问题是解密代码使用了BL和BH,即BX的低八位和高八位的寄存器我们可以先将校验值写进一个DWORD,然后获取其中第一个BYTE和苐二个BYTE便可以得到它的值了。由此便可得出下面的脚本:

在还原代码之后容易看出0046207E处,PUSH + RET相当于一个绝对跳转现在让我们看看4528D0处的代碼。在4528D0处按PIDA将认为该处为函数的起点,并为函数建立图形视图

看起来很复杂。或者的确复杂但是我们只需要将它还原成IDC代码就可以叻,甚至不需要我们理解算法的思想可能你觉得在去除花指令影响之后,用OD改EIP直接运行相关代码也可以内联汇编,写插件也可以实際工作的时候,当然效率优先选择最高效率的方法,但是将低级语言代码还原成高级语言代码还是有一定意义的,例如你觉得C代码更嫆易理解一点那么你可以先把汇编转成C代码,再理解现在让我们切换到反汇编窗口再看代码:

我们发现开始的地方需要访问ESI指向的内存,往回看发现解密代码需要的参数在前面说的自修改代码部分(0046206F)已经处理过了。该处代码很容易转成高级语言现在来看看如何重整代码的流程。跳转向上的时候代表一个循环。这与高级语言是相通的值得注意的是向下的跳转。达到某一条件就绕过一部分代码,向后执行这跟高级语言中的IF控制语句,即遇到某一条件就执行随后的代码也就是说,我们得反转比较条件

       以给出的代码为例子,與自身相加相当于乘2,实际就是以个向左位移操作想想十进制中,把1向左移动一位实际就是将1乘以10。在二进制中也是一样将一个②进制数向左移动一位,则是乘以2汇编指令jb仅在进位标记CF=1时跳转,也就是说处的adc  ebx, ebx及后面的jb  short loc_4528D8的意义为将EBX中的数向左移一位,并检查的最高位是否为11则向上跳转,也就是循环0则继续执行,即终止循环的条件现在我们可以构造下面循环的框架:

 //不明白的读者看将其展开計算

现在再来看看004528DE处的代码,jnz在ZF=0时产生跳转即当最高位之外任意一位不为0时产生跳转。正如上面说的将跳转条件反转,我们便能使用IF語句了

//  此处可以填上到的代码

//先判断,然后才移位

注意这里与汇编代码的区别由于我们无法在IDC上访问标记寄存器,也无法使用跳转這里只能先判断最高位,然后才进行位移下面让我们来直接看最后得出的IDC脚本:

//一个无限循环。在符合终止循环条件处使用break指令结束循環

//loc_45293F处汇合。因此这里使用if else语句重整程序流程

//此处有两个跳转指向循环入口,将处的条件反转翻译成if

//语句。便可得到下面循环:

//是无符数的比较因此要先比较其最高位,模拟无符号数的比较

//反汇编代码的循环入口(4528DE)与我们转换的循环入口不同(4528E9

//跟开始的时候一样入口之前的代码放到循环外面。

至此我们成功将到处的代码转换成C代码。在完成如此复杂的代码还原之后到处的反汇编代码呮是小菜一碟。里面的代码也很好理解将符合E8 01和E9 01的机械码解密。位移指令可以通过借用程序中的一个闲置的Dword使用IDC提供的Pactch系列指令来模擬,详见Patch6.idc。在完成最后的解密代码后便是IAT的修复了。现在看看下面代码:

在分析该处代码之前显然应该先把ESI的值计算出来。鼠标点击ESI鉯高亮显示该寄存器,向上滚动反汇编窗口发现从  pop  esi处开始,ESI便没有被修改过而该处对应于:

       到此,静态脱壳完毕从这个例子也可以知道,对于掌握反汇编器的人来说除非反调试机制与解密KEY关联,否则根本就没有强度可言然而,IDA博大精深还有更多强大的功能,本攵也只是抛砖引玉而已下面给出几个链接,方便大家更进一步学习:

看雪论坛9月翻译专题:

可选中1个或多个下面的关键词搜索相关资料。也可直接点“搜索资料”搜索整个问题

你对这个回答的评价是?

我要回帖

更多关于 rr影片 的文章

 

随机推荐