简单来讲,对软件进行分析并搞清楚其行为的工作就叫做“逆向工程”。逆向是指对软件进行分析,其对象不仅限与恶意软件,因此也不一定和计算机安全相关,譬如:license的绕过、游戏金手指等。都属于通过逆向分析绕过或篡改内部数据达到所需目标。
逆向工程可分为静态分析与动态分析。静态分析是:在不允许目标程序的情况下进行分析。动态分析:在运行目标程序的情况下进行分析。静态分析可用于了解全局信息,动态分析可用于了解局部信息,动静结合效果倍增!
静态分析常用工具包括:winhex(二进制编辑器)、IDA Freeware版(反汇编工具)等。 动态分析常用工具包括:Process Monitor(系统进程监视器)、OllyDbg(动态追踪工具)、Wireshark(数据包分析软件)等。 形形色色各种工具都有,再次不一一介绍。
工欲善其事必先利其器,在具有“趁手武器”后,我们需要对汇编指令有所了解(了解常用关键指令即可),便于通过工具展示出的内容进行分析。没必要一行行仔细阅读,重要的部分花时间仔细理解,其余部分了解大概即可。
指令 | 示例 | 含义 | 说明 |
MOV | MOV EAX,ECX | EAX=ECX | 将ECX的值存入EAX |
ADD | ADD EAX,ECX | EAX+=ECX | 将EAX的值加上ECX的值 |
SUB | SUB EAX,ECX | EAX-=ECX | 将EAX的值减去ECX的值 |
INC | INC EAX | EAX++ | 将EAX的值加1 |
DEC | DEC EAX | EAX-- | 将EAX的值减1 |
LEA | LEA EAX,[ECX+4] | EAX=ECX+4 | 将EAC值加4存入EAX |
CMP | CMP EAX,ECX |
IF(EAX==ECX) ZF=1 ELSE ZF=0 |
对两值进行比较并根据结果设置标志 若EAX与ECX值相同,ZF=1 |
TEST | TEST EAX,ECX |
F(EAX==0) ZF=1 ELSE ZF=0 |
将值与0进行比较并根据结果设置ZF值 |
JE(JZ) | JE 04001000 | if(ZF==1) GOTO 04001000 |
若ZF=1,则跳转到04001000 |
JNE(JNZ) | JNE 04001000 | if(ZF==0) GOTO 04001000 |
若ZF=0,则跳转到04001000 |
JMP | JMP 04001000 | GOTO 04001000 | 无条件跳转到04001000 |
CALL | CALL lstrcmpW | 调用lstrcmpW | |
PUSH | PUSH 00000001 | 压栈 | |
POP | POP EAX | 出栈并将获取的值存入EAX寄存器 |
示例分析
我写了一段非常简单C++代码,根据判断2019弹出不同对话框。
下面我们就来通过动静态来分析该EXE程序!
1.静态分析
首先可通过IDA进行全局查看,通过对源代码反汇编,可大概了解程序的逻辑代码。下图关键方法包括:lstrcmp、GetActiveWindow、MessageBox,通过三个方法我相信你已经基本明白代码逻辑规则是什么了😊。
2.动态分析
通过静态对代码有全局了解后,可通过动态分析进行局部深入了解,下图是通过OllyDbg进行深入了解,call调用了lstrcmp方法,jnz进行判断,如果不包含指定匹配字符串将跳转到01141787位置,即hello word的代码段中。
我通过在lstrcmp位置设置断点,执行至jnz时跳转至01141787位置,继续执行至011417A5时(弹出框)栈的内容如上图右下角。
由此我们完成了对该exe程序的简单动静分析。后期我们将结合Process Monitor、Wireshark等多种分析方法对软件进行逆向分析。
来源:https://blog.csdn.net/a59a59/article/details/102714897