逆向分析相信对大家来说已经不再陌生,但比较高级深入的程序逆向分析相信大家可能没有接触过,我在这里权作抛砖引玉,为读者介绍一些常见,但是不易理解的逆向信息。
我这里的案例程序是在Vc++6.0开发平台上创建的Win32 Console Application工程的可执行文件。在这种模式下生成程序代码比较复杂,我们展开工程文件,打开“test.cpp”,这个文件就是我们的主文件。本文主要研究系统模式下的一些逆向信息,所以我就不添加自定函数代码了,直接研究系统生成工程框架代码的逆向信息,下面我们开始分析。
首先找到我们的函数人口点。
我们首先在“lpCmdLine=GetCommandLine();”这句代码出设置断点,然后利用vc的反汇编功能展开反汇编代码,这里我们先从断点位置上方的那部分代码开始分析。前面的6行代码我就不说了。
“lea edi,[ebp-70h]”将ebp的值减去70h大小后将地址指向的值给了edi,其实就是将ebp-70h赋给了edi,由于上面已经将esp的值给了ebp,(ebp起始值为0012FF30)所以这里edi的值就是0012FEC0。
“mov ecx,lCh”将lch放入了ecx,这里实际上是一个循环次数;关键是这句“rep stos dword ptr[edi]”,这句话的含义就是将eax中的数据写入到edi指向的内存地址,写入的次数为lch次。我们来计算一下,上面ebp减去了7ch是为了下面来存放这些数据,eax中数据为4个字节,lch次就是28*4=112个字节,而7c正好是7*16 =112个字节,也就是说,上面的一切都是为了下面来放置一大片cc做准备的,那么cc是用来做什么的呢?在OD中我们经常会用到F2来设置断点,而F2的实质就是将该位置的代码修改为cc(就是int3中断),那就清楚了,在程序入口点放置这写代码的作用就是如果代码执行发生意外,指令就会执行错误位置的代码,就是我们刚才的那些cc,从而引发中断来保护系统。
开始处的保护代码部分我们分析完了,下面继续我们的分析。
我们的c++代码是“IpCmdLine=GetCommandLine();”,这句代码的作用是用来获取命令行信息的,呆在反汇编中我们却看到了两个call,其中一个是调用这个函数,而在这之后又多出了两句,cmp与call,那这又是用来做什么的呢?我们在OD中运行到第二个call里面。这里貌似很简单的代码,就是一个跳转,而跳转的执行与否则与前面的cmp相关。这里我们人工故意将其修改成可以跳转,看看会有什么情况发生。错误产生了。显然这个call是用来保护我们的程序用的。根据我们错误产生的原因,显然是前面的esi与esp的值不同而造成的,这就说明出现这种错误的原因就是堆栈不平衡了。这个中保护机制在我们的编程中是不会看到的,因为这些保护机制被默认的添加到了程序中,只有我们去跟踪才会发现这些问题与细节。
本篇文章主要为大家介绍了在我们程序中一些隐蔽不可见的有用信息,这些信息在我们的程序运行过程中起着十分重要的作用,但这些信息只有我们通过反汇编的手段去跟踪的时候才会被我们发现。程序中被隐藏的东西很多很多,只用那些真真的高手才会去发掘windows下不为认知的秘密,全用此篇文章为大家起到抛砖引玉的作用。