PC微信 3.0.0.47 分析并HOOK 接收消息CALL (2) 代码实现

上一个文章,我们已经找到了我们需要的CALL

现在我们要做的 就是利用这个call 来获取我们要的信息

78A0A570 E8 4B020000 call WeChatWi.78A0A7C0

已知数据:

消息结构体内存地址 = [[ebp + 0x3c] + 0x14]

内存注入地址偏移: 0x78A0A570 - 0x786A0000 = 0x36A570

调用call地址偏移:   0x78A0A7C0 - 0x786A0000 = 0x36A7C0

我们可以通过代码来实现hook call 获取消息

具体实现方式:

    DWORD RecievedMessageOffset = (0x78A0A570 - 0x786A0000);
	DWORD RecievedMessageReturnOffset = (0x78A0A7C0 - 0x786A0000);
	CHAR BackRecieveCode[5] = { 0 };

	DWORD RecievedMessageReturn = 0;

	DWORD cEdp = 0;

	void __declspec(naked) RecievedAllMessage() {
		__asm {
			mov cEdp, ebp;
			push eax;
		}
		EncodeRecievedMessage(cEdp);
		__asm {
			pop eax;
			jmp RecievedMessageReturn;
		}
	}

    void HookRecievedMessage() {
		RecievedMessageReturn = Util->Offset(RecievedMessageReturnOffset);
		DWORD RecievedHookAddress = Util->Offset(RecievedMessageOffset);

		cout << "CALL地址:" << hex << RecievedHookAddress << endl;
		BYTE jmpCode[5] = { 0 };
		jmpCode[0] = 0xE9;
		*(DWORD*)&jmpCode[1] = (DWORD)RecievedAllMessage - RecievedHookAddress - 5;
		ReadProcessMemory(GetCurrentProcess(), (LPVOID)RecievedHookAddress, BackRecieveCode, 5, 0);
		WriteProcessMemory(GetCurrentProcess(), (LPVOID)RecievedHookAddress, jmpCode, 5, 0);
	}

    void UnHookRecievedMessage() {
		DWORD RecievedHookAddress = Util->Offset(RecievedMessageOffset);
		WriteProcessMemory(GetCurrentProcess(), (LPVOID)RecievedHookAddress, BackRecieveCode, 5, 0);
	}

    void EncodeRecievedMessage(DWORD ebp) {
        DWORD wxMsg = HEUtil::GetIntByAddress(ebp + 0x3c);
        wxMsg = HEUtil::GetIntByAddress(wxMsg + 0x14);
        
        //到这里 就获取到了微信的结构体        


    }

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hellmessage

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值