如果是本进程的话,需要做成DLL吗?
如果是本进程,杀毒程序会提示吗?有没有HOOK本进程的API函数的例子可参考
也许你会奇怪我为什么要HOOK自己的进程,因为我用了别人的控件。
有些功能没些实现我想HOOK后实现。分不多。。请大家帮忙!

解决方案 »

  1.   

    补充一点:
    如果需要做成DLL,有没有其他方法可以绕过,
    因为我的程序是一个EXE,虽然我可以把DLL当资源打包到EXE中,
    但我担心杀毒程序会以为是病毒。
      

  2.   

    没弄过,不知道微软的detour能不能做到http://research.microsoft.com/sn/detours/
      

  3.   

    如果是本进程的话,需要做成DLL吗? 
    不一定要吧,但你用了别人的控件,就难说了~~一句话
    知道你原函数和目标函数的地址,然后适时的修改跳转,适时的恢复~~~~~~~
      

  4.   

    本进程不需要DLL,直接改就可以了,杀毒程序如果不是很傻的话是不会提示的。
      

  5.   

    都可以吧,不过detour杀毒程序可能会报病毒。
      

  6.   

    SetWindowsHookEx(...,GetCurrentThreadId());
      

  7.   

    全局hook使用dll的目的就是为了将dll注入目标地址空间,既然控件在进程内,所以使用进程内hook就可以了。
    hook类型使用WH_CALLWNDPROC。
      

  8.   

    http://topic.csdn.net/u/20080702/16/da212771-c766-488a-bac7-84e979bc01d7.html
      

  9.   

    本进程内根本不需要Hook的概念,找到函数地址替换就可以了。
      

  10.   

    对,SetWindowsHookEx的目的也是为了能注入目标进程,既然是自己的进程,那就不用了,找到API的地址直接操作就可以了。
      

  11.   

    有没有比较好的HOOK API例子,最好是HOOK本进程的
    顺便BS一下chunyou128 
      

  12.   

    CHookClass是我以前写的一个Hook类(使用头五字节跳转的方法),这个代码演示了怎样Hook本进程MessageBoxA。
    //---------------------------------------------------------------------------
    #include <windows.h>
    #pragma hdrstop//---------------------------------------------------------------------------class CHookClass{
        CHookClass(const CHookClass&);
        CHookClass &operator=(const CHookClass&);        //不准拷贝和赋值    #pragma pack(push,1)
        struct TJmpCode{
    char Jmp;
            DWORD Ptr;
        };
        #pragma pack(pop)
    public:
    /* LibName: DLL 文件名 */
        /* FuncName: 目标函数名 */
        /* NewFuncPtr: 用于替换的函数指针 */
    CHookClass(const char *LibName, const char *FuncName, void *NewFuncPtr)
        {
            HMODULE hModule=LoadLibrary(LibName);
            _TagFuncPtr=GetProcAddress(hModule, FuncName);
            if(_TagFuncPtr==NULL) throw(-1);        CopyMemory(&_OrgCode,_TagFuncPtr,5);       // 保存原函数前五字节        _NewCode.Jmp=0xe9;  //jmp
            _NewCode.Ptr=DWORD(NewFuncPtr)-DWORD(_TagFuncPtr)-5; // 新的五字节为 jmp NewFuncPtr        _CurProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE, GetCurrentProcessId()); // 以特权方式打开当前进程        InitializeCriticalSection(&_cs);
        }
    ~CHookClass()
        {
            Lock();
            _Closing=true;
            HookOff();  // don't HookOn again
            Unlock();
            DeleteCriticalSection(&_cs);
        } void HookOn()   // 开启 API Hook
        {
            if(!_IsHooked && !_Closing)
            {
                DWORD dwOldProtect;
                VirtualProtectEx(_CurProcess, _TagFuncPtr, 5, PAGE_READWRITE, &dwOldProtect);  // 更改内存属性
                WriteProcessMemory(_CurProcess, _TagFuncPtr, &_NewCode, 5, NULL); // 将_TagFuncPtr的前5个字节改为JMP NewFuncPtr
                VirtualProtectEx(_CurProcess, _TagFuncPtr, 5, dwOldProtect, &dwOldProtect);
                _IsHooked=true;
            }
        }
        void HookOff()  // 关闭 API Hook
        {
            if(_IsHooked)
            {
                DWORD dwOldProtect;
                VirtualProtectEx(_CurProcess, _TagFuncPtr, 5, PAGE_READWRITE, &dwOldProtect);
                WriteProcessMemory(_CurProcess, _TagFuncPtr, &_OrgCode, 5, NULL); // 恢复_TagFuncPtr的前5个字节
                VirtualProtectEx(_CurProcess, _TagFuncPtr, 5, dwOldProtect, &dwOldProtect);
                _IsHooked=false;
            }
        }    void Lock()     // 进入临界区
        {
            EnterCriticalSection(&_cs);
        }
        void Unlock()   // 退出临界区
        {
            LeaveCriticalSection(&_cs);
        }    bool IsHooked(){
         // 取Hook状态
         return _IsHooked;
        }
    private:
        TJmpCode _OrgCode;      // 原代码
        TJmpCode _NewCode;      // 新代码 jmp FuncPtr
        
        void *_TagFuncPtr;  // 目标函数指针
        HANDLE _CurProcess; // 当前进程
        bool _IsHooked;       // 显示是否被Hook了    bool _Closing;          // 正在退出,停止一切Hook活动
        CRITICAL_SECTION _cs;   // 临界区
    };//---------------------------------------------------------------CHookClass *pHookClass;int
    WINAPI
    MyMessageBoxA(
        IN HWND hWnd,
        IN LPCSTR lpText,
        IN LPCSTR lpCaption,
        IN UINT uType)
    {
        int result;
        pHookClass->Lock();
        pHookClass->HookOff();
        result = MessageBoxA(hWnd,"haha!",lpCaption,uType);
        pHookClass->HookOn();
        pHookClass->Unlock();
        return result;
    }int main(int argc, char* argv[])
    {
        pHookClass = new CHookClass("user32.dll","MessageBoxA",MyMessageBoxA);
        pHookClass->HookOn();
        MessageBoxA(NULL,"abcde","test",MB_OK);
        delete pHookClass;
        return 0;
    }
    //---------------------------------------------------------------------------
      

  13.   

    自己的进程不需要的,至于HOOK例子,网上狠多的,搜一下,
    windows核心编程中就有这种例子,如果你有时间,去看看。
      

  14.   

    Waiting4you 
    你的代码没问题,但一换过API函数就会出错,HANDLE MyCreateFileA(LPCSTR lpFileName,DWORD dwDesiredAccess,DWORD dwShareMode,LPSECURITY_ATTRIBUTES lpSecurityAttributes,
    DWORD dwCreationDisposition,DWORD dwFlagsAndAttribtes,HANDLE hTemplateFile)
    {
    return (HANDLE)(int)0xffffffff;//这里执行了,
    }
    pHookClass = new CHookClass("kernel32.dll","CreateFileA",MyCreateFileA);
    pHookClass->HookOn();
    HANDLE s =::CreateFileA("ZZ:\\aaa.txt",1,1,NULL,NULL,NULL,NULL);//在这里返回时出现运行时错误。
    delete pHookClass;
      

  15.   

    Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.  This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
      

  16.   

    HANDLE WINAPI MyCreateFileA(……
      

  17.   

    cnzdgs说得对,你要Hook的函数原型最好直接从SDK的H文件里拷。
      

  18.   

    但是我在对话框中放一个CHTMLVIEW ,显示一个网页,
    网页里面有FLASH控件,指定控件显示一个SWF文件。
    我勾了CreateFileW 和CreateFileA 都勾不到指定的那个SWF文件。
    但网页文件和其他的是有勾到了。
      

  19.   

    进程内是不需要做成DLL的找到你所需要HOOK的窗口句柄
    其中Hshare_Wnd是一个窗体的句柄
    SetWindowsHookEx(WH_GETMESSAGE,HookCallWndProc,theApp.m_hInstance,
    ::GetWindowThreadProcessId(Hshare_Wnd,NULL));
      

  20.   

    楼上的一群,把HOOK消息和HOOK API混为一谈。
      

  21.   


    我都不想说 可是还有人不断的说
    ===============================
    HOOK消息和HOOK API是完全不同的.....别再说HOOK消息相关的了
    ===============================现在我在对话框中放一个CHTMLVIEW ,显示一个网页, 
    网页里面有FLASH控件,指定控件显示一个SWF文件。 
    我勾了CreateFileW 和CreateFileA 都勾不到FLASH控件读取SWF文件。 
    但CHTMLVIEW读网页文件和其他字体文件是有勾到了。