call是如何练成的 新手进阶

社区服务
高级搜索
猴岛论坛电脑百科call是如何练成的 新手进阶
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
0个回复

call是如何练成的 新手进阶

楼层直达
543820650

ZxID:7263484

等级: 列兵
举报 只看楼主 使用道具 楼主   发表于: 2012-08-19 0
遇到一个CALL应该如何写?
这个是写一个内挂不可避免的问题.刚初学的朋友可能会不知道如何入手.想起刚学这方面的时候,绕过很多弯路,现在把一些经验写出来给大家参考参考吧,不是很高深的东西,但我觉得对某些人很有帮助.
CALL是什么?
CALL是汇编中的一个指令,CPU执行这条指令会执行2个动作 一:压入EIP入栈 二:跳转到后面的地址.  跟RETN指令配合就实现了汇编中子程序的作用,通常我们常说的写CALL就是 调用游戏中已经存在的功能子程序.
比如说
viod myadd (int a, int b)
{
int c=a+b;
}
这是一个简单的子程序,当我们用程序语言调用那么就是  myadd(5,4);
而在汇编里则是
push 4
push 5
call myadd
编译好的程序不会存在什么函数变量和子程序. 只有1和0 . 所以编译器会给myadd 分配一个地址.在反汇编里就是
push 4
push 5
call ********
CALL ******* 并不单单就是子程序的调用,他还可以调用 函数 API.
如函数  send
send(
socket;
buf;
len;
flags;
)
在汇编里调用就是
push flags
push len
push buf
push socket
call send
参数在反汇编里表现形式.
在汇编或反汇编里参数都是压入堆栈来供CALL调用的.而CALL以[ESP+*]的形式读取参数.
如:
viod myadd(int a,int b)
{
int c=a+b
}
myadd(4,5);
在反汇编参数 4 和参数 5 在反汇编里的实现形式是
push 5
push 4
call ********
写CALL的时候有时候会给EAX赋值而有些时候却要给ECX赋值,如何知道要给某个寄存器赋值呢?
一般学过智辅方面的知识的朋友大概都是 汇编指令 mov 的 实现的功能.
mov 操作数1 操作数2
将操作数2 的值放入到操作数1 里.
如:
mov eax,ebx
将 ebx的值放入到eax里
寄存器的作用易辅 大家都知道是用来存放数据供CPU调用.所以寄存器本身是空的.
在调用一个CALL的时候 所有的寄存器都是空的或者是调用上一个CALL遗留下来的残留数据.
当这个CALL需要一个200的值,通过ebx 储存.
那么我们调用CALL而不给ebx赋值 ,调用的时候CALL还是会读取当前ebx的值,而这个时候寄存器的值则是0或者上一个CALL调用后残留数据.而不是CALL想要的200数据.
调用CALL之所以需要寄存器,是因为CALL通过调用相关的寄存器获取到特定的数值.
而CALL调用寄存器的语句常用则有 PUSH  寄存器,    mov 寄存器,寄存器  lea 寄存器,寄存器 等等.
这里我们要提一下数据分析 寄存器环境保护,众所周知,CPU的寄存器只有一个EAX ,EBX,ECX,EDX......  如果一个寄存器EAX里存放着一些资料供后面使用,但当前CALL却需要EAX储存一些临时的数值这个时候要怎么办?
这个时候我们则需要把寄存器EAX里的数值保存到一个地方,然后把EAX给CALL使用 用完后在把那个值放
回到寄存器EAX里去.  这个过程则是寄存器的环境保护. 在反汇编里保存寄存器的地方就是堆栈.
当你在一个子程序头部看到一些 push eax  而又在尾部看到 pop eax 的时候 这里的eax 就是寄存器数值保护,push eax  则是保存eax储存的数值,  pop eax则是放回去.
堆栈如何平衡?
如何理解堆栈的平衡呢?当push 压入了一个堆栈, esp的值就会-4 来存放数值. CALL完后就需要+4来把esp的值恢复回去.如何知道一个CALL是否需要堆栈平衡呢?看CALL内部的尾部就可以了, 如果CALL尾部有RETN **  或者add esp,*之类的,则是CALL自动平衡了一些堆栈,至于恢复了多少则要看指令后面带的数字.
如何写一个CALL?
其实写CALL很简单,先处理堆栈和寄存器,在处理堆栈和寄存器中的数值,最后处理堆栈平衡就可以了,
写CALL之前你要明白几个东西.
viod myadd(int a,int b)
{
int c=a+b
}
myadd(4,5);  //程序的调用代码
在反汇编里程序的调用代码为
mov eax,5
mov ebx,4
push eax
push ebx
call 5e0000  //假设 CALL的地址为5e0000
add esp,8
retn
« 返回列表
发帖 回复