PC微信逆向:分析通用设置数组 之 禁用自动更新和热键冲突提示
本文基于 鬼手的 PC微信逆向:分析通用设置数组 原文地址
因为原文中只寻找了设置数组,缺少禁用的代码,研究了一下.代码如下:
(转载请注明出处)
偏移地址适用于 微信版本 2.9.0.123
//HOOK地址偏移
#define WxDisableConfigHookAddr 0x49AD59
//微信启动时,在0x4C9857偏移给数组赋值,由于此时WeChatWin.dll正在加载,无法HOOK
#define WxConfigArrayAddr 0x16CE8F4 //微信设置数组首地址
//获取微信WeChatWin.dll的基址
DWORD dwWeChatWinBaseAddr = (DWORD)GetModuleHandle(L"WeChatWin.dll");
//计算需要HOOK的地址
DWORD dwDisableConfigHookAddr = dwWeChatWinBaseAddr + WxDisableConfigHookAddr;
//HOOK的下一跳转地址
DWORD dwDisableConfigJumpAddr = dwDisableConfigHookAddr + 6;
//微信配置数组的首地址
DWORD dwConfigArrayAddr = dwWeChatWinBaseAddr + WxConfigArrayAddr;
//配置的Key
DWORD dwConfigKey = 0;
//配置的值
DWORD dwConfigValue = 0;
void HookDisableConfig()
{
//以下循环是为了在微信启动的时候直接禁用[自动更新]和[热键冲突提示]的配置
//只所以用循环来处理,鬼手在文章中也说了,这个数组是随机下标.
//不能单纯的i=5就是[自动更新],得用key=0x69来判断
for (int i = 1; i <= 10; i++)
{
//以下三行根据微信配置数组的首地址来计算每个配置项
DWORD p = *(DWORD *)((*(DWORD *)dwConfigArrayAddr) + 0x4);
p = *(DWORD *)(p + 0x4);
p = *(DWORD *)(p + 0x4 * i);
//每个配置项+0x4为key, +0x8为value
DWORD key = *(DWORD*)(p + 0x4);
if (key == 0x69 || key == 0x135)
{
//将[自动更新]和[热键冲突提示]的配置项的值设置为0
*(DWORD*)(p + 0x8) = 0x0;
}
}
//以上代码是用来处理微信初始化的配置项值加载
//以下HOOK代码是为了在运行过程中,人工勾选[自动更新]和[热键冲突]也不生效
BYTE bJmpCode[6] = { 0xE9, 0x00, 0x00, 0x00, 0x00, 0x90 };
*(DWORD*)&bJmpCode[1] = (DWORD)HookDisableConfigHandle - dwDisableConfigHookAddr - 5;
WriteProcessMemory(GetCurrentProcess(), (LPVOID)dwDisableConfigHookAddr, bJmpCode, 6, 0);
}
__declspec(naked) void HookDisableConfigHandle()
{
__asm
{
//下面这行是补全我们刚才HOOK时候写内存覆盖的代码
mov ecx, dword ptr ss : [ebp + 0xC]
//ebx为配置项的key, ecx为配置项的value
mov dwConfigKey, ebx
mov dwConfigValue, ecx
//保存寄存器现场
pushad;
pushfd;
}
//判断是否是需要改写的值,如果是则将value设为0x0
if (DisableConfigHandleCompare())
{
dwConfigValue = 0x0;
}
__asm
{
//恢复寄存器现场
popfd
popad
//上面说了ecx是配置项的值,我们将dwConfigValue写入到ecx中
//当dwConfigValue=0x0的时候,达到即使你在界面上勾选了配置项也不生效的效果
mov ecx, dwConfigValue
//在HOOK之前ecx的值来源于[eax+0x8],将ecx的值写回[eax+0x8]
mov dword ptr ds : [eax + 0x8], ecx
//跳转回HOOK代码的下一行,回归正常处理逻辑
jmp dwDisableConfigJumpAddr
}
}
BOOL DisableConfigHandleCompare()
{
//0x69:自动更新,0x135:热键冲突提示
if ((dwConfigKey == 0x69 || dwConfigKey == 0x135) && dwConfigValue == 0x1)
{
return TRUE;
}
else
{
return FALSE;
}
}