转帖
原文地址 http://blog.csdn.net/pzhccy/archive/2008/03/12/2174932.aspx
下面是封包截取的实现过程,修改一下即可实现bt功能。
1.CreateProcess或者FindWindow或者完美进程ID(dwW2iProcessId)
2.调试进程DebugActiveProcess(dwW2iProcessId)
3.进入调试循环体等待调试事件产生WaitForDebugEvent(&DebugEv, 10)
4.接收到CREATE_PROCESS_DEBUG_EVENT事件时,对全部线程设立断点。
(我可能复杂了,用CREATE_THRAD_DEBUG_EVENT事件可能简单些,刚会用就不错了呵呵,开始我只在主线程里设置了断点,死活断不下来)
下面是设置断点的方法,使用GetThreadContext和SetThreadContext函数
对于bt功能,修改寄存器的值,也通过这两个函数来实现。
HANDLE hThread = OpenThread(THREAD_ALL_ACCESS, FALSE, ThreadInfo.th32ThreadID);
SuspendThread(hThread);
CONTEXT Regs = {0};
Regs.ContextFlags = CONTEXT_DEBUG_REGISTERS;
//CONTEXT_DEBUG
::GetThreadContext(hThread, &Regs);
Regs.Dr0 = W2I_SENDCALL_ADDR1;
//中断地址
Regs.Dr7 = BREAK_DR7_FLAG;
//0x401启用dr0断点
::SetThreadContext(hThread, &Regs);
ResumeThread(hThread);
CloseHandle(hThread);
5.当在所需地址处中断时,来进行我们真正的功能操作,读取数据或者设置数据,同时设置数据改回处的断点。
ReadProcessMemory(hW2iProcess, (void*)Regs.Ecx, buf, len, &len);
6.当在数据改回处中断时,将寄存器值恢复,并设置修改处断点(其实可以一起设置好,但是要占用两个dr寄存器。dr寄存器一共4个,所以节省下只用一个,这样最多也只可以实现4个中断功能,不知道说清楚没)
7.当完美进程结束时,响应EXIT_PROCESS_DEBUG_EVENT事件,也退出。
注意每次中断时要用ContinueDebugEvent(DebugEv.dwProcessId, DebugEv.dwThreadId, dwContinueStatus)继续。