C++ Firefox pr_写钩子。dll注入,windows钩子

C++ Firefox pr_写钩子。dll注入,windows钩子,c++,firefox,hook,dll-injection,C++,Firefox,Hook,Dll Injection,问题在于,包含PR_Write()的DLL不是npsr4.DLL,而是nss3.DLL和挂钩无法从不存在的库中找到GetProcAddress()。 我正在尝试创建Firefox钩子,它从PR_Write()Firefox方法(位于nspr4.dll中)收集数据。 我在谷歌上搜索了很多,尝试了很多方法,但不幸的是,当我注入钩子时,Firefox崩溃了 首先,我尝试不使用DLL,使用此方法(本文开头的源代码)Firefox在CreateRemoteProcess()上崩溃* 我听说CreateR

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

我正在尝试创建Firefox钩子,它从PR_Write()Firefox方法(位于nspr4.dll中)收集数据。 我在谷歌上搜索了很多,尝试了很多方法,但不幸的是,当我注入钩子时,Firefox崩溃了

  • 首先,我尝试不使用DLL,使用此方法(本文开头的源代码)Firefox在CreateRemoteProcess()上崩溃*

  • 我听说CreateRemoteProcess()在Win7上无法工作,因为存在安全问题。我决定使用这种方法:但它甚至没有加载我的DLL。(来源于文章开头)

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

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

我不太了解ASM、堆栈和内存管理,我不知道哪里出了问题以及如何修复它。我只知道我应该用asm跳钩,但怎么用?。我需要一个随时可用的代码:/

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

我该怎么办

编辑我注意到我的计算机上没有npsr4.dll。那么Firefox如何在没有这个库的情况下构建HTTP请求呢

当前DLL代码(使用VirtualProtect()时基于色度)

#定义尺寸6
结构钩{
DWORD原函数;
DWORD函数;
字节原始_字节[大小];
字节JMP_指令[大小];
DWORD原保护、新保护;
胡克(){
原始保护=页面执行读写;
新建保护=页面执行读写;
}
~Hook(){
memcpy((void*)原始_函数,原始_字节,大小);
}
int初始化(char*函数、char*模块名称、void*目标函数ptr)
{
原始函数=(DWORD)GetProcAddress(GetModuleHandle(模块名称),
功能);
目的地函数=(DWORD)目的地函数;
if(原始函数==NULL){
返回FALSE;}
返回TRUE;
}
int Start()
{
字节JMP_temporary[SIZE]={0xE9,0x90,0x90,0x90,0xC3};
memcpy(JMP_指令、JMP_临时、大小);
DWORD JMP_大小=((DWORD)目标_函数-(DWORD)原始_函数-5);
VirtualProtect((LPVOID)原始功能、大小、页面执行、读写和原始保护);
消息框(空,“工作”,为“:D”,0);
memcpy(原始字节,(void*)原始函数,大小);
memcpy(&JMP_指令[1],&JMP_大小,4);
memcpy((void*)原始_函数、JMP_指令、大小);
VirtualProtect((LPVOID)原始\u功能、大小、原始\u保护、空);
返回TRUE;
}
int重置(){
VirtualProtect((LPVOID)原始_功能、大小、新_保护、空);
memcpy((void*)原始_函数,原始_字节,大小);
返回TRUE;
}
int Place_Hook(){
memcpy((void*)原始_函数、JMP_指令、大小);
VirtualProtect((LPVOID)原始\u功能、大小、原始\u保护、空);
返回TRUE;
}
};
//...
Hook Firefox;//使用色度库
DWORD PRU Write(DWORD*fd,void*buf,DWORD金额);//这是我们的超链接功能
类型定义DWORD(*prWrite)(DWORD*,void*,DWORD);//原始函数的定义
prWrite prw=NULL;//创建一个原始函数,我们稍后将其指向原始函数
//地址
//示例测试函数
int write_log(字符*日志,字符*数据)
{

ofstream fout(“D:\\log2.txt”,ios::app);fout以下是注入dll时使用的基本步骤:

1) 您使用
OpenProcess
来获取Firefox的进程
HANDLE

2) 您可以使用
VirtualAllocEx
在Firefox的进程中为dll的路径分配内存

3) 您可以使用
WriteProcessMemory

4) 您可以使用
GetModuleHandleA
获得dll kernel32.dll的
句柄。此句柄应该出现在每个windows进程中。kernel32.dll包含windows的核心API内容

5) 在这个kernel32.dll中,您将找到有助于加载dll的函数
LoadLibrary
。使用
GetProcAddress
获取其地址

6) 现在,您拥有了创建新远程线程的所有密钥,该线程将把dll加载到Firefox进程中。 只需调用
CreateRemoteThreadEx
,其中
lpStartAddress
指向
LoadLibrary
的地址,并
lpParameter
指向dll路径字符串

7) 享受你的生活

现在dll已在进程内存中,您可以开始挂接。以下是两种基本方法:

-在导入地址表(IAT)上: 导入地址表是包含模块/进程使用的每个外部函数的地址的表。 在您的情况下,您希望通过手动创建函数的地址更改
PR\u Write
的地址。您必须使用
VirtualProtect
删除IAT的内存页保护。现在您可以自己自由覆盖地址

-覆盖部分流程代码,使其在函数中跳转: 使用
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;
}