C++ Firefox pr_写钩子。dll注入,windows钩子
问题在于,包含PR_Write()的DLL不是npsr4.DLL,而是nss3.DLL和挂钩无法从不存在的库中找到GetProcAddress()。 我正在尝试创建Firefox钩子,它从PR_Write()Firefox方法(位于nspr4.dll中)收集数据。 我在谷歌上搜索了很多,尝试了很多方法,但不幸的是,当我注入钩子时,Firefox崩溃了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
- 首先,我尝试不使用DLL,使用此方法(本文开头的源代码)Firefox在CreateRemoteProcess()上崩溃*
- 我听说CreateRemoteProcess()在Win7上无法工作,因为存在安全问题。我决定使用这种方法:但它甚至没有加载我的DLL。(来源于文章开头)
- 然后我决定将SetWindowsHookEx()注入DLL。DLL工作,我使用TestMessageBox来检查(但我不确定是否正确指定了SetWindowsHookEx()的最后一个参数)
- 我在Firefox示例中找到了Chrom库(我不能发布超过2个链接,但谷歌:“Chrom库”)。我将代码应用于我的DLL,但是当我注入它时,Firefox崩溃了
#定义尺寸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;
}