1.文件信息判别
工具:peid、exeinfope DIE
判断运行系统:win/linux
运行位数(32/64)
保护(Pack/ASLR/Nx……)
checksec --file=
2.汇编
(1)寄存器
|
X86
|
x64
|
作用
|
标准寄存器
|
eax
|
rax
|
返回值
|
ebx
|
ebx
|
计次
|
ecx
|
rcx
|
计次
|
edx
|
rdx
|
计次
|
edi
|
rdi
|
字符串指针
|
esi
|
rsi
|
字符串指针
|
ebp
|
rbp
|
栈底指针
|
esp
|
rsp
|
栈顶指针
|
eip
|
rip
|
opcode指针
|
|
|
r8-r15
|
参数
|
|
eax>ax=[ah,al]
|
rax>eax>ax=[ah,al]
|
|
段寄存器 CS\DS\SS\ES\FS\GS
标志寄存器、浮点寄存器
(2)汇编代码
内存:由地址和数据构成
数据表示方式:[eax],[ebp-10] 相当于c的 **(addr)
地址:00401000h,0x401000
mov a,b 赋值
lea a,[addr] a=&*(addr)
add/sub/mul/div/idiv 算数运算
and/or/not 逻辑运算
shl/rhl/xor 位运算
cmp/test 比较
jmp/jne/je/jnz/jb/ja…… 各种跳转
call 函数调用
retn 返回
push/pop 参数传入/释放
enter =push ebp, mov ebp,esp
leave =mov esp,ebp;pop ebp
int3 断点中断
nop 无实际意义
pushad/popad/pushfd/popfd
fstp/fadd/fmul/fdiv
等价指令:
mov eax,0=xor eax,eax
mul eax,4=shl eax,2
call addr=push addr;retn =push nopcode+mov eip,addr
push sth=sub esp,0x4 mov [esp],sth
pop sth=add esp,0x4 mov sth,[esp]
retn=mov eip,[esp] add esp,0x4
(3)反汇编
递归分析与线性分析
(4)调用约定
调用约定
|
调用场合
|
入栈方式
|
栈平衡方式
|
x86传参
|
x64
|
__stdcall
|
win api
|
参数从右向左依次入栈
|
被调用函数(内)
|
————
|
-------
|
__cdecl
|
c/c++默认
|
函数调用者(外)
|
在栈上
|
rdi,rsi.rdx,rcx,r8,r9对应前六,其余右往左压栈
|
__fastcall
|
高性能
|
从左开始将不大于4Byte的参数放入ecx,edx,其余从右往左入栈
|
被调用函数(内)
|
————
|
————
|
__syscall
|
system
|
-------------
|
--------
|
eax为调用编号ebx,ecx,edx,esi,edi,ebp对应前六个参数,其余右往左压栈
|
rax为调用编号,其他与__cdecl一致
|
arm程序 r0~r3对应前四个参数,其余右往左压栈
|
3.工具的使用
od\ida\ghidra\gdb\x64dbg
(1)伪代码判读
即时函数:((返回值类型 (调用约定)(参数类型))函数指针地址)(调用所传递的参数)
函数指针和字符串指针的判读
(2)断点
硬件断点、内存断点、条件断点、int3断点
(3)PE结构
TEB,PEB,TLS,SEH,IAT,EAT
4.保护
(1)内存改写
Inject,Hook,DllHijack
(2)反调试
(1)IsDebuggerPresent\CheckRemoteDebuggerPresent\NtQueryInformationProcess\NtQueryObject
(2)peb
(3)异常处理、TLS
(4)时间间隔 GetTickCount、alarm等
(5)进程、窗口句柄、名称
(6)OutPutDebugString漏洞
(7)陷阱标志
(8)虚拟机的检测
(3)花指令
call 00h
jmp db
push retn
push/pop………………
抵消式
无效式
(4)vm
(5)Pack处理
(1)esp定律
(2)内存镜像
(3)单步 下跳上不跳 近进远过
(4)特殊断点法 GetVersion
(5)最后一次异常法
(6)代码解析(代码段解码、硬件断点)
5.方法与算法
(1)方法
(1)定位主函数
(2)断点
(3)字符串搜索
(4)栈回溯
(5)OllyScript脚本
(6)直接取字符串
(7)eip截取
(2)算法
(1)异或
(2)Base64
(3)md5/sha1/sha256
(4)RC3/4
(5)DES/AES
(6)CRC32
(7)TEA
6.特殊语言调试
如:python(pyc字节码与打包)\c#\vb\delphi\go\e\rust
****Attention*****
[1]整数在内存中的数据和自身的十六进制相反
[2]易语言的数组下标起始为1
[3]转义字符,如:\"
[4]java运行 java -jar [arg]