汇编基本指令复习,以及逆向中如何跟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内部进行分析了。
到这,基本的寄存器知识都结束了
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内部进行分析了。
到这,基本的寄存器知识都结束了
相关文章推荐
- java的io操作
- iOS UI 03 事件和手势
- 自己写的一个简单的资源管理器
- 复杂数据类型
- iOS UI 03 事件和手势
- 深入理解Linux修改hostname
- std::vector::iterator重载了下面哪些运算符
- UIButton中
- hdu 1195 Open the Lock(BFS && DBFS)
- Objective-C:NSSet和NSMutbaleSet的用法
- 原生js 封装 拖拽限制范围
- 归并两个有序链表
- 第12周项目2-操作用邻接表存储的图
- 用浏览器进行代码的简繁转换,解决乱码
- 三维旋转:旋转矩阵,欧拉角,四元数
- 单精度float和双精度double
- 实现图—构件图、部署图
- Java 的Hashtable和HashMap的区别
- AngularJS--ngRoute模块
- 设计模式之:桥连接模式