Night may say

以前一直认为一个工具只要会用就可以了,可是作为一名喜欢安全的渣渣来讲,会用还远远不够,你还得了解它,欺骗它,改造它,提升它! 上一篇文章讲了如何脱掉peid0.94版本的壳 这一篇文章对peid开始逆向分析它的原理。开始的时候,从最简单的分析起:如何判断程序有vc编译器编译的。

逆向工具:ollydbg,ida,winhex 分析对象:peid v0.94(完美脱壳后uppeid) 测试程序:TraceMe.exe

打开peid加载TraceMe.exe发现为Microsoft Visual C++ 6.0编写,所以直接打开ollydbg,查找字符串Microsoft Visual C,发现字符串

双机来到这个字符所在的地方

发现跳转来自的地方,,往上寻找,发现这个函数的起始部分 这里用IDA一样可以达到相同的效果 直接下断,然后用peid加载我们的测试程序TraceMe.exe,后F9,程序中断下来 单步运行,将分析的算法写在下面的代码中:

C28 C2A C30 C38 C40 C46 C4C C54 C5A C65 C6B C71 C77 C81 C8B C95 C9F CA9 CB2 CBB CC5 CCF CD9 CE0 CE8 CEE CF7 CFF D04 D08 D0E D13 |. 0F82 E4020000 jb upPEiD.00438FFD; 跳(确保oep在text段中)(vc的一个特征)

在上面的代码中00438D01处我的注释是获得程序 RVA

00438D01 |. 8B55 20mov edx,[arg.7] ; 获得程序rva

这个地方并不是直接分析得到的,发现程序每次加载的时候arg.7的地址为00471018

右键数据窗口中跟随,记录地址,然后重新加载程序,在00471018地方下 内存访问断点,F9运行后加载TraceMe.exe,在下面的地方断下:

而直接在数据窗口中跟随,并没有发现任何头绪,往上回溯代码,发现最开始赋给eax的地方在这里:

数据窗口中跟随:

熟悉pe结构的看A0130000那个地方是不是在IMAGE_NT_HEADERS部分中IMAGE_OPTIONAL_HEADER中偏移为16的位置,而这个位置对应的就是address of entrypoint,所以这个地方就应该是程序的RVA(OEP)

那么这个分析只是分析了部分判定vc的代码,那么在之前还会不会又判定呢?我们看看那在判定vc的时候的堆栈

右键跟随,发现回到刚刚赋给rva的代码空间,前面的代码段其实就是在将程序的偏移,基址送给这个函数,然后判断,下面的代码段主要就是将函数指针数组的下标存进一个数组,然后调用相关函数确认程序类型。

昨晚分析一般加载TraceMe的时候电脑卡死了,瞬间很是生气,就没有在进行分析了,有兴趣的大牛们可以进行分析指针数组那个地方

分析了一点,其他分析的思路也差不多和这个一样,大牛勿喷!

害怕攀登高峰的人,永远在山下徘徊。

Night may say

相关文章:

你感兴趣的文章:

标签云: