您的位置:首页 > 其它

《黑客免杀攻防》 软件逆向工程1-3

2014-11-16 16:08 288 查看

1程序从哪里开始运行?寻找main

显著特征:有3个参数,后两个参数都是指针(4字节),在退出代码附近。

A字符串搜索法

搜索Helloworld 哈

然后逐步上翻

B栈回溯法

观察栈中的“返回到”

C逐步分析法

从代码开始分层次寻找。

2简单的例子

ESP是栈指针,[ESP+4]的意思是在当前堆栈+4的地方取其内容。

3函数识别初探

A主程序在调用函数时:

a保存返回地址并传递给函数

b参数传入与栈平衡

B函数调用约定

调用约定关键字参数入栈顺序回收堆栈
C规范_cdecl从右到左调用者负责
Pascal规范pascal从左到右被调用者负责
快速调用规范_fastcall从右到左,使用寄存器传参被调用者负责
标准调用规范_stdcall从右到左被调用者负责
注:Pascal规范在VC++ 5.X后不再被支持。据说很少接触。

采用快速调用的函数参数是由ecx与edx这两个寄存器完成的,而超出部分的参数则依然要使用传统的压栈方式传递。

总结:

a几乎全部函数调用方式都会用栈来传递参数,只有使用快速调用约定后且参数少于等于2时才会全部采用寄存器传参。

b函数起始部分:以push ebp和mov ebp,esp汇编指令开始

c每个函数由call指令调用,且以retn指令结尾。

d裸函数来进行内联汇编可以改变以上的某些规律。

注:裸函数是指编译器生成汇编代码时不添加任何额外的指令,包括retn。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: