欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

在异常处理函数中同步线程的问题一段代码

在异常处理函数中同步线程的问题一段代码

#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不返回,不知为何?
我做了些实验,好像那个断点位置有些特殊。具体什么原因导致出现上述情况就不明白了。
还有,要是去掉异常处理中那条等待语句,使异常线程恢复运行的话,一切工作正常。
*/

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功