写挂钩。 DLL注入,窗钩

问题是包含PR_Write()的DLL被称为不是npsr4.dll,但是nss3.dll和挂钩无法从不存在的库中找到GetProcAddress()。

我试图创建Firefox钩子,它从PR_Write()Firefox方法(它位于nspr4.dll)中收集数据。 我搜索了很多,并尝试了很多方法来做到这一点,但不幸的是,当我注入钩子时,Firefox崩溃了。

  • 首先,我试图不使用DLL,使用这种方法http://redkiing.wordpress.com/2012/04/30/firefox-formgrabber-iii-code-injection/(文章开头的源代码)Firefox坠毁在CreateRemoteProcess()*

  • 由于安全问题,我读了CreateRemoteProcess()在Win7上不起作用。 我决定使用这个方法:http://syprog.blogspot.com/2012/05/createremotethread-bypass-windows.html但它甚至没有加载我的DLL。 (来源于文章的开头)

  • 然后我决定用SetWindowsHookEx()注入DLL。 DLL工作,我用测试MessageBox来检查(但我不知道是否我正确指定了SetWindowsHookEx()的最后一个参数)。

  • 我已经找到与Firefox例子的Chrom库(我不能发布超过2个链接,但谷歌:“chrom-lib”)。 我将代码应用于我的DLL,但是当我注入它时,Firefox崩溃。

  • 我不太了解ASM,堆栈和内存管理,我不知道什么是错的,以及如何解决它。 我只知道我应该使用asm跳钩,但是如何? 我需要一个现成的代码:/

    也许有一种方法可以获得pr_write()地址,然后获取其调用堆栈(函数参数)并使用它们调用我自己的函数? 或者,也许我应该尝试“与MS Detours API挂钩”(我再也不能发布链接:<)

    我该怎么办?

    编辑我说我的电脑上没有npsr4.dll。 那么Firefox如何在没有这个库的情况下建立HTTP请求呢?

    当前DLL代码(基于Chrom的VirtualProtect()使用)

    #define SIZE 6
    
    struct Hook{
    
        DWORD original_function;
        DWORD destination_function;
    
        BYTE original_bytes[SIZE];
        BYTE JMP_instruction[SIZE];
        DWORD original_protection, new_protection;
    
        Hook(){
    
        original_protection= PAGE_EXECUTE_READWRITE; 
        new_protection = PAGE_EXECUTE_READWRITE;
    
        }
    
        ~Hook(){
    
        memcpy((void*) original_function, original_bytes, SIZE);
    
        }
    
        int Initialize(char * function, char * module_name, void * destination_function_ptr)
        {
            original_function = (DWORD)GetProcAddress(GetModuleHandle(module_name), 
                                 function);
    
            destination_function = (DWORD) destination_function_ptr;
    
            if (original_function==NULL){
                return FALSE;}
    
            return TRUE;
        }
    
        int Start()
        {
            BYTE JMP_temporary[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3};
    
            memcpy(JMP_instruction, JMP_temporary, SIZE);
    
            DWORD JMP_size = ((DWORD)destination_function - (DWORD)original_function - 5);
    
            VirtualProtect((LPVOID)original_function, SIZE, PAGE_EXECUTE_READWRITE, &original_protection);
    
            MessageBox(NULL,"Works", ":D",0);
    
            memcpy(original_bytes,(void*)original_function, SIZE);
    
            memcpy(&JMP_instruction[1], &JMP_size, 4);
    
            memcpy((void*)original_function, JMP_instruction, SIZE);
    
            VirtualProtect((LPVOID)original_function, SIZE, original_protection, NULL);
    
            return TRUE;
        }
    
        int Reset(){
    
            VirtualProtect((LPVOID)original_function, SIZE, new_protection, NULL);
    
            memcpy((void*)original_function, original_bytes, SIZE);
    
            return TRUE;
        }
    
        int Place_Hook(){
    
            memcpy((void*)original_function, JMP_instruction, SIZE);
    
            VirtualProtect((LPVOID)original_function, SIZE, original_protection, NULL);
    
            return TRUE;
        }
    
    };
    
    //...
    
    Hook Firefox; // use chrom library
    
    DWORD PR_Write_H (DWORD *fd,  void *buf,DWORD amount); // this is our overiding-function
    typedef DWORD (*prWrite)(DWORD*,void*,DWORD); // defination of our original function
    
    prWrite prw = NULL; // create a orginal function, we later point this to orginal function
                        // address
    
    // example test function
    int write_log(char * log, char * data)
    {
        ofstream fout("D:log2.txt", ios::app);fout << data;fout.close();
        return TRUE;
    }
    
    void create_hooks() //this is called when DLL is initialized
    {
        // Override PR_Write function in nspr4.dll with our PR_Write_H, 
        // Note nspr4.dll must already be
        // loaded in process space
        Firefox.Initialize("PR_Write", "nspr4.dll", PR_Write_H);
    
        // Write jump instruction on orginal function address
        Firefox.Start();
    }
    
    // our overriding function
    DWORD PR_Write_H (DWORD *fd,  void *buf,DWORD amount){
        // reset hooks, this will replace the jump instruction to original data
        Firefox.Reset();
        // point prw(function) to original function
        prw = (prWrite)Firefox.original_function;
        // log the headers
        write_log(log_file, (char*) buf);
        // call the real PR_Write function
        DWORD ret = prw(fd, buf, amount);
        // again place the jump instruction on the original function
        Firefox.Place_Hook();
        return ret;
    }
    

    *我使用Win8 x64,但必须在Vista / Win7 / Win8 32和64位下工作! 我还在Win7 x86笔记本电脑上测试过它。 我使用Visual Studio 2012进行编译


    以下是我在注入dll时使用的基本步骤:

    1)你使用OpenProcess来获取firefox的进程HANDLE

    2)你使用VirtualAllocEx为你的dll的路径分配内存到firefox的进程中

    3)使用WriteProcessMemory将dll路径写入此分配的空间

    4)你使用GetModuleHandleA获得dll kernel32.dll的HANDLE 。 这个应该存在于每个窗口的过程中。 kernel32.dll包含窗口的核心API内容。

    5)在这个kernel32.dll中,你会发现LoadLibrary函数,它可以帮助你加载你的dll。 使用GetProcAddress获取地址。

    6)现在你有所有的钥匙来创建一个新的远程线程,将您的DLL加载到Firefox的过程。 你可以用lpStartAddress调用CreateRemoteThreadEx指向LoadLibrarylpParameter的地址到你的dll路径字符串。

    7)享受你注入的DLL。

    现在,你的DLL在进程内存中,你可以开始钩。 这里有两个基本的方法:

    - 在导入地址表(IAT)中:导入地址表是包含模块/进程使用的每个外部函数的地址的表。 在你的情况下,你想通过你手动创建的函数的地址来改变PR_Write的地址。 您必须使用VirtualProtect删除IAT的内存页面保护。 现在,您可以自由覆盖自己的地址。

    - 覆盖流程代码的一部分,以使其在您的功能中跳跃:使用VirtualProtect ,您曾经反对删除您需要的代码部分的保护。 然后,通过CALLJUMP poiting的操作码将当前指令更改为您的函数。 必须在功能开始时重写指令,以保持实际流量不变。 在您的挂钩功能之后,您必须在重写指令后跳回。

    所有这些钩子技巧都可能需要一个称为蹦床的中间函数。 这个函数可能需要保存寄存器并稍后加载它们。 它也可以确保呼叫约定得到遵守。

    在处理钩子时,我会建议学习组装以及如何使用像OllyDbg这样的调试工具。

    链接地址: http://www.djcxy.com/p/60313.html

    上一篇: write hook. dll injection, windows hooks

    下一篇: DLL Injection, threads and memory releasing