首页
论坛
课程
招聘
[求助][求助]HOOK API 卸载HOOK时 explorer崩溃
2009-3-25 15:57 6557

[求助][求助]HOOK API 卸载HOOK时 explorer崩溃

2009-3-25 15:57
6557
我按照一个示例些的DLL 示例的能完全运行,我写的DLL却是卸载HOOK时 explorer崩溃

我怎么找也没找到错误

现在我贴出DLL(我写的DLL)代码 麻烦看下(自我感觉没问题)

#include "Hook.h"
#include <windows.h>
#include "detours.h"

#pragma comment(lib, "detours.lib")
#pragma comment(lib, "detoured.lib")

#pragma data_seg("MyShared")
HHOOK        g_hHook                        = NULL;
#pragma data_seg()

HMODULE        g_hInst                        = NULL;
bool        g_bIntercepted        = false;

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved );
LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam );
void Intercept();
void UnIntercept();
void InstallHook();

static BOOL (WINAPI *Real_CreateProcessW)(
        LPCWSTR lpApplicationName,
        LPWSTR lpCommandLine,
        LPSECURITY_ATTRIBUTES lpProcessAttributes,
        LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles,
        DWORD dwCreationFlags,
        LPVOID lpEnvironment,
        LPCWSTR lpCurrentDirectory,
        LPSTARTUPINFOW lpStartupInfo,
        LPPROCESS_INFORMATION lpProcessInformation
)=CreateProcessW;

static BOOL (WINAPI *Real_CreateProcessA)(
  LPCTSTR lpApplicationName,
  LPTSTR lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL bInheritHandles,
  DWORD dwCreationFlags,
  LPVOID lpEnvironment,
  LPCTSTR lpCurrentDirectory,
  LPSTARTUPINFO lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
)=CreateProcessA;

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
        g_hInst = hinstDLL;

        switch(fdwReason)
        {
        case DLL_PROCESS_ATTACH:
                break;
        case DLL_THREAD_ATTACH:
                break;
        case DLL_THREAD_DETACH:
                break;
        case DLL_PROCESS_DETACH:
                UnIntercept();
                break;
        }

        return TRUE;
}

LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam )
{
        if(!g_bIntercepted)
                Intercept();

        return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
//输出函数 安装
void InstallHook()
{
        if(g_hHook == NULL)
                g_hHook = ::SetWindowsHookEx( WH_SHELL , ShellProc ,(HINSTANCE)g_hInst, 0);
}
//输出函数 卸载
void UninstallHook()
{
        if(::UnhookWindowsHookEx( g_hHook ))
                g_hHook = NULL;
}

BOOL WINAPI Replace_CreateProcessW(
        LPCWSTR lpApplicationName,
        LPWSTR lpCommandLine,
        LPSECURITY_ATTRIBUTES lpProcessAttributes,
        LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles,
        DWORD dwCreationFlags,
        LPVOID lpEnvironment,
        LPCWSTR lpCurrentDirectory,
        LPSTARTUPINFOW lpStartupInfo,
        LPPROCESS_INFORMATION lpProcessInformation
)
{
        BOOL res = 0;
        __try
        {       
                ::MessageBoxW( NULL, lpApplicationName, L"拦截成功!", MB_OK );
                res = Real_CreateProcessW(        lpApplicationName,
                                                                        lpCommandLine,
                                                                        lpProcessAttributes,
                                                                        lpThreadAttributes,
                                                                        bInheritHandles,
                                                                        dwCreationFlags,
                                                                        lpEnvironment,
                                                                        lpCurrentDirectory,
                                                                        lpStartupInfo,
                                                                        lpProcessInformation);
        }
        __finally
        {
        };
        return res;
}

BOOL Replace_CreateProcessA(
  LPCTSTR lpApplicationName,
  LPTSTR lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL bInheritHandles,
  DWORD dwCreationFlags,
  LPVOID lpEnvironment,
  LPCTSTR lpCurrentDirectory,
  LPSTARTUPINFO lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
)
{
        BOOL res = 0;
        __try
        {       
                ::MessageBoxA( NULL, lpApplicationName, "拦截成功!", MB_OK );
                res = Real_CreateProcessA(        lpApplicationName,
                                                                        lpCommandLine,
                                                                        lpProcessAttributes,
                                                                        lpThreadAttributes,
                                                                        bInheritHandles,
                                                                        dwCreationFlags,
                                                                        lpEnvironment,
                                                                        lpCurrentDirectory,
                                                                        lpStartupInfo,
                                                                        lpProcessInformation);
        }
        __finally
        {
        };
        return res;
}
//doutour目标
void Intercept()
{
                DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
        DetourAttach(&(PVOID&)Real_CreateProcessW, Replace_CreateProcessW);
        DetourTransactionCommit();
}
//取消doutour
void UnIntercept()
{
                DetourTransactionBegin();
        DetourUpdateThread(GetCurrentThread());
         DetourDetach(&(PVOID&)Real_CreateProcessW, Replace_CreateProcessW);
        DetourTransactionCommit();
}

下面给出源码 帮看看    很简单   但是我就是找不到错误
到网上看了下有人也是这样的问题,但没给出解答,忧闷

第一次发帖不知道发对地方没

第五届安全开发者峰会(SDC 2021)10月23日上海召开!

收藏
点赞0
打赏
分享
最新回复 (6)
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
红黑魔导 活跃值 2009-3-25 16:02
2
0
这个是我参考的源码能运行
/*
        本例中拦截以下两个位于Kernel32.dll中的API

        BOOL WINAPI CreateProcessW( // UNICODE 版本
                LPCWSTR lpApplicationName,
                LPWSTR lpCommandLine,
                LPSECURITY_ATTRIBUTES lpProcessAttributes,
                LPSECURITY_ATTRIBUTES lpThreadAttributes,
                BOOL bInheritHandles,
                DWORD dwCreationFlags,
                LPVOID lpEnvironment,
                LPCWSTR lpCurrentDirectory,
                LPSTARTUPINFOW lpStartupInfo,
                LPPROCESS_INFORMATION lpProcessInformation
        );

        BOOL CreateProcessA( // ANSI 版本
          LPCTSTR lpApplicationName,
          LPTSTR lpCommandLine,
          LPSECURITY_ATTRIBUTES lpProcessAttributes,
          LPSECURITY_ATTRIBUTES lpThreadAttributes,
          BOOL bInheritHandles,
          DWORD dwCreationFlags,
          LPVOID lpEnvironment,
          LPCTSTR lpCurrentDirectory,
          LPSTARTUPINFO lpStartupInfo,
          LPPROCESS_INFORMATION lpProcessInformation
        );
*/

#include "Hook.h"
#include <windows.h>
#include "detours.h"
#pragma comment(lib, "detours.lib")

HHOOK        g_hHook                        = NULL;
HMODULE        g_hInst                        = NULL;
bool        g_bIntercepted        = false;

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved );
LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam );
void Intercept();
void UnIntercept();
BOOL WINAPI Replace_CreateProcessW(
        LPCWSTR lpApplicationName,
        LPWSTR lpCommandLine,
        LPSECURITY_ATTRIBUTES lpProcessAttributes,
        LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles,
        DWORD dwCreationFlags,
        LPVOID lpEnvironment,
        LPCWSTR lpCurrentDirectory,
        LPSTARTUPINFOW lpStartupInfo,
        LPPROCESS_INFORMATION lpProcessInformation
);

BOOL Replace_CreateProcessA(
  LPCTSTR lpApplicationName,
  LPTSTR lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL bInheritHandles,
  DWORD dwCreationFlags,
  LPVOID lpEnvironment,
  LPCTSTR lpCurrentDirectory,
  LPSTARTUPINFO lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
);

// ---------------------------------------------------------------------------

DETOUR_TRAMPOLINE( BOOL WINAPI Real_CreateProcessA(        LPCTSTR lpApplicationName,
                                                                                                        LPTSTR lpCommandLine,
                                                                                                        LPSECURITY_ATTRIBUTES lpProcessAttributes,
                                                                                                        LPSECURITY_ATTRIBUTES lpThreadAttributes,
                                                                                                        BOOL bInheritHandles,
                                                                                                        DWORD dwCreationFlags,
                                                                                                        LPVOID lpEnvironment,
                                                                                                        LPCTSTR lpCurrentDirectory,
                                                                                                        LPSTARTUPINFO lpStartupInfo,
                                                                                                        LPPROCESS_INFORMATION lpProcessInformation),
                                                                                                        CreateProcessA);

DETOUR_TRAMPOLINE( BOOL WINAPI Real_CreateProcessW( LPCWSTR lpApplicationName,
                                                                                                        LPWSTR lpCommandLine,
                                                                                                        LPSECURITY_ATTRIBUTES lpProcessAttributes,
                                                                                                        LPSECURITY_ATTRIBUTES lpThreadAttributes,
                                                                                                        BOOL bInheritHandles,
                                                                                                        DWORD dwCreationFlags,
                                                                                                        LPVOID lpEnvironment,
                                                                                                        LPCWSTR lpCurrentDirectory,
                                                                                                        LPSTARTUPINFOW lpStartupInfo,
                                                                                                        LPPROCESS_INFORMATION lpProcessInformation),
                                                                                                        CreateProcessW);

// ---------------------------------------------------------------------------

BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved )
{
        g_hInst = hinstDLL;

        switch(fdwReason)
        {
        case DLL_PROCESS_ATTACH:
                break;
        case DLL_THREAD_ATTACH:
                break;
        case DLL_THREAD_DETACH:
                break;
        case DLL_PROCESS_DETACH:
                UnIntercept();
                break;
        }

        return TRUE;
}

LRESULT CALLBACK ShellProc( int nCode, WPARAM wParam, LPARAM lParam )
{
        if(!g_bIntercepted)
                Intercept();

        return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}

void InstallHook()
{
        if(g_hHook == NULL)
                g_hHook = ::SetWindowsHookEx( WH_SHELL , ShellProc ,(HINSTANCE)g_hInst, 0);
}

void UninstallHook()
{
        if(::UnhookWindowsHookEx( g_hHook ))
                g_hHook = NULL;
}

BOOL WINAPI Replace_CreateProcessW(
        LPCWSTR lpApplicationName,
        LPWSTR lpCommandLine,
        LPSECURITY_ATTRIBUTES lpProcessAttributes,
        LPSECURITY_ATTRIBUTES lpThreadAttributes,
        BOOL bInheritHandles,
        DWORD dwCreationFlags,
        LPVOID lpEnvironment,
        LPCWSTR lpCurrentDirectory,
        LPSTARTUPINFOW lpStartupInfo,
        LPPROCESS_INFORMATION lpProcessInformation
)
{
        BOOL res = 0;
        __try
        {       
                MessageBoxW( NULL, lpApplicationName, L"拦截成功!", MB_OK );
                res = Real_CreateProcessW(        lpApplicationName,
                                                                        lpCommandLine,
                                                                        lpProcessAttributes,
                                                                        lpThreadAttributes,
                                                                        bInheritHandles,
                                                                        dwCreationFlags,
                                                                        lpEnvironment,
                                                                        lpCurrentDirectory,
                                                                        lpStartupInfo,
                                                                        lpProcessInformation);
        }
        __finally
        {
        };
        return res;
}

BOOL Replace_CreateProcessA(
  LPCTSTR lpApplicationName,
  LPTSTR lpCommandLine,
  LPSECURITY_ATTRIBUTES lpProcessAttributes,
  LPSECURITY_ATTRIBUTES lpThreadAttributes,
  BOOL bInheritHandles,
  DWORD dwCreationFlags,
  LPVOID lpEnvironment,
  LPCTSTR lpCurrentDirectory,
  LPSTARTUPINFO lpStartupInfo,
  LPPROCESS_INFORMATION lpProcessInformation
)
{
        BOOL res = 0;
        __try
        {       
                MessageBoxA( NULL, lpApplicationName, "拦截成功!", MB_OK );
                res = Real_CreateProcessA(        lpApplicationName,
                                                                        lpCommandLine,
                                                                        lpProcessAttributes,
                                                                        lpThreadAttributes,
                                                                        bInheritHandles,
                                                                        dwCreationFlags,
                                                                        lpEnvironment,
                                                                        lpCurrentDirectory,
                                                                        lpStartupInfo,
                                                                        lpProcessInformation);
        }
        __finally
        {
        };
        return res;
}

void Intercept()
{
        DetourFunctionWithTrampoline((PBYTE)Real_CreateProcessW, (PBYTE)Replace_CreateProcessW);
        DetourFunctionWithTrampoline((PBYTE)Real_CreateProcessA, (PBYTE)Replace_CreateProcessA);
}

void UnIntercept()
{
        DetourRemove( (PBYTE)Real_CreateProcessW,(PBYTE)Replace_CreateProcessW);
        DetourRemove( (PBYTE)Real_CreateProcessA,(PBYTE)Replace_CreateProcessA);
}
雪    币: 109
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zhoro 活跃值 2009-3-26 15:27
3
0
windows是多线程的。当你的线程在改写内存的时候,有可能改写到一半的时候就被挂起了。然后新的线程运行,刚好执行到这个函数。。就出错了。代码逻辑再正确也无法避免。。。。
雪    币: 201
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
红黑魔导 活跃值 2009-3-27 19:45
4
0
楼上说的也对,不过应该怎么改。能说下基本的思想嘛

要是我对一个新建的进程,先挂起进程,再修改导入表。就不会出现我全局HOOK的所出现的问题了吧
雪    币: 42
活跃值: 活跃值 (17)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
nevergone 活跃值 3 2009-3-27 21:49
5
0
可以考虑使用shellhook实现
雪    币: 202
活跃值: 活跃值 (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
flipcode 活跃值 2009-6-22 18:29
6
0
楼主你用的是detours1.5版本吧,这个版本有bug,在多次inline hook后再卸载就会出现你所说的情况
改用版本吧
雪    币: 117
活跃值: 活跃值 (21)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xzchina 活跃值 1 2009-6-22 18:44
7
0
ye zhu de li liang
游客
登录 | 注册 方可回帖
返回