多线程调试(第35课)

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创建线程的时候,直接修改此函数,让它直接返回,这样就不会再创建线程了,我们就可以只调试一个线程。

头像
  • ¥ 99.0元
  • 市场价:129.0元
  • ¥ 89.0元
  • 市场价:129.0元
  • ¥ 68.0元
  • 市场价:98.0元
  • ¥ 99.0元
  • 市场价:99.0元

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: