2.
反汇编算法:
线性扫描(linear sweep)
递归下降(recursive descent)
工具:
file:通过特定字段来确定文件类型
PE Tools:windows平台
PEiD:
nm:检查中间目标文件中的声明函数和全局变量名称
ldd:
创建可执行程序时,必须解析该文件引用的任何库函数地址。连接器通过两种方法:静态链接(static linking)和动态链接(dynamic linking)
ex:gcc -o example.out example.c
gcc -o example.out example.c --static
linux:ldd程序可以指明可执行程序所需要的库:
ldd example.out
windows:Visual Studio中的dumpbin:
dumpbin /dependents example.exe
objdump: 可以解析elf pe格式,依赖libbfd(一个二进制工具组件);readelf只可以解析elf(不依赖于libbfd)。
dumpbin:windows平台,类似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://www.binarypool.com/idapluginwriting/idapw.pdf
cfg:配置文件
idc:IDA的内置脚本语言IDC所需的核心文件
ids:符号文件
loaders:
plugins:插件
procs:处理器模块
sig:
til:类型库信息
调用约定:
C调用约定:x86体系结构的许多C编译器使用的默认调用约定。
_cdecl:调用方按从右到左的顺序将函数参数放入栈中,调用结束时,调用方(而不是被调用方)负责从栈中清除参数。(由于调用方负责清除参数,所以生成的程序相对较大)
微软标准调用约定:微软定义的标准
_stdcall:调用方按从右到左的顺序将函数参数放入栈中,调用结束时,被调用方负责从栈中清除参数。(参数个数不确定函数除外,因为被调用者不知道参数个数,无法清除参数)
x86fastcall调用约定:是stdcall的一个变体,向CPU寄存器最多传递连个参数,传递给函数的前两个参数分别放在ECX,EDX寄存器中,剩余的参数用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)保存ebp,ebp用于保存函数执行之前的esp值,函数执行结束,用ebp恢复esp。
(2)保存esp到ebp中。
上述两步汇编代码:
push ebp
mov ebp, esp
(3)在堆栈中划分区域存储局部变量。通常方法是esp减去一个数值。
(4)保存ebx,esi,edi到堆栈中,函数调用完后恢复。
对应代码如下:
sub esp 0cch
push ebx
push esi
push edi
(5)把局部变量区域初始化为0cccccch.。因为0cch是int 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)恢复ebx,esi,edi,esp,ebp。最后返回。
代码:
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
程序分为调试版(Debug)和发行版(Release)
check版 free版
for结构汇编结构:
mov <循环变量>, <初始值>;循环变量赋初值
jmp B;跳到第一次循环处
A:(改变循环变量) ;修改循环变量
...
B:cmp <循环变量>,<限制变量> ;检查循环条件
jge 跳出循环
(循环体)
...
jmp A ;跳回去修改循环变量
do循环:
(循环体)
cmp <循环变量>, <限制变量>
jl <循环开始点>
while循环:
A:cmp <循环变量>, <限制变量>
jge B (不符合循环条件)
(循环体)
...
jmp A
B:(循环结束)
if-else结构: