文章主要描述的是黑客老鸟讲逆向分析以及对逆向分析技术的全揭秘,讲到逆向,更多的人都是考虑到既然是逆向那就应该反着来推或者相反,其实则不然,这里我们要讲的是为了更深入的研究windows编写机制,更好的研究他们的安全,谁让微软这么保守虽然曾经流出过windows的部分代码.....
经过前几课的学习,我们现在开始正式开讲逆向分析。逆向分析技术是指通过分析反汇编代码来理解其代码功能,如各接口的数据结构等,然后用高级语言重新描述这段代码,逆向推出原软件的思路。下面从函数的调用、循环、控制语句等方面分析。
在高级语言中,子程序依懒于堆栈来传递参数。
例如test1(Par1,Par2,Par3:integer),按C,Psacal和StdCall的调用约定汇编代码如下:
函数调用
按StdCall约定调用函数test2(par1,par2),其堆栈建立情况如下:
Push ebp ;保护现场原先的EBP指针
Mov ebp,esp ;设置新的EBP指针,指向栈顶
Sub esp,xxx ;堆栈中留出点空间放局部变量
… …
Add esp,xxx ;释放局部变量占用的堆栈
Pop ebp ;恢复现场的ebp指针
Ret 8 ;返回
循环
如果确定某段代码是循环,就可以分析其计数器,一般是用ecx寄存器做计数器。
下面的汇编代码:
xor ecx,ecx;ecx清零
:00440000
inc ecx;计数
… …
cmp ecx,05;循环4次
jbe 00440000;重复
上面的汇编代码用C语言描述有以下3种形式:
◆While(i<5){… …}
◆For(i=0;i<5;i++){… …}
◆i=0
Repeat
i++;
…
Unitl(i>=5)
控制语句
If …else语句:
Cmp byte prt[00221450],bl
Jne 00221590
Case语句:
汇编代码高级语句
Mov eax,edi ;
Sub eax,00000002 ;
Je 00401 ;
Sub eax,0000000E ;
Jne 0040114E
…Swith(K)
{
case’0x2’:…;break;
case’0x10’:…;break;
…
Default: …
}#p#
静态分析
静态分析:从反汇编出来的程序清单上分析程序流程,了解模块完成的功能。
静态分析先分析程序的文件类型,如果程序使用加壳保护,则要先进行脱壳。
通过静态分析工具加载程序进行分析。(例如IDA pro工具)
动态分析逆向分析技术:动态跟踪调试程序,分为用户模式和内核模式两种类型。
用户模式调试器是指用来调试用户模式的应用程序,工作在Ring 3级。(例如VC++编译器调试器)
内容模式调试器是指能调试系统内核的调试器,工作在Ring 0级。(例如SoftICE、OllDBG)
OD动态分析
调试中常用的快捷键:
F2:设置断点,只要在光标定位的位置(上图中灰色条)按F2键即可,再按一次F2键则会删除断点。
F8:单步步过。每按一次这个键执行一条反汇编窗口中的一条指令,遇到 CALL 等子程序不进入其代码。
F7:单步步入。功能同单步步过(F8)类似,区别是遇到 CALL 等子程序时会进入其中,进入后首先会停留在子程序的第一条指令上。
F4:运行到选定位置。作用就是直接运行到光标所在位置处暂停。
F9:运行。按下这个键如果没有设置相应断点的话,被调试的程序将直接开始运行。
CTR+F9:执行到返回。此命令在执行到一个 ret (返回指令)指令时暂停,常用于从系统领空返回到我们调试的程序领空。
ALT+F9:执行到用户代码。可用于从系统领空快速返回到我们调试的程序领空。
结构化异常处理
结构化异常处理(Structured Exception Handling ,简称SEH)是Windows操作系统处理程序错误或异常的技术。
两种类型的异常处理句柄:
一种是final型的,这是在异常未能得到线程相关处理例程处理操作系统在即将关闭程序之前会回调的例程,这个例程是进程相关而不是线程相关的,因此无论是哪个线程发生异常未能被处理都会调用这个例程.
另一种是per_Thread Exception Handler->线程相关的异常处理,通常每个线程初始化准备好运行时fs指向一个TIB结构 (THREAD INFORMATION BLOCK),这个结构的第一个元素fs:[0]指向一个_EXCEPTION_REGISTRATION结构 。
当Windows检测到异常时,执行线程立即被中断 ,处理从用户模式转向了内核模式,控制权交给了异常调试程序,它负责查找处理新异常的方法。
反调试逆向分析技术
检测内核模式调试器
利用NT的ZwQuerySystemInformation()或NtQuerySystemInformation()检测内核模式调试器。
检测用户模式调试器
利用NT的ZwQueryInformationProcess()或NtQueryInformationProcess()检测使用Win32 Debug API的用户模式调试器。
检测API断点
对于比较关键的API,可以检测其是否被设置了断点,即检查该API的入口的第一个字节是否为Int 3指令。
花指令
花指令是一堆汇编指令组成,对于程序来说,是一堆废话,加不加花指令都不影响程序的正常运行.编写的花指令要终始保持堆栈的平衡。花指令的作用是干扰反汇编。
花指令的指令含意:
push ebp ----把基址指针寄存器压入堆栈
pop ebp ----把基址指针寄存器弹出堆栈
push eax ----把数据寄存器压入堆栈
pop eax ----把数据寄存器弹出堆栈
nop -----不执行
mov edi,edi-----和nop效果一样
add esp,1-----指针寄存器加1
sub esp,1-----指针寄存器减1
inc ecx -----计数器加1
dec ecx -----计数器减1
子明最近一直在研究有关逆向分析技术。上面的就是我的一点研究,不知道大家是否还能够满意。我以后还会为大家服务,写出更加通俗易懂的文章来。