回复 9楼 vs_inzaghi
我给你证明一个问题: 反汇编是用来 zhuangbi 的,/
定理: 一段正确的 c 语言程序 必然 会 翻译成一段正确的 汇编代码
如果这个 定理不成立, 那么 连正确的 汇编代码 都生成不出来,还去反汇编,有没意义?
如果 一个程序员连 c 语言的代码都分不清是正确的还是错误的, 还去反汇编,有没意义?
推论:最麻烦的 bug 就是 内存非法仿问 和 内存泄漏了
如果其他的语法问题,还去反汇编, 有没意义?
假设:程序在某一段代码处崩了
如果崩的位置有明确的 c 语言错误, 还去反汇编有没意义?
如果崩的位置没有错误, 可以断定是其他的代码意外修改了内存,上万行的代码, 从 c 语言这个宏观的角度
都不能定位错误, 还去反汇编, 一目十行,1年也看不出个所以然, 有没意义?
如果内存非法仿问, 程序发布后,没有出现异常, 一个错误都还没表现出来的程序, 还去反汇编有没意义?
假设:程序存在内存泄漏问题,
如果在 c 语言的级别上, 可以在 malloc/free记录, 然后 根据 malloc 与 free 配对,
遍历列表判断 内存泄漏, 实在不懂 汇编级调试 怎么来 定位 内存泄漏
例证:
c 库中有安全隐患的函数最明显的就是 字符串处理函数了,
像 scanf(), gets(), strcpy(), sprintf(),
看 sprintf()函数吧,
#include <stdio.h>
int main(void)
{
char s[5] = {0};
sprintf(s, "%s", "blueguy");
return 0;
}
汇编级调试高手 阿Q 反汇编了,一行一行的看, 将栈顶指针esp, 栈底指针ebp压栈,保存 函数的返回地址,
给 局部变量 s 分配 5个字节,esp 下移 5个字节, 调用 sprintf()函数,将 "blueguy" 复制到 s[]中,
不费吹灰之力发现,原来是 y 覆盖了函数的返回地址啊,阿Q的精神胜利法起作用了:
利用汇编可以明确的看到 程序的运行情况, 明确的看到 栈的分配情况,明确的看到栈是怎么被破坏的。
好了, 阿Q, 你胜利了, 全世界都被你打败了,
[
本帖最后由 BlueGuy 于 2010-7-14 08:40 编辑 ]