0


PC微信hook基础框架代码编写-->获取微信日志

PC微信hook基础框架代码编写-->获取微信日志

一、 封装微信hook框架和一些基本功能

首先我们搭建好一个基础的hook框架

1. 新建一个dll工程

在这里插入图片描述

2. 新建一个CHook类 并编写对应的函数

CHook类封装两个函数
1.hook任意地址
2.获取基地址
Hook.h 代码如下

#pragmaonceclassCHook{public:CHook();//构造函数~CHook();//析构函数public:voidHookAnyAddress(DWORD dwHookAddress, LPVOID jmpAddress);//HOOK 任意地址
    DWORD GetWechatWinBase();//获取基地址};

*Hook.cpp 代码如下

#include"pch.h"#include"Hook.h"CHook::CHook(){}CHook::~CHook(){}//************************************// 函数名称: HookAnyAddress// 函数说明: Hook 任意地址// 作者名称: 张国五// 返回  值: void// 传入参数: 要hook的地址// 传入参数: 要跳转回的地址//************************************voidCHook::HookAnyAddress(DWORD dwHookAddress, LPVOID jmpAddress){//组装跳转数据
    BYTE jmpCode[5]={0};
    jmpCode[0]=0xE9;//计算偏移*(DWORD*)&jmpCode[1]=(DWORD)jmpAddress - dwHookAddress -5;//保存以前属性用于还原
    DWORD oldProperty =0;// 因为要往代码段写入数据,又因为代码段是不可写的,所以需要修改属性VirtualProtect((LPVOID)dwHookAddress,5, PAGE_EXECUTE_READWRITE,&oldProperty);//写入自己的代码memcpy((void*)dwHookAddress, jmpCode,5);// 执行完了操作之后需要进行还原VirtualProtect((LPVOID)dwHookAddress,5, oldProperty,&oldProperty);}//************************************// 函数名称: GetWechatWinBase// 函数说明: 获取基地址// 作者名称: 张国五// 返回  值: 基地址//************************************
DWORD CHook::GetWechatWinBase(){return(DWORD)GetModuleHandleA("WechatWin.dll");}

3. 新建一个CTools工具类 封装一下日志输出

CTools 封装两个函数
1.输出ascII码 窄字符 日志消息
2.输出unicode 宽字符日志消息
Tools.h代码如下

#pragmaonceclassCTools{public:CTools();//构造函数~CTools();//析构函数public:voidOutPutLogA(char* lpcszOutputString,...);//输出ascII码 窄字符 日志消息voidOutPutLogW(wchar_t* lpcwszOutputString,...);//输出unicode 宽字符日志消息};

Tools.cpp代码如下

#include"pch.h"#include"Tools.h"#include<vector>CTools::CTools(){}CTools::~CTools(){}//************************************// 函数名称: OutPutLogA// 函数说明: 输出A版本日志// 作者名称: 张国五// 返回  值: void// 传入参数: const char * lpcszOutputString// 传入参数: ...//************************************voidCTools::OutPutLogA(char* lpcszOutputString,...){if(NULL== lpcszOutputString){return;}char* strResult =nullptr;
    va_list marker =NULL;va_start(marker, lpcszOutputString);//初始化变量参数
    size_t nLength =_vscprintf(lpcszOutputString, marker)+1;//获取格式化字符串长度
    std::vector<char>vBuffer(nLength,'\0');//创建用于存储格式化字符串的字符数组int nWritten =_vsnprintf_s(&vBuffer[0], vBuffer.size(), nLength, lpcszOutputString, marker);if(nWritten <0){return;}
    strResult =&vBuffer[0];va_end(marker);//重置变量参数if(strResult ==nullptr){return;}char buff[0x1024]={0};memset(buff,0,sizeof(buff));char* strFormated =(char*)"[WechatLogs:] ";//识别符 判断是否是自己的日志strcpy_s(buff, strFormated);//拼接strcat_s(buff, strResult);OutputDebugStringA(buff);}//************************************// 函数名称: OutPutLogW// 函数说明: 输出W版本日志// 作者名称: 张国五// 返回  值: void// 传入参数: const wchar_t * lpcwszOutputString// 传入参数: ...//************************************voidCTools::OutPutLogW(wchar_t* lpcwszOutputString,...){wchar_t* strResult =nullptr;if(NULL== lpcwszOutputString){return;}
    va_list marker =NULL;va_start(marker, lpcwszOutputString);//初始化变量参数
    size_t nLength =_vscwprintf(lpcwszOutputString, marker)+1;//获取格式化字符串长度
    std::vector<wchar_t>vBuffer(nLength,'\0');//创建用于存储格式化字符串的字符数组int nWritten =_vsnwprintf_s(&vBuffer[0], vBuffer.size(), nLength, lpcwszOutputString, marker);if(nWritten <0){return;}
    strResult =&vBuffer[0];va_end(marker);//重置变量参数if(strResult ==nullptr){return;}wchar_t buff[0x2048]={0};wchar_t* strFormated =(wchar_t*)L"[WechatLogs:] ";wcscpy_s(buff, strFormated);wcscat_s(buff, strResult);OutputDebugStringW(buff);}

二、 hook微信日志

这里我们开始hook微信的日志,在编写此代码前 请先阅读我这篇文章:
https://blog.csdn.net/tuoguochen/article/details/127666928?spm=1001.2014.3001.5502

1. 新建一个CWechatLogs类 hook并输出日志

CWechatLogs
CWeChatLogs.h代码如下

#pragmaonce#include"Hook.h"#include"Tools.h"classCWeChatLogs:CHook//继承hook类{public:CWeChatLogs();//构造函数~CWeChatLogs();//析构函数public:voidHookGetWeChatLogs();//获取微信日志消息staticvoid __stdcall             WeChatLogsCore(DWORD CodePath, DWORD MMPCName, DWORD FunName, DWORD LogMessage);//输出日志消息};

CWechatLogs.cpp代码如下

#include"pch.h"#include"WeChatLogs.h"#include"OffSet.h"
CTools             m_pTools; 
DWORD              JmpLogAddr;CWeChatLogs::CWeChatLogs(){}CWeChatLogs::~CWeChatLogs(){}//************************************// 函数名称: GetLogs// 函数说明: 裸函数// 作者名称: 张国五// 返回  值: void//************************************__declspec(naked)voidGetLogs(){//内联汇编 取了重要的地方 其他需要可以自己取出
    __asm
    {
        pushad;//将所有寄存器状态压入堆栈
        mov eax,[esp +0x18+0x20];//从堆栈中拿出数据  因为8个寄存器被压入堆栈  每个寄存器 8个byte 四个字节 所以 +0x20
        push eax;
        mov ebx,[esp +0x24+0x20+0x4];//压入eax 所以 +0x4
        push ebx;
        mov ecx,[esp +0x2c+0x20+0x8];
        push ecx;
        mov edx,[esp +0x70+0x20+0xc];
        push edx;
        call CWeChatLogs::WeChatLogsCore;//调用自己的函数  恢复堆栈 取出数据
        popad;//恢复寄存器
        lea eax, dword ptr ss :[esp +0x20];//恢复代码
        push esi;//恢复代码
        jmp JmpLogAddr;//跳转回去}}//************************************// 函数名称: HookGetWeChatLogs// 函数说明: hook日志// 作者名称: 张国五// 返回  值: void//************************************voidCWeChatLogs::HookGetWeChatLogs(){//要跳转回去的地址
    JmpLogAddr =GetWechatWinBase()+ WxHookGetLog +5;//hook 挂钩子HookAnyAddress(GetWechatWinBase()+ WxHookGetLog, GetLogs);}//************************************// 函数名称: GetWeChatLogsCore// 函数说明:// 作者名称: 张国五// 返回  值: void __stdcall// 传入参数: DWORD CodePath// 传入参数: DWORD MMPCName// 传入参数: DWORD FunName// 传入参数: DWORD LogMessage//************************************void __stdcall CWeChatLogs::WeChatLogsCore(DWORD LogMessage, DWORD FunName, DWORD MMPCName, DWORD CodePath){//输出日志
    m_pTools.OutPutLogA((char*)"-------------------------------------------------------");
    m_pTools.OutPutLogA((char*)"%s\r\n",(char*)FunName);
    m_pTools.OutPutLogA((char*)"%s\r\n",(char*)MMPCName);
    m_pTools.OutPutLogA((char*)"%s",(char*)CodePath);
    m_pTools.OutPutLogA((char*)"%s\r\n",(char*)LogMessage);//logmessage自带 \n 为了日志美观 所以放到最后}

三、 调用和注入

// dllmain.cpp : 定义 DLL 应用程序的入口点。#include"pch.h"#include"WeChatLogs.h"//hook日志对象
CWeChatLogs* pWeCahtLogs  =new CWeChatLogs;//DLL启动入口//************************************// 函数名称: DllMain// 函数说明: 临时测试 简单在这里调用一下// 作者名称: 张国五// 返回  值: BOOL APIENTRY// 传入参数: HMODULE hModule// 传入参数: DWORD ul_reason_for_call// 传入参数: LPVOID lpReserved//************************************
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call, LPVOID lpReserved){switch(ul_reason_for_call){case DLL_PROCESS_ATTACH:OutputDebugStringA("开始注入");
        pWeCahtLogs->HookGetWeChatLogs();if(pWeCahtLogs !=NULL){delete pWeCahtLogs;
            pWeCahtLogs =NULL;}OutputDebugStringA("注入完成");case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;}

注入代码可以自行编写 也可以使用ollydbg注入到微信的进程

四、 整个工程结构

在这里插入图片描述

五、 测试效果图

在这里插入图片描述


本文转载自: https://blog.csdn.net/tuoguochen/article/details/127669503
版权归原作者 张国五 所有, 如有侵权,请联系我们删除。

“PC微信hook基础框架代码编写-->获取微信日志”的评论:

还没有评论