【逆向】汇编基础指令-例子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进制就知道了】

 

posted @ 2022-04-05 11:13  Hello霖  阅读(1138)  评论(0编辑  收藏  举报