【逆向】汇编基础指令-例子call调用
寄存器:
主要记住以下几个
Eax:一般用来存放call返回值 模块命令 系统命令 api
call() :函数,参数,返回 -》 eax
Ecx : 隐藏的对象基址
EBp: 表示参数或变量
参数 [ebp+0*4(n+1)] n代表第几个参数
变量 [ebp+0*4*n] n代表第几个变量
eip: 程序下一步要执行的地址
esp:堆栈
ebx
esi
edi
[local.n]:
[local.1] 第一个变量 ,[local.2]第二个变量,以此类推
mov:
mov eax,123 将值123 赋值给eax
mov ebx,13 将值13 赋值给ebx
push:
入栈,相当于传参
例子1:
定义一个方法,里面带有一个变量c
现在需要 数字 123 + 456 的和 赋值给变量c
可以这么写
mov eax,123
mov ebx,456
add eax,ebx
mov [local.1],eax
[local.1]代表的是这个子程序的第一个变量,这里是简便写法,还可以用[ebp+0*4]来表示
例子2,调用call
定义一个无参方法,会输出语句:“hello”
现在要从其他地方 用汇编调用 ,可以这么写
先定义一个变量,指向call的地址,然后
call eax 就能直接调用
或者 call [local.1]
有参方法调用
定义一个有参方法,需要传入两个参数,都是int类型,一个a,一个b
会输出 a+b的值
现在要调用,可以这么写:
先定义一个变量,指向call的地址,然后
push 1
puth 2
call eax 或者 call [local.1]
call的值可以用 mov eax来接收,如 mov [local.1],eax 表示把call的结果传给第一个变量
说明:push的顺序是反过来的
例如 参数1要传入1,参数2要传入5
那么push 顺序是:
push 5
push 1
有时候我们是调用别人的call 可能会出现问题
正常调用call后需要我们进行堆栈平衡,
add esp,0*4(n):外平衡
如果call只有一个参数那么就是 add esp,0*4
如果call有两个参数 那么就是 add esp,0*8
三个参数就是 add esp,0*c【这里为什么是0*c 自己去计算器10进制转换成16进制就知道了】