汇编基本指令复习,以及逆向中如何跟esp ,ebp参数

来源:互联网 发布:买口红热 知乎 编辑:程序博客网 时间:2024/06/05 16:37
mov eax , ebx   // eax = ebx
lea eax , [ebx + 30] // eax = ebx + 30
push pop  //入栈,出栈
pushax popax //全部入栈,全部出栈
add eax,5 // eax += 5
sub eax, 5 //eax -= 6
inc eax  // eax += 1
mul  //乘法
div  //除法




堆栈的学习


ESP   栈顶指针 
EBP栈底指针 (本层CALL的栈底)




改变堆栈的操作
push eax   // sub esp , 4   mov [esp] , eax
pop eax    // mov eax , [esp]   add esp , 4
call 1234  //push eip   jmp 1234
return 8   //pop eip   add esp , 8   eip表示下步要执行的地址
add esp , xxx
sub esp , xxx








栈底指针的学习
在逆向过程中,如果遇到
mov eax , [ebp + 8]
这样的如何去跟


这样的就需要把[ebp + 8]看成一个整体来处理


跟进CALL里面看,可以看到这样的代码
push ebp  //在栈中保存 栈顶的指针  (就是返回到xxx的上一个栈元素)
mov ebp , esp   
sub esp , 10
...
...
mov esp , ebp
pop ebp


堆栈中的数据格式如下


如下这样的格式


本层的临时参数2
本层的临时参数1
ebp保存的当前栈底的值
返回到上一层的call xxxxx
参数1
参数2
参数3
参数4


可以看出来,ebp + 4 保存的是上层call的地址
[ebp + 8] 是参数1 
同理,类推。






ESP寄存器分析:


在游戏逆向中,如何遇到
mov ecx , [esp + 20] //栈顶指针 + 偏移的格式


1.首先要确定[esp + 20]是局部变量,还是参数
那么如何确定呢?
有下面两个办法
1.通过手工的算在本层CALL中的堆栈的偏移,然后得到 [esp + 20]的具体位置
2.直接ctrl+f9返回到上层call,查看距离当前堆栈esp的位置,如果正好20在上层call的函数下面,那么就是上层call的参数。
如何在上层call的上面,那么就是局部变量,就需要在call内部进行分析了。


到这,基本的寄存器知识都结束了
0 0