前言
每个人在调试中快速查找所需代码时都有不同的方法,但是最基本最常用的有下面几种。
学习这4种方法前我们需要思考一个问题。我们知道,运行HelloWorld.exe程序会弹出一个消息框,显示“Hello
World!”信息。固然是因为我们编写了代码,可在这种情形下,只要运行一下程序,不论是谁都能轻松意识到这一点。如果你熟悉win32 api的开发,看到弹出的消息框就会想到,这是调用MessageBox()
API的结果。应用程序的功能非常明确,只要运行一下程序,就能大致推测出其内部结构。不过前提是你已经具备了开发和分析代码的经验。
一、代码执行法
我们需要查找的是main()函数中调用MessageBox()函数的代码。在调试器中调试HelloWorld.exe(F8)时,main()函数的MessageBox()函数在某个时刻就会被调用执行,弹出消息对话框,显示“Hello World!”这条信息。
上面就是代码执行法的基本原理,当程序功能非常明确时,我们可以逐条执行指令来查找需要查找的位置。但是代码执行法仅适用于被调试的代码量不大、且程序功能明确的情况。倘若被调试的代码量很大且比较复杂时,此种方法就不再适用了。下面使用代码执行法来查找代码中的main()函数。从“大本营”(40104F)开始,按F8键逐行执行命令,在某个时刻弹出消息对话框,显示“Hello World!”信息。按Ctrl+F2键再次载入待调试的可执行文件并重新调试,不断按F8键,某个时刻一定会弹出消息对话框。弹出消息对话框时调用的函数即为main()函数。如图2-20所示,地址401144处有一条函数调用指令“CALL00401000”,被调用的函数地址为401000,按F7键(Step Into)进入被调用的函数,可以发现该函数就是我们要查找的main()函数。