首页
社区
课程
招聘
[旧帖] 如何在调试时得到线程ID号呀 0.00雪花
发表于: 2008-7-20 00:22 4620

[旧帖] 如何在调试时得到线程ID号呀 0.00雪花

2008-7-20 00:22
4620
我调试一个小游戏,用OD挂起线程功能,发现其中一个线程是控制键盘输入的,我就是想改一下键盘映射。我用IDA的导入功能查找到有CreateThread,_beginthead,_begintreadex,于是用bp全部下了断点。但是线程ID号怎么查看呀,我都是一到断点,点运行到返回,然后看EAX记录下来。直到程序完全启动,再打开OD的进程窗口一看,竟然一个都不匹配,我完全找不到输入输入控制线程是什么时候创建的。
刚开始我以为OD的进程窗口中的入口就是线程的lpStartAddress,下了断点,一看晕了,竟然是ntdll的领域里。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
休息了一会,自己又想通了。
我错在对API一知半解上,其实_beginthead,_begintreadex最终都是调用CreateThread。CreateThread的返回值是EAX,表示线程句柄号,[ESP+18]即第6个参数才是线程ID号的地址。如

0012F900   6D189CB9  /CALL 到 CreateThread 来自 DINPUT8.6D189CB3
0012F904   00000000  |pSecurity = NULL
0012F908   00000000  |StackSize = 0
0012F90C   6D1899B1  |ThreadFunction = DINPUT8.6D1899B1
0012F910   001C2438  |pThreadParm = 001C2438
0012F914   00000000  |CreationFlags = 0
0012F918   001C2438  \pThreadId = 001C2438

CreateThread返回前,句柄号=EAX,ID号=[001C2438],这个ID号才能在OD的线程窗口中看到。

但是问题却来了,看来这个线程是DINPUT8创建的,那用户程序里究竟哪儿在处理输入信息呢?我的猜测是先DINPUT8->CreateDeviceXXX,然后才是在主进程的子线程里面无线循环读keyboard->GetDeviceState,怎么DINPUT8自己搞了个线程出来了,这样的话事件处理入口在哪儿?
2008-7-20 01:31
0
游客
登录 | 注册 方可回帖
返回
//