上一个文章,我们已经找到了我们需要的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);
//到这里 就获取到了微信的结构体
}