首页
社区
课程
招聘
GetThreadContext调用后无效
发表于: 2007-3-20 07:52 10333

GetThreadContext调用后无效

2007-3-20 07:52
10333

非常奇怪吧.居然EIP和断点位置相差这么大,不知道是不是撞鬼了

DWORD CALLBACK Findwmwindow(LPVOID pParam)
{
        while(1)
        {
                Sleep(500);
        CWnd* pMainWnd = AfxGetMainWnd()->GetWindow(GW_HWNDFIRST);
        while (pMainWnd)
        {
                CString strClassName;
                GetClassName(pMainWnd->m_hWnd,strClassName.GetBufferSetLength(100),100);
                if(lstrcmpi(strClassName, "XXXXXX") == 0)
                {
                        BOOL alreadyint3=FALSE;
                        DWORD pid;
                        DWORD tid;
                       
                        HANDLE hThread=NULL;
                        CString processid;
                        //TerminateProcess(GetWindowThreadProcessId(pMainWnd->m_hWnd,NULL),4);
                        //return 1;
                        tid=GetWindowThreadProcessId(pMainWnd->m_hWnd,&pid);
                        HANDLE nOK =OpenProcess(PROCESS_ALL_ACCESS|PROCESS_TERMINATE|PROCESS_VM_OPERATION|PROCESS_VM_READ|
                            PROCESS_VM_WRITE,FALSE,pid);
                        //HANDLE hThread =OpenThread(THREAD_ALL_ACCESS,FALSE,tid);
                        BYTE writebyte;
                        DWORD nSize;
                        writebyte=(BYTE)0xCC;
                       
                        DebugActiveProcess(pid);
                        //processid.Format("%u",pid);
                        //MessageBox(NULL,processid,NULL,NULL);
                        CONTEXT conText;
                        DEBUG_EVENT dbg = {0};
                        BOOL        bFlags = TRUE;
                       
                        while(bFlags)
                        {   
                                WaitForDebugEvent(&dbg, INFINITE);
                                switch(dbg.dwDebugEventCode)
                                {
                                        case CREATE_PROCESS_DEBUG_EVENT:
                                        ::MessageBox(NULL, _T("游戏进程创建"), _T("测试"), MB_OK);
                                        hThread=dbg.u.CreateProcessInfo.hThread;
                                        //WriteProcessMemory(nOK,(LPVOID)0x58A236,&writebyte,1,&nSize);
                                       
                            break;
                                        //case CRATE_THREAD_EVENT:
                                               
                                                //break;
                                        case EXIT_PROCESS_DEBUG_EVENT:
                                        ::MessageBox(NULL, _T("游戏进程退出"), _T("测试"), MB_OK);
                                        bFlags = FALSE;
                                        break;
                                        case EXCEPTION_DEBUG_EVENT: //注意
                                                switch(dbg.u.Exception.ExceptionRecord.ExceptionCode)
                                                {
                                                        case EXCEPTION_BREAKPOINT:
                                                        if(alreadyint3==TRUE)
                                                        {       
                                                                //char* buffer;
                                                                char buffer2[40];
                                                                //buffer=buffer2;
                                                                conText.ContextFlags = CONTEXT_FULL;
                                                                        //CONTEXT_FULL;
                                                               
                                                                ::GetThreadContext( hThread, &conText );
                                                       
                                                                CString eax;
                                                               
                                                               
                                                                char szbuffer[30]={'\0'};
                                                                 ::wsprintf(
                                                                         szbuffer,
                                                                         "ExceptionAddress=%.8X",
                                                                         dbg.u.Exception.ExceptionRecord.ExceptionAddress);
                                                                 //弹出异常发生地址提示
                                                                 ::MessageBox(NULL,szbuffer,"BREAK――POINT",0);

                                                                 CONTEXT cn;  
                                                                 cn.ContextFlags=CONTEXT_FULL;
                                                                 ::GetThreadContext(
                                                                                                hThread,
                                                                                                &cn);
                                                                ::wsprintf(
                                                                         szbuffer,
                                                                         "IP=%.8X",
                                                                         conText.Eip);
                                                                 //提示异常发生线程的EIP
                                                                 ::MessageBox(NULL,szbuffer,"",0);
                                                                                                                          
                                                                 DWORD ADDD=(DWORD)::GetProcAddress(
                                                                                                 ::GetModuleHandle("USER32.dll"),
                                                                                                 "MessageBoxA");

                                                                eax.Format("eax %.8X",conText.Eax);
                                                                ::MessageBox(NULL,eax, _T("测试"), MB_OK);
                                                                eax.Format("ecx %.8X",conText.Ecx);
                                                                ::MessageBox(NULL,eax, _T("测试"), MB_OK);
                                                                eax.Format("edx %.8X",conText.Edx);
                                                                ::MessageBox(NULL,eax, _T("测试"), MB_OK);
                                                                eax.Format("ebx %.8X",conText.Ebx);
                                                                ::MessageBox(NULL,eax, _T("测试"), MB_OK);
                                                                ReadProcessMemory(nOK,(void   * )(conText.Eax),buffer2,30,&nSize);
                                                                ::MessageBox(NULL,buffer2, _T("测试"), MB_OK);
                                                                //ResumeThread(dbg.u.CreateProcessInfo.hThread);
                                                                ContinueDebugEvent(dbg.dwProcessId, dbg.dwThreadId, DBG_CONTINUE);
                                                        }
                                                        alreadyint3=TRUE;
                                                                break;
                                                }
                                                break;
                                       
                                        //ContinueDebugEvent(dbg.dwProcessId, dbg.dwThreadId, DBG_CONTINUE);
                                        //DebugActiveProcessStop(dbg.dwProcessId);
                                        //bFlags = FALSE;
                                        //continue;
                                }

                                ContinueDebugEvent(dbg.dwProcessId, dbg.dwThreadId, DBG_EXCEPTION_NOT_HANDLED );
                        }
                        //::CloseHandle(GetWindowThreadProcessId(pMainWnd->m_hWnd,NULL));
                        //MessageBox(NULL,strClassName,NULL,NULL);
                }
                pMainWnd = pMainWnd->GetWindow(GW_HWNDNEXT);
        }
        }
        return 1;
}

运行debugtest.exe和loader.exe
然后点loader.exe上的附加进程
再点debugtest.exe的创建线程.你就可以看到错误的发生了.

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (13)
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
ReadProcessMemory(nOK,(void   * )(conText.Edx),buffer2,30,&nSize);
                                                                ::MessageBox(NULL,buffer2, _T("测试"), MB_OK);
例子程序里loader这两句记得删掉,否则大几率蓝屏

估计是多线程的原因,有人知道多线程的程序该怎么办吗?
case CREATE_THREAD_DEBUG
和case CREATE_THREAD_DEBUG_EVENT
都是无法识别的常量.不知道那些人的文章里怎么写出来的
2007-3-20 08:33
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
3
最好把你的测试程序也发上来
眼都看花了
2007-3-20 13:10
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
最初由 llydd 发布
最好把你的测试程序也发上来
眼都看花了

测试程序好几个G呢,没办法发~~我的代码一部分就是抄的你的~~
2007-3-20 17:29
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
对了,你那个程序我运行也有些问题,EAX的值和在OD里看到的不一.其他寄存器都正常
2007-3-20 18:07
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
llydd  大哥出来呀~~需要你的帮助了
2007-3-20 20:59
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
7
??????????
2007-3-20 21:33
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
最初由 llydd 发布
??????????

帮我改下代码,谢谢了
例子程序在第一贴内
2007-3-20 21:51
0
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
9
你的hThread是主线程的hThread
2007-3-20 23:00
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
最初由 xIkUg 发布
你的hThread是主线程的hThread

恩,请问该怎么改呢
2007-3-20 23:07
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
11
最初由 xIkUg 发布
你的hThread是主线程的hThread

似乎是如此,你的
::GetThreadContext(
                        hThread,
                        &cn);中的hThread
是通过hThread=dbg.u.CreateProcessInfo.hThread;取得的,这是主线程句柄
而不是发生异常线程的句柄 不知是否说错
2007-3-20 23:42
0
雪    币: 116
活跃值: (220)
能力值: ( LV12,RANK:370 )
在线值:
发帖
回帖
粉丝
12
最初由 二毛 发布
恩,请问该怎么改呢


异常发生的时候根据线程id去取这个线程的hThread
2007-3-21 10:39
0
雪    币: 380
活跃值: (101)
能力值: ( LV13,RANK:370 )
在线值:
发帖
回帖
粉丝
13
::GetThreadContext(hThread,&cn)中的hThread
是通过hThread=dbg.u.CreateProcessInfo.hThread;取得的,这是主线程句柄
而不是发生异常线程的句柄,你可以在处理EXCEPTION_DEBUG_EVENT调试事件的时候通过dbg.dwThreadId取得发生异常的线程ID,然后通过OpenThread得到线程句柄,再以该线程句柄为参数去调用GetThreadContext
2007-3-21 13:08
0
雪    币: 143
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
最初由 llydd 发布
::GetThreadContext(hThread,&cn)中的hThread
是通过hThread=dbg.u.CreateProcessInfo.hThread;取得的,这是主线程句柄
而不是发生异常线程的句柄,你可以在处理EXCEPTION_DEBUG_EVENT调试事件的时候通过dbg.dwThreadId取得发生异常的线程ID,然后通过OpenThread得到线程句柄,再以该线程句柄为参数去调用GetThreadContext

谢谢大哥,果然是这样.太爽了。完成了
2007-3-21 13:24
0
游客
登录 | 注册 方可回帖
返回
//