汇编1-IDApro权威指南

2.

反汇编算法:

线性扫描(linear sweep

递归下降(recursive descent

 

工具:

file:通过特定字段来确定文件类型

 

PE Toolswindows平台

 

PEiD

 

nm:检查中间目标文件中的声明函数和全局变量名称

 

ldd:

创建可执行程序时,必须解析该文件引用的任何库函数地址。连接器通过两种方法:静态链接(static linking)和动态链接(dynamic linking

exgcc -o example.out example.c

gcc -o example.out example.c --static

linuxldd程序可以指明可执行程序所需要的库:

ldd example.out

windowsVisual Studio中的dumpbin

dumpbin  /dependents example.exe

 

objdump: 可以解析elf pe格式,依赖libbfd(一个二进制工具组件);readelf只可以解析elf(不依赖于libbfd)。

 

dumpbinwindows平台,类似objdump

 

strings: strings example.exe  

参数-a可使strings扫描整个文件  -t显示每个字符串的文件偏移

 

流式反汇编器:ndisasm   diStorm,可以反汇编网络输入(检查恶意代码),ISO等等。

 

3.

web

http://www.hex-rays.com/idapro/idasupport.htm

openrce.org

htttp://www.woodmann.com/

htttp://www.hexblog.com

http://old.idapalace.net

http://www.binarypool.com/idapluginwriting/idapw.pdf

cfg:配置文件

idcIDA的内置脚本语言IDC所需的核心文件

ids:符号文件

loaders

plugins:插件

procs:处理器模块

sig

til:类型库信息

调用约定:

 

C调用约定:x86体系结构的许多C编译器使用的默认调用约定。

_cdecl:调用方按从右到左的顺序将函数参数放入栈中,调用结束时,调用方(而不是被调用方)负责从栈中清除参数。(由于调用方负责清除参数,所以生成的程序相对较大)

 

微软标准调用约定:微软定义的标准

_stdcall:调用方按从右到左的顺序将函数参数放入栈中,调用结束时,被调用方负责从栈中清除参数。(参数个数不确定函数除外,因为被调用者不知道参数个数,无法清除参数)

 

x86fastcall调用约定:是stdcall的一个变体,向CPU寄存器最多传递连个参数,传递给函数的前两个参数分别放在ECXEDX寄存器中,剩余的参数用stdcall约定从右到左放入栈中。在调用返回时,被调用函数负责清空栈。

 

C++调用约定:_thiscall

MicrosoftVisualC++提供thiscall调用约定,将this传递到ECX寄存器中。

GNU g++编译器将this看做非静态成员函数的第一个隐含参数,其他与cdecl约定相同。使用g++编译的代码,在调用非静态成员函数之前,this被放置在栈顶,调用方负责在函数返回时清除堆栈(至少一个参数,this)。

 

系统调用:特殊的函数调用,从用户模式进入内核模式。

linux x86系统:使用int 0x80启动系统调用,参数一般位于寄存器中,也可以在栈中。

大多数x86系统:sysenter指令,系统调用参数位于堆栈上,EAX中存放系统调用编号。

 

局部变量布局:不存在函数局部变量布局约定。

1.计算局部变量所需空间

2.确定寄存器是否可满足需求,或者必须在栈上分配

 

_cdecl

1)保存ebpebp用于保存函数执行之前的esp值,函数执行结束,用ebp恢复esp

2)保存espebp中。

上述两步汇编代码:

push ebp

mov ebp, esp

3)在堆栈中划分区域存储局部变量。通常方法是esp减去一个数值。

4)保存ebxesiedi到堆栈中,函数调用完后恢复。

对应代码如下:

sub esp 0cch

push ebx

push esi

push edi

5)把局部变量区域初始化为0cccccch.。因为0cchint 3指令的机器码,是一个断点中断指令。

代码:

lea edi, [ebp-0cch]

mov ecx, 33h

mov eax, 0 cccc cccc h

rep stos dword ptr [edi]

6)执行函数,参数获取ebp+12为第二个参数,ebp+8为第一个参数,ebp+4为返回地址。

7)恢复ebxesiediespebp。最后返回。

代码:

pop edi

pop esi

pop ebx

mov espebp

pop ebp

ret

 

程序分为调试版(Debug)和发行版(Release

        check版          free

 

for结构汇编结构:

mov <循环变量>, <初始值>;循环变量赋初值

jmp B;跳到第一次循环处

A:(改变循环变量)  ;修改循环变量

...

Bcmp <循环变量><限制变量;检查循环条件

jge 跳出循环

(循环体)

...

jmp A  ;跳回去修改循环变量

 

do循环:

(循环体)

cmp <循环变量>, <限制变量>

jl <循环开始点>

 

 

 

 

 

 

 

while循环:

Acmp <循环变量>, <限制变量>

jge B (不符合循环条件)

(循环体)

...

jmp A

B(循环结束)

 

if-else结构:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值