-
-
[求助]可以强制让其他线程抛出异常吗?
-
发表于: 2010-10-15 14:37 3460
-
已知欲出异常的线程的HANDLE,如果该线程不在ring0里面,可以先SuspendThread这个线程,然后GetThreadContext改变Eip到抛异常的代码入口,再SetThreadContext回去,这样就可以让它抛异常了。但是如果当时该线程在ring0里面(比如在Sleep),这样就行不通了,他会在出了ring0以后才到指定的Eip执行代码。
那么有没有方法强制它直接抛出异常的?
奉上测试代码:
那么有没有方法强制它直接抛出异常的?
奉上测试代码:
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <process.h> unsigned __stdcall ThreadFunc(void* lpParam) { try { #if 0 Sleep(3000); #else DWORD dwTick = GetTickCount(); while (GetTickCount() - dwTick < 3000) Sleep(1); #endif } catch(...) { printf("catch!\r\n"); } return 0; } int main(int, char**) { unsigned tid = 0; HANDLE hl = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc, NULL, 0, &tid); if (hl != NULL) { system("PAUSE"); if (SuspendThread(hl) != (DWORD)-1) { CONTEXT ct = {0}; ct.ContextFlags = CONTEXT_CONTROL; if (GetThreadContext(hl, &ct)) { __asm { mov eax, label0 mov ct.Eip, eax jmp label1 label0: int 1 label1: } SetThreadContext(hl, &ct); } ResumeThread(hl); } WaitForSingleObject(hl, INFINITE); CloseHandle(hl); } system("PAUSE"); return 0; }
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法
赞赏
他的文章
- [求助]为什么这个无壳的DLL看起来这么像有壳的? 9430
- [讨论]用默认浏览器在新窗口或新标签中打开URL链接的方法 9673
- [求助]如何获取父窗口而不是拥有者窗口? 6053
- [求助]关于硬盘分区表的磁头数的问题 7832
看原图
赞赏
雪币:
留言: