1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| #include <windows.h> #include <iostream>
using namespace std;
DWORD dwBreakPoint = 0x401000;
DWORD dwNewEip = 0x401013;
int main() { cout << "请确保本注册机与程序在同一个目录下面!" << endl; cout << "按任意键继续..." << endl; STARTUPINFO si = { 0} ; si.cb = sizeof(STARTUPINFO); PROCESS_INFORMATION pi = { 0 }; CreateProcess("defiler.2.exe",NULL,NULL,NULL,FALSE,DEBUG_PROCESS | DEBUG_ONLY_THIS_PROCESS,NULL,NULL,&si,&pi); DEBUG_EVENT dbg; CONTEXT ct; HANDLE h; ct.ContextFlags = CONTEXT_FULL | CONTEXT_DEBUG_REGISTERS; while (WaitForDebugEvent(&dbg,INFINITE)) { if (dbg.dwThreadId != pi.dwThreadId) { ContinueDebugEvent(dbg.dwProcessId,dbg.dwThreadId,DBG_CONTINUE); cout << "跳过其他线程" << endl; continue; } switch (dbg.dwDebugEventCode) { case CREATE_PROCESS_DEBUG_EVENT: h = OpenThread(THREAD_ALL_ACCESS,FALSE,dbg.dwThreadId); GetThreadContext(h,&ct); ct.Dr0 = dwBreakPoint; ct.Dr7 = 0x101; SetThreadContext(h,&ct); CloseHandle(h); ContinueDebugEvent(dbg.dwProcessId,dbg.dwThreadId,DBG_CONTINUE); break; case EXCEPTION_DEBUG_EVENT: if (0x4000001e == dbg.u.Exception.ExceptionRecord.ExceptionCode) { cout << "捕捉到断点" << endl; HANDLE h = OpenThread(THREAD_ALL_ACCESS,FALSE,dbg.dwThreadId); DWORD dwPid = GetProcessId(pi.hProcess); MessageBox(NULL,"这是注入的对话框!","hello",0x40); GetThreadContext(h,&ct); ct.Rip = dwNewEip; SetThreadContext(h,&ct); CloseHandle(h); } ContinueDebugEvent(dbg.dwProcessId,dbg.dwThreadId,DBG_CONTINUE); break; case EXIT_PROCESS_DEBUG_EVENT: ContinueDebugEvent(dbg.dwProcessId,dbg.dwThreadId,DBG_CONTINUE); ExitProcess(0); break; default: ContinueDebugEvent(dbg.dwProcessId,dbg.dwThreadId,DBG_CONTINUE); break; } } return 0; }
|