调试用VC++编写的helloworld程序,在反汇编代码中查找main函数,MessageBox函数;
#include "windows.h" #include "tchar.h" int _tmain(int argc, TCHAR * argv[]) { MessageBox(NULL,"Hello World!","bcbobo21cn",MB_OK); return 0; }
在弹出的 组建 对话框中,选择 Win32 Release;
把HelloWorld编译为release版本。
启动Ollydbg汉化版;启动失败;
改用英文原版;打开前面的helloworld程序;
停留在00401020处;
调试器停止的地点是EP代码,EP即入口点;再往下找找;
再往下,看到了调用GetVersion函数,GetCommandLineA函数;获取命令行参数之后,应该就到main函数了;
看到上面CALL 00401000;
查看00401000;
看到了VC程序中给出的参数;00401000处先PUSH了4个参数入栈,然后调用了USER32中的MessageBoxA;
计算器的基地址是01000000;
该工具会给出详细PE信息;
在工具条上按 I 键,才能看到PE导入表;
看到了User32中的SetWindowText;VA是进程虚拟内存的绝对地址,RVA是从某个基准位置开始的相对地址;
下面开始捕获计算器显示输入数字的动作;
打开calc.exe,停留在003D2D6C;
右击,选择如下菜单;
在所有SetWindowText处设置断点;
执行计算器,看下面代码,TranslateMessage、DispatchMessage、GetMessage;此处是计算器窗口的消息循环部分;
在计算器中输入数字,程序中断在了00BC3678处的SetWindowText;
看右下角的栈窗口,发现了输入的数字;8957;输入了4次数字;在此中断了4次;
打开Windows自带记事本,
不能打开;Ollydbg不支持64位程序;本机为64位;
看下本机的notepad.exe,它确实是64位的;
网上重新下一个notepad.exe;打开看看,是32位的;下面调试此程序;
根据资料;notepad.exe保存文件是调用了WriteFile,位于Kernel32中;
执行记事本,排序以后,在所有WriteFile处设置断点;
程序停留处是0100739D;
运行,记事本窗口出现;输入“AAAA”;然后保存;点击 保存 按钮后,程序中断在01004C2A处的WriteFile;
看右下角的栈窗口,发现了输入的文本“AAAA”;