windows逆向初级之前言
期间在家里其实有用纸质的笔记本写笔记,尽量让笔记看起来不那么流水,
笔记不用去记录既定事实或者公理,而应该去记录思考所得或者Question and Answer.
,从这里开始学习windows逆向。
概要目录
- 函数,函数调用,函数约定,堆栈图
- 数据类型,整数、小数、字符等
- 数据类型,一个字节,两个字节,三个字节……short,int,long,char,float,double,结构,联合,枚举,位段
- 类型转换
- 指针~各种变态指针~指针类型转换
- 正向代码强化练习:
内存读写训练:数组操作、多维数组操作、结构体操作
编程逻辑训练:排序、查找
数据结构训练:链表、二叉树 - C语言逆向:
表达式
流程控制:分支、循环、Switch
数组逆向
链表逆向
二叉树逆向
汇编基础
- 栈顶在低位地址向低地址扩展,栈底在高位地址,栈是一个书箱子,Last in first out/FILO
- call 0x00401000 函数调用时的操作:
- 把当前领空的下一条命令
地址
(=当前EIP地址加上当前指令长度)压入堆栈(函数执行完成以后的返回地址) - 栈顶指针ESP减4
- 函数的返回结果可以放入寄存器或者某个内存中
- 把当前领空的下一条命令
- 不同编译器(如VS2008,VS2012)对于局部变量空间大小设置不一样,
sub ESP,40
- STOS/MOVS,看D=0或D=1位以判断循环时+4还是-4
- lea目标地址传送指令,只传送地址;mov传送的是地址所指向的值
push ebp # 保存ebp
move ebp,esp # 保存栈底,以提升栈顶为函数执行提供空间
sub esp,40 # 局部变量空间
push ebx
push esi
push edi # 保存现场入栈,ebx,esi,edi
lea edi,dword ptr ss:[ebp-40] # 局部变量低位地址给EDI
mov ecx,10 # 循环次数给计数寄存器
mov eax,0xCCCCCCCC # CC = INT3 硬编码中断
REP stos dword ptr es:[EDI] # 将EAX的值初始化到EDI所指向地址,循环ECX次
mov eax,dword ptr ss:[ebp+8] # call 函数的形参1
add eax,dword ptr ss:[ebp+c] # call 函数的形参2
pop edi
pop esi
pop ebx # 还原现场出栈
mov esp,ebp # 还原栈底指针
pop ebp # 出栈
retn # pop eip(函数执行完返回地址) 栈底自动加4