1、反向分析技术总结,-朱海涛 PB07210173,总结,目的 通过反汇编识别代码 代码结构 数据结构 运算 反编译识别高级代码流程,反汇编,代码结构 条件分支 Cmp byte prtXX,bl Jne other 比较操作 循环结构 again:xor ecx,ecx ;ecx清零 inc ecx ;计数 cmp ecx,05h ;循环4次 jbe again ;重复 函数 call ,jmp 压栈当前指令之后的指令地址 开始标志和结束标志 push ebp mov ebp,esp sub esp,48h,反汇编,数据结构 堆栈 全局变量 局部变量 常量 数组 结构体和联合体 类,逆向分析方
2、法,黑盒分析 从程序的外部,通过观察程序运行时候的行为,规则等来猜测和断定程序可能的实现方法,是否有存在脆弱点等 灰盒分析 借助一些专有工具,如api监视工具,陷阱工具,内存比较工具,文件监视工具等对目标程序进行监控,观察操作、调用以及结果,来猜测和断定程序可能的实现细节。 白盒分析 从代码级别上(可能是反汇编代码、反编译的伪代码或源代码),通过动态调试或静态反汇编分析和理解程序的功能、逻辑,找到程序的安全问题等,逆向手段,动态调试 通过调试器(OD)对目标程序进行追踪分析,跟踪内部状态 静态分析 使用反汇编器(IDA)或反编译器把目标程序变为可读的汇编代码或伪代码,然后分析程序的结构,流程,
3、逻辑等,静态分析实例,病毒与木马 隐藏产生恶性后果的代码 手段 自修改 加密技术,静态分析实例(续),病毒代码的段和偏移地址入栈,随即一条远返回指令将控制交给病毒代码 . ax存放代码段基址 push ax mov ax, 0CAh ;压入病毒偏移地址 push ax retf ;返回后直接转到seg:00ca . SEG:00CA .,静态分析实例(续),数据当作指令 start: call procX cont db 0E9h ;jmp 操作码 conta dw 0 procX: mov cs:conta,virusOffset ret . virus: end.,静态分析实例(续),病毒
4、代码会以加密的形式出现,而且这个代码仅在需要的时候才进行解密mov bx, offset virus_code ;欲解密代码的偏移地址 xor_loop: ;循环解密mov ah, bx xor ah, encrypt_val ;异或运算解密mov bx, ah inc bx cmp bx, offset virus_code+virus_size ;判断病毒代码是否结束jle xor_loop Ret,反编译,句法和语义分析 中间代码生成 控制流向图生成 数据流分析 控制流分析,句法和语义分析,源程序组织成汇编语言 检查指令,寻找成语 add ax, bp-4 adc dx, bp-2 ad
5、d dx:ax, bp-2:bp-4 语义等价表示 sub cx,50 cx := cx - 50 语义等价树(右图) 用于生成中间代码,控制流向图,确定程序中的高级结构,数据流分析阶段,改善中间代码,以便能够得到高级语言表达式 临时寄存器的使用和条件标志被清除掉 例: asgn ax, bp-0Eh asgn bx, bp-0Ch asgn bx, bx * 2 asgn ax, ax + bx asgn bp-0Eh, ax 高级表达式 asgn bp-0Eh, bp-0Eh + bp-0Ch * 2,控制流分析,整合控制流向图阶段的子程序图结构出整个程序的流程图也可以用于转换成高级语言的
6、代码集合,问题,反汇编出的源码,重新编译过最好 依照这个思路,把IDA里面反汇编的代码修改后运行.但实践证明这个不是有效好的方法 修改IDA反汇编出来的代码也比较困难.因为IDA中很多高级语言的结构,高级语言的库,关键字在汇编中不支持或者冲突,问题(续),源文件中的库文件 include WINDOWS.INC include kernel32.inc includelib kernel32.lib 消失在代码中 查找 include语句,寻找_idata中的dll名,得到常用包含库文件,; ?; Build this with the “Project“ menu using ; “Cons
7、ole Assemble and Link“; ?.486 ; create 32 bit code.model flat, stdcall ; 32 bit memory modeloption casemap :none ; case sensitiveinclude masm32includewindows.inc ; always firstinclude masm32macrosmacros.asm ; MASM support macros; -; include files that have MASM format prototypes for function calls;
8、-include masm32includemasm32.incinclude masm32includegdi32.incinclude masm32includeuser32.incinclude masm32includekernel32.inc; -; Library files that have definitions for function; exports and tested reliable prebuilt code.; -includelib masm32libmasm32.libincludelib masm32libgdi32.libincludelib masm
9、32libuser32.libincludelib masm32libkernel32.lib,.code ; Tell MASM where the code startsstart: ; The CODE entry point to the programprint chr$(“Hey, this actually works.“,13,10)exitend start ; Tell MASM where the program ends,.text.686p.mmx.model flat 模式定义少了语言模式和opention语句Imports from kernel32.dll.id
10、ata:00402000 ; Segment type: Externs .idata:00402000 ; _idata .idata:00402000 ; HANDLE _stdcall GetStdHandle(DWORD nStdHandle) .idata:00402000 extrn _imp_GetStdHandle:dword ; DATA XREF: GetStdHandler .idata:00402004 ; BOOL _stdcall WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,
11、LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped) .idata:00402004 extrn _imp_WriteFile:dword ; DATA XREF: WriteFiler .idata:00402008 ; void _stdcall ExitProcess(UINT uExitCode) .idata:00402008 extrn _imp_ExitProcess:dword ; DATA XREF: ExitProcessr,反汇编出来的代码直接编译后出错 修改模式定义.model flat,stdcallopt
12、ion casemap :none 把函数含有ebp+变量的代码全部修改为变量,ebp+这个是编译器加上去的,我们直接用的话,编译后会变成ebp+ebp+变量,容易出错 局部变量修改 nNumberOfBytesToWrite= dword ptr -0Ch 改为 local nNumberOfBytesToWrite,_text段修改删除 在_text段前增加.code_text segment para public CODE use32assume cs:_text ;org 401000hassume es:nothing, ss:nothing, ds:_data, fs:nothi
13、ng, gs:nothing和_text ends 删除以上部分删除align 200h移动修改_data段 在.code前增加.data,并且把_data段移动到这里 把_data segment para public DATA use32assume cs:_data ;org 403000h 和 ; sub_401089+A6r _data ends 删除以上部分,include包含语句添加进去删除_idata段 ; HANDLE _stdcall GetStdHandle(DWORD nStdHandle)extrn _imp_GetStdHandle:dword ; BOOL _s
14、tdcall WriteFile(HANDLE hFile,LPCVOID lpBuffer,DWORD nNumberOfBytesToWrite,LPDWORD lpNumberOfBytesWritten,LPOVERLAPPED lpOverlapped)extrn _imp_WriteFile:dword ; void _stdcall ExitProcess(UINT uExitCode)extrn _imp_ExitProcess:dword 删除GetStdHandle,WriteFile,ExitProcess函数的定义 ExitProcess proc near ; CODE XREF: .text:0040100Cpjmp ds:_imp_ExitProcess ExitProcess endp,谢谢,