您的位置:首页 > 其它

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

2015-12-13 15:50 507 查看
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内部进行分析了。

到这,基本的寄存器知识都结束了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: