PC微信逆向:分析通用设置数组 之 禁用自动更新和热键冲突提示

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;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值