首页
社区
课程
招聘
[推荐]新手学反汇编,老鸟飞过~~
发表于: 2009-12-28 10:39 5047

[推荐]新手学反汇编,老鸟飞过~~

2009-12-28 10:39
5047
我想刚刚学习逆向的朋友,肯定都为有些东西记不住而烦恼过,但有些东西又不得不记住,今天就把以前学习的东西复习了一下,希望给像我这样的菜鸟有些帮助,

如果不知道下面写的什么可以看看《天书夜读》
  
stos 指令  (stosd   stosb   stosw)4   1    2
将eax中的数据放入edi所指的地址中,同时edi会增加4(字节)。

rep 使指令重复执行ecx中填写的次数。

occh 就是 int3 指令的机器码

c语言程序通过堆栈把参数从函数外部传入到函数内部。此外,在堆栈中划分区域来容纳函数的内部变量。

c程序默认的调用方式是堆栈总是调用方把参数反序(从右到左)压入堆栈中,被调用方把堆栈复原。这些参数对齐到机器字长 16位 2字节 ,32位  4字节,64位  8字节。

函数调用规则指的是调用者和被调用函数间传递参数及返回参数的方法。

在windows上,常用的有 Pascal 方式,WINAPI方式(_stdcall),c方式(_cdecl)

_cdecl c调用规则
1,参数从右到左进入堆栈
2,在函数返回后,调用者负责清除堆栈,所以这种调用会生成较大的可执行程序。

_stdcall 又称WINAPI,其调用规则
1,参数从右到左进入堆栈
2,被调用函数在返回前自行清理堆栈,所以生成的代码比cdecl小

Pascal调用规则
1,参数从左到右进入堆栈
2,被调用的函数在返回前自行清理堆栈
3,不支持可变参数的调用

此外,在windows内核中还有常见有快速调用方式(_fastcall);
在c++编译的代码中有 this call(_thiscall)。

例子:
void myFunction(int a ,int b)
{
int c=a+b;
}

在windows中,不管哪种调用方式都是返回值放在eax中,然后返回。

_cdecl方式下被调用函数需要做以下一些事情
1,保存ebp。ebp总是被我们用来保存这个函数执行之前的esp值。执行完毕后我们
恢复esp,同时,调用此函数的上层函数也用ebp做同样的事情,所以必须先把ebp压入堆栈,
返回之前弹出,避免ebp被我们改动。

2,保存esp到ebp中

3,在对战中腾出一个区域用来保存局部变量,这就是常说的局部变量保存在栈空间的原因
方法是:把esp减少一个数值,这样就等于压入了一堆变量。要恢复是只要把esp恢复成ebp中保存的数据就可以了。

4,保存 ebx,esi,edi到堆栈中,函数调用完后恢复。

5,把局部变量区域初始化成全0cc cc cc cc cch。0cch实际是int 3
指令的机器码,这是一个中断指令。因为局部变量不可能被执行,如果执行了,必然程序有错,这是发生中断来提示开发者。

6.然后做函数应该做的事情。参数的获取是ebp+12为第2个参数,ebp+8为第一个参数,最后ebp+4是要返回的地址。

7.恢复ebx,esi,edi,esp,ebp,最后返回。

如果函数要返回值,函数应该在返回之前,把返回值放入eax中。

///----------------------------------------------------------------
for循环  反汇编代码

mov  <循环变量>,<初始值> ;给循环变量赋初值
jmp B                                          ;跳转到第一次循环
A:  (该公循环变量)               ;修改循环变量
.........
B:cmp <循环变量>,<限制变量> ;检查循环条件
      jge   跳出循环
      (循环体)
      ............
      jmp A   ;跳回去修改循环变量  

//----------------------------------------------------------
do 循环    反汇编代码

................         ;执行循环体操作
cmp <循环变量>,<限制变量>
jl       <循环开始点>

//-----------------------------------------------------------
while循环  反汇编代码

A:cmp <循环变量>,<限制变量>
jge  B
(循环体)
..............
jmp  A
B:(循环结束)

//----------------------------------------------------
if 判断 反汇编代码

cmp   <条件>
条件跳转指令  <下一个分支>

//----------------------------------------------------
switch-case判断   
         switch的特点是有多个判断,因为switch显然不用判断大于小于,所以都是je,分别跳转到case处。最后一个是无条件跳转,直接跳到default处。如果有break,就会增加一个无条件跳转。

申明:转至网络,谢谢!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 33
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
写的不错。。。。。
2009-12-28 14:30
0
游客
登录 | 注册 方可回帖
返回
//