OD调试软件时,它每次只能跟一个线程,如果遇到的软件创建了很多线程,那么调试起来就比较麻烦了,本节介绍一下多线程的调试方法。
首先看一下线程创建的函数:
HANDLE CreateThread(
LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD
SIZE_T dwStackSize,//initialstacksize
LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction
LPVOID lpParameter,//threadargument
DWORD dwCreationFlags,//creationoption
LPDWORD lpThreadId//threadidentifier
)
重点看第三个和第四个函数,其中第三个参数指定了新线程的入口地址,第四个参数为新线程所需的参数,当程序调用此函数来创建线程的时候,定位到线程的入口地址设置断点,一般情况下,程序会在后面调用Sleep或WaitForSingleObject函数,这样的话,程序的控制权就到了新线程里面。
如果程序没有调用Sleep或WaitForSingleObject函数,那么可以修改函数的代码,强制程序调用这两个函数,这样程序就转到新线程中执行。另一种方法是修改程序的EIP,使其指向新线程入口,如果有参数的话,还要修改寄存器的值,使其指向参数地址,不过这种方法可能会造成寄存器内容不正确,环境异常,从而造成程序执行崩溃。
还有一种方法来调试多线程。如果程序多次调用CreateThread,确定一个我们打算调试的线程,并让这个线程创建成功,当程序再调用CreateThread创建线程的时候,直接修改此函数,让它直接返回,这样就不会再创建线程了,我们就可以只调试一个线程。