python hook 企业微信

各位老爷看官好。

最近在研究企微hook c++源码 改python源码。

目前注入是会了,注入的脚本也能被调用,主要是读取消息内容不会用。

不知道有没有大佬会这个。

企业微信4.1.2.6014版本 。

https://dldir1.qq.com/wework/work_weixin/WeCom_4.1.2.6014.exe

有大佬会的话,可以改一下代码实现读取消息内容。

后续我会放出来所有源码提供给能改的人。一起探讨研究院。

有兴趣可以加群研究。QQ群:684380330

目前放出来的是PC发送消息回调

注入地址 : 基址 + 0x3C12D57

贴上python 代码:

import frida
import sys
import pymem


# 目标函数的入口地址
def calculate_address(process_id, address_expression: str) -> int:
    """
    计算地址表达式的函数
    :param pid: 目标进程的PID
    :param address_expression: 包含模块地址和偏移地址的表达式,例如 "module_address+offset",或者只包含模块地址的情况
    :return: 计算后的地址值,如果表达式无效,则返回None
    """
    if not isinstance(process_id, int) or not isinstance(address_expression, str):
        print(1)
        print("Error: Invalid input parameters.")
        return None
    if '+' in address_expression:
        print(2)

        module_address, offset = address_expression.split('+')
        offset = int(offset, 16)  # 将偏移地址转换为整数类型
    else:
        print(3)

        module_address = address_expression
        offset = 0
    try:
        process = pymem.Pymem(process_id)
    except pymem.exception.ProcessNotFound:
        print(f"Error: Process with PID {process_id} not found.")
        return None
    module_base = None
    print(4)

    for module in process.list_modules():
        print(5)

        if module.name == module_address:
            module_base = module.lpBaseOfDll
            break
    if not module_base:
        print(6)

        print(f"Error: Module {module_address} not found.")
        return None
    final_address = module_base + offset
    return final_address


# 目标进程名称或进程ID
target_process_name = "WXWork.exe"
# 通过目标进程名称或进程ID连接到目标进程
# session = frida.attach(target_process_name)
session = frida.attach(12624)
# process = pymem.Pymem('WXWork.exe')
# module = pymem.process.module_from_name(process.process_handle, 'WXWork.exe').lpBaseOfDll
# print("企业微信基址:",module)
# root_addr = pymem.memory.read_int(process.process_handle, module + 0x325AD0)
# print(root_addr)
# print(hex(root_addr))
#
# root_addr = pymem.memory.read_int(process.process_handle, root_addr)
# print(root_addr)
# 获取进程ID
pid = session._impl.pid
print(pid)
# 在目标进程中加载Frida脚本
target_address = calculate_address(pid, 'WXWork.exe+3BAC9EE')

# 创建Frida脚本
script_code = """
Interceptor.attach(ptr(%s), {
  onEnter: function (args) {
    console.log('目标函数被调用!');
    var arg_num = 5
    for (var i = 0; i < arg_num; i++) {
        console.log('arg[' + i + ']: ' + args[i].toString());
    }
  },
  onLeave: function (retval) {
    console.log('目标函数执行完毕!');
    console.log('返回值:', retval);
  }
});
""" % hex(target_address)

script = session.create_script(script_code)



# 定义消息处理函数
def on_message(message, data):
    print("1231")
    print(message)
    print(data)
    if 'payload' in message:
        print(message['payload'])


# 注册消息处理函数
script.on('message', on_message)

# 加载并运行Frida脚本
script.load()

try:
    # 保持会话持续运行
    sys.stdin.read()
except KeyboardInterrupt:
    pass
finally:
    # 释放资源
    session.detach()
放出来C++代码供大佬研究:

//hookPc发送消息打印
void HookRecvPcMsg()
{
	if (NULL == RecvPcHookEntity) {
		RecvPcHookEntity = new EVInlineReplaceHook();
	}
	//hook地址
	DWORD hookAdd = getWxWorkAddBase() + 0x3C12D57;
	//hook回调地址
	LPVOID jmpAddress = &decRecvPcMsg;

	BYTE JmpCode[5] = { 0 };
	// E9 11051111(这里是跳转的地方这个地方不是一个代码地址 而是根据hook地址和跳转的代码地址的距离计算出来的)
	JmpCode[0] = 0xE9; //jmp的硬编等于0xE9
	//跳转地址减去hook地址-5就等于你的 地址硬编码
	*(DWORD*)&JmpCode[1] = (DWORD)jmpAddress - hookAdd - HOOK_LEN;//5
	BOOL state = RecvPcHookEntity->StartReplace(hookAdd, JmpCode, 5);
	if (state == TRUE) {
		// DbgPrintf(_T("[REPLACE_HOOK] hook消息成功"));
		P_LOG_INFO("[HookRecvPcMsg_REPLACE_HOOK] hook消息成功", __FILE__, __LINE__);
	}
}
//消息hook打印
DWORD recvPcMsgEax = { 0 };
DWORD recvPcMsgCallAdd = { 0 };
DWORD recvPcMsgJmp = { 0 };
void __declspec(naked) decRecvPcMsg() {
	__asm {
		pushad
		mov recvPcMsgEax, eax
	}
	RecvPcMsgRes(recvPcMsgEax);
	recvPcMsgCallAdd = getWxWorkAddBase() + 0x3BAC9EE;
	recvPcMsgJmp = getWxWorkAddBase() + 0x3C12D57 + 0x5;
	__asm {
		popad
		call recvPcMsgCallAdd
		jmp recvPcMsgJmp
	}
}
//获取微信模块基址
DWORD getWxWorkAddBase()
{
	DWORD wechatWinBaseAddress = (DWORD)LoadLibrary(L"WXWork.exe");
	return wechatWinBaseAddress;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python钩子微信是一种使用Python编程语言编写的程序,用于检测和捕获微信应用程序的输入和输出,并进行处理和操作。该程序可以用于自动发送和接收微信消息,拦截和修改微信消息,获取微信用户信息以及实现其他自定义功能。要实现Python钩子微信,需要了解微信应用程序的工作原理和API,以及Python的基本编程知识和技能。在编写程序时,需要使用第三方库和工具,例如itchat、pymouse、pyHook等。通过这些工具,可以轻松地编写Python钩子微信程序,并实现自己想要的功能。但是需要注意,在编写程序时,应遵守微信的相关规定和条例,不得用于非法或未经授权的用途。除此之外,在编写钩子程序时,还应注意安全问题,避免损坏计算机系统或容易出现安全漏洞。总之,Python钩子微信是实现微信自定义功能的一种有效方法,但需要在充分了解微信API和Python编程基础的基础上进行。 ### 回答2: Python hook PC微信,也就是通过Python程序来对PC版的微信进行一些自定义的操作。首先需要了解的是,PC微信是一个Windows平台的桌面应用程序,而Python是一种高级编程语言,可以通过一些模块和库来实现对PC微信的控制和管理。 要实现钩取(hook)PC微信,需要使用到相关的模块和包,比如pyHook、keyboard、ctypes等。其中,pyHook是一个Python钩子模块,它可以捕获各种Windows事件,如键盘鼠标事件等。而keyboard则是另一个Python模块,它也可以用于监测和记录键盘事件。最后,ctypes是一个Python模块,用于调用或操作Windows中的DLL、API以及C的库。 钩取PC微信主要可以实现以下几个方面: 1. 监测和记录键盘事件 通过使用pyHook、keyboard等模块,可以在Python程序中监测和记录PC微信中的各种键盘事件,比如输入字符、快捷键等。这可以方便地实现自动回复、自动切换聊天窗口等功能。 2. 控制和管理PC微信窗口 通过使用ctypes,在Python程序中可以调用Windows API函数,比如FindWindow、SetWindowPos等,来实现对PC微信窗口的控制和管理,比如改变窗口大小、位置,最小化窗口等。 3. 实现自动化脚本 通过以上两个方面的应用,可以实现对PC微信的自动化控制和管理。比如可以编写Python脚本,使其自动监测PC微信中的消息,自动回复、发送消息,或者进行一些其他操作等。 总之,Python hook PC微信可以为我们带来很多便利和效率,在实际应用中也有很多种可能,比如在聊天机器人、自动化聊天、消息推送等方面都有着广泛的应用。 ### 回答3: Python Hook PC微信,简单来说就是使用Python编写程序完成对PC微信软件的钩子(hook)功能。钩子是一种编程技术,可以监视计算机的特定活动,并在特定事件发生时触发自定义功能。 对于PC微信软件而言,可能存在一些无法实现的需求,或者需要对其界面进行改进等情况。这时,我们可以使用Python编写程序,来完成对微信软件的钩子,实现我们想要的效果。 具体来说,Python Hook PC微信可以通过以下步骤实现: 1. 导入Python的ctypes库,用于调用Windows的API函数。 2. 使用WinAPI获取微信的句柄(handle),并将其与Python中的句柄绑定。 3. 使用WinAPI获取微信窗口中的各种控件,包括菜单、列表、文本框、按钮等。 4. 对这些控件进行钩子操作,比如监控鼠标和键盘事件,或者改变控件的样式、位置、大小等。 5. 根据需要编写自己的功能,比如监听微信收到新消息的通知,自动回复消息,或者改变接收到的消息格式等。 需要注意的是,钩子的实现需要一定的编程技巧和经验,同时也具有一定的安全风险。在实际编写过程中,应当按照规范操作,避免对微信软件及其用户造成损害。此外,Python Hook PC微信也有一定的局限性,可能会受到微信版本升级、系统环境变化、安全策略影响等问题。因此,我们需要在编写程序前进行足够的研究和测试,以确保可靠性和稳定性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值