32位软件逆向技术
启动函数:先调用启动函数->Winmain
调用约定:
__cdecl(C/C++和MFC规范) 从右到左,c编译函数外平衡add esp,0ch 函数名修饰格式:_functionname
__pascal 从左到右,子程序平衡 c编译函数名修饰格式:不能有任何修饰且全部大写
__stdcall 从右到左,子程序平衡 c编译函数名修饰格式:_functionname@number
__Fastcall 寄存器和栈,子程序平衡 c编译函数名修饰格式:@functionname@number
thiscall c++非静态类成员函数默认调用约定,每个函数隐含this参数,并且用ecx来传递进去子程序内。
类似于int __Fastcall Add(char a, long b)
利用栈传递参数:
若函数要用到局部变量,sub esp,04,栈只能对双操作数(4字节)操作
子程序都是先push ebp;mov ebp,esp;然后用ebp对栈进行操作
ret 8 表示ret后,对esp+8
enter和leave指令,enter相当于push ebp;mov ebp,esp;sub esp,xxx
leave相当于add esp,xxx ;pop ebp
利用寄存器传递参数:
VC++编译优先ecx,edx,由右到左,Borland Delphi/C++优先eax edx ecx,从左到右,Watcom C参数eax edx ebx ecx
返回值
用return时,多用eax返回,按引用返回时,修改内存地址数据
数据结构
局部变量:用栈存储 sub esp,n ; add esp ,-n;push reg(相当于sub esp,4利用寄存器存储。局部变量的值要记得初始化
全局变量(.data段的一段固定地址)
数组(.data段) 寻址:mov eax,[407030h(基址)+eax(偏移量)]
虚函数 一个指针指向虚函数表VTBL mov dword ptr [eax],4050A0;mov esi,eax;mov eax,dword ptr [esi]其中4050A0为虚函数表指针,最后eax为函数地址
控制语句 IF-THEN-ELSE语句
SWITCH-CASE语句
转移指令机器计算,短转移2字节-128~127,长转移5字节或6字节,其中四字节代表偏移量,无条件转移EB
条件设置语句SETcc 8位寄存器或者单字节内存单元,cmp a,b;setge al,判断ab关系,然后对al设置1/0
纯算法实现逻辑判断
循环语句
数学运算符 加法减法lea edx,dword ptr [ecx+eax+78],乘法lea edx,dword ptr [eax+8*eax],除法,使用扩展指令cdq指令,把eax当作有符号数,若eax最高为为1,edx为FFFFFFFFH,若最高为0,edx为0h,或进行倒数相乘(较麻烦)
文本字符串(c字符串,PASCAL字符串)c字符串\0,DOS字符串$,PASCAL字符串首位为字符串个数,Delphi字符串,首两位为字符串个数。字符串寻址指令mov①mov eax,[401000h]②mov eax,[ecx],ecx为地址;lea①lea eax,[401000h]把401000h写入eax寄存器。字母大小转换。计算字符串长度strlen()
指令修改技巧
64位软件逆向分析技术
E->R RAX RBX RCX ...R8...R15,8个128位XMM寄存器
工具:IDA Pro Windbg x64dbg
栈平衡 8个字节一个数据,VS编译器申请栈空间要保证对齐值为16
启动函数 找main函数c/c++->所有选项->运行库->多线程DLL(/MD)出现call main
/MT(多线程),会出现call cs:exit,上面的第一个call通常为main(或者里面的第一个call)
调用约定 普通类型RCX RDX R8 R9 浮点型 XMM0 XMM1 XMM2 XMM3,进入call之前四个参数以后就用栈来存放。栈上要预留参数的位置(sub rsp,20h)。20h代表有四个参数。参数为结构体时,不超过8字节用rcx传递;超过8字节,先把斩内容复制到栈,把栈地址放入寄存器lea rax,[rsp+50h]; lea rcx,[rsp+28h];mov rdi,rax;mov rsi,rcx;
对于thiscall调用,还要把this指针隐含传进函数内
套路:main函数保留参数至栈;保护环境;申请留栈空间并初始化
mov [rsp+10h],rdx
mov [rsp+8],ecx
push rdi
sub rsp,20h
mov rdi,rsp
mov ecx,8
mov eax,0cccccccch
rep stosd
数据结构 {局部变量,全局变量,数组} 前两者与32位类似