1、窗口句柄相关:
1.1 直接向窗口发消息,除了发送WM_CLOSE,还可以发送WM_KEYDOWN,WM_MOUSEMOVE,WM_LBUTTON*,另外还可使用PostMessage等等消息函数:
(方法1) FindWindow("CrackMeApp") -> SendMessage(WM_CLOSE)
1.2 利用模拟键盘输入,首先需要用SetForegroundWindow让这个窗口的线程与RIT进行连接,使用keybd_event输入ESC键。此方法是直接向RIT发送数据,不同于直接向窗口发消息:
(方法2) FindWindow -> SetForegroundWindow -> keybd_event(VK_ESCAPE)
1.3 利用模拟鼠标输入,首先也需要用让这个窗口的线程与RIT进行连接,然后获取屏幕分辨率和窗口的区域坐标,然后计算出窗口关闭按钮的位置,使用mouse_event移动鼠标和进行点击:
(方法3) FindWindow -> SetForegroundWindow -> GetSystemMetrics -> GetWindowRect -> mouse_event(MOUSEEVENTF_MOVE) -> mouse_event(MOUSEEVENTF_LEFTDOWN) -> mouse_event(MOUSEEVENTF_LEFTUP)
具体实现的时候,使用了一个循环点击右上角的斜10个点,保证点击到关闭按钮的位置。
2、线程句柄相关:
2.1 通过窗口句柄找到线程ID,然后获取线程句柄,直接调用TerminateThread。
(方法4) FindWindow -> GetWindowThreadProcessId -> OpenThread -> TerminateThread
2.2 通过窗口句柄找到线程ID,然后获取线程句柄,通过修改线程的上下文来让线程执行ExitProcess,因为大部分情况下窗口的线程是在休眠状态,因此最后调用SwitchToThisWindow来唤醒这个窗口线程。
(方法5) FindWindow -> GetWindowThreadProcessId -> OpenThread -> SuspendThread -> GetThreadContext(ctx) -> ctx.Eip=ExitProcess -> SetThreadContext(ctx) -> ResumeThread -> SwitchToThisWindow
3. Windows Hook:
3.1 通过SetWindowsHookEx(WH_CALLWNDPRO)插入一个DLL,并用DLL中的CallWndProc替换原来的。只要在DLL中的CallWndProc放入ExitProcess调用即可:
(方法6) FindWindow -> SetWindowsHookEx(WH_CALLWNDPRO) -> SetWindowLong(GWL_WNDPROC) -> MyWndProc -> ExitProcess
4. 进程句柄相关
首先要开启自身进程的SeDebugPrivilege,从而可以找到csrss.exe进程句柄,并注入DLL,然后从csrss.exe进程中获取CrackMeApp.exe的进程句柄,此句柄具有PROCESS_ALL_ACCESS:
SetSeDebugPrivilege -> EnumProcesses -> EnumProcessModules -> GetModuleBaseName -> GotCSRSS -> InjectDll -> ZwQuerySystemInformation(SystemHandleInformation) -> EnumProcessModules -> GetModuleBaseName -> GotCrackMeApp
SetSeDebugPrivilege通过OpenProcessToken和AdjustTokenPrivileges实现。
InjectDll通过VirtualAllocEx、WriteProcessMemory和CreateRemoteThread实现。
4.1 当通过上面方法获取到进程句柄后,可以直接使用TerminateProcess:
(方法7) TerminateProcess
4.2 当通过上面方法获取到进程句柄后,可以通过CreateRemoteThread执行ExitProcess:
(方法8) CreateRemoteThread(ExitProcess)
4.3 当通过上面方法获取到进程句柄后,可以通过WriteProcessMemory修改进程数据:
(方法9) WriteProcessMemory(0x4025FC) -> FindWindow -> SwitchToThisWindow
修改0x4025FC的数据为exit的IAT地址0x40321C。如同上面改线程上下文,线程在休眠状态,需要唤醒窗口线程来执行修改后的代码。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)