#include<stdio.h>
#define _WIN32_WINNT 0x0500
#include<windows.h>
#include<tchar.h>
#include<Tlhelp32.h>
HANDLE hevent,hevent2;
/*
ZwMapViewOfSection
76E44ED0 Z> B8 A8000000 MOV EAX,0A8
76E44ED5 BA 0003FE7F MOV EDX,7FFE0300
76E44EDA FF12 CALL DWORD PTR DS:[EDX]
76E44EDC C2 2800 RETN 28
*/
//注意---硬编码!
PVOID addr = 0x76E44EDC;//ZwMapViewOfSection 中retn 28的地址
DWORD myThread( PVOID context )
{
while( 1 ){
WaitForSingleObjectEx( hevent,INFINITE,TRUE );
printf("ok\n");
MessageBox(NULL,_T("thread exit!"),_T("text"),MB_OK );
}
}
int main()
{
HMODULE hMod;
HANDLE hThread;
DWORD oldpt;
hevent = CreateEvent( NULL,FALSE,FALSE,NULL );
hevent2 = CreateEvent( NULL,FALSE,FALSE,NULL );
hThread = CreateThread( NULL,0,(LPTHREAD_START_ROUTINE)myThread,0,0,NULL);
MessageBox( NULL,_T("1"),_T("OK"),MB_OK );
//在ZwMapViewOfSection的retn 28地址处写入int 3断点
VirtualProtect( addr,1,PAGE_EXECUTE_READWRITE,&oldpt );
*(PBYTE)addr = 0xcc;
getch();
__try{
LoadLibrary(_T("123.dll")); //触发断点异常,任意加载一个dll即可
}
__except(
*(PBYTE)addr = 0xc2, //恢复原始代码
SetEvent( hevent ), //设置myThread中等待的事件
WaitForSingleObject( hevent2,INFINITE),//使当前线程处于等待状态
EXCEPTION_CONTINUE_EXECUTION ){;}
getch();
return 0;
}
/*
myThread中的WaitForSingleObject不返回,不知为何?
我做了些实验,好像那个断点位置有些特殊。具体什么原因导致出现上述情况就不明白了。
还有,要是去掉异常处理中那条等待语句,使异常线程恢复运行的话,一切工作正常。
*/
- 标 题:在异常处理函数中同步线程的问题一段代码
- 作 者:hackerlzc
- 时 间:2011-09-01 20:06:09
- 链 接:http://bbs.pediy.com/showthread.php?t=139634