加密与解密——逆向分析技术

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位类似

你可能感兴趣的:(学习日记)