【Python微信机器人】第五篇: 注入Python加载运行py脚本且支持热加载


目录修整

目前的系列目录(后面会根据实际情况变动):

  1. 在windows11上编译python
  2. 将python注入到其他进程并运行
  3. 注入Python并使用ctypes主动调用进程内的函数和读取内存结构体
  4. 调用汇编引擎实战发送文本和图片消息(同时支持32位和64位微信)
  5. 允许Python加载运行py脚本且支持热加载
  6. 利用汇编(keystone)和反汇编引擎(beaengine)写一个x86任意地址hook
  7. 封装Detour写一个x64函数 hook
  8. 实战32位和64位接收消息和消息防撤回
  9. 实战读取内存链表结构体(好友列表)
  10. 根据bug反馈和建议进行细节上的优化
  11. 做一个僵尸粉检测工具
  12. 其他功能慢慢加

简单说一下目录变动的细节,具体实现下一篇来说:

  1. 为什么要引入反汇编引擎

刚接触Windows hook时,学的最简单的hook,就是自己处理修改的机器码。但是它不便于引入Python,而且比较繁琐,需要自己用内联汇编补上被修改的指令。

加入反汇编引擎后,不需要关心被hook地址的汇编指令是什么,让引擎来获取被修改的汇编指令。

这样实现的hook还有一个好处:你不止可以在Python获取到该地址所有寄存器的值,你还能在Python里修改这些寄存器,当然能修改esp和eax的话也就能修改函数参数和返回值

  1. 为什么要引入汇编引擎

自己解析汇编的话需要处理相对地址的偏移,引入汇编引擎后方便了很多

  1. 为什么不用Python写一个纯hook库

keystone和beaengine都有Python接口,是可以实现Python来写这个hook,但是我懒不想写了。直接用C++编译成dll什么语言都能用

使用教程

本篇文章做的改动:

  1. injectpy以导出函数的形式来初始化Python
  2. 可以选择注入Python后是打开控制台还是执行Python代码
  3. 执行的Python代码实时修改实时生效

下载代码

先去github或者gitea下载源码,代码结构如下:【Python微信机器人】第五篇: 注入Python加载运行py脚本且支持热加载

启动微信后,执行main.py,它就会将Python注入到微信并在微信里也加载这个main.py,接下来你只需要修改robot.py保存后消息就会发送出去。

from module.sendmsg import SendMsg
st = SendMsg()
st.send_text("filehelper""测试消息!")

当你想再发送消息,你也是修改这个脚本后保存。请禁用编辑器的自动保存,不然你还没写完代码,微信就已经加载你的脚本。定时发消息用threading.Timer

要导入什么库跟平时一样安装导入即可,使用上没有什么区别。

另外,该目录下的任意一个脚本被修改都会重新加载并执行。所以你也可以再添加一个脚本(需遵循Python模块命令规范),在里面写一个新的逻辑。如果是阻塞的代码,请使用多线程来执行

下面为技术知识点,如果你不感兴趣,直接拉到最后面看github地址

涉及知识点

远程函数执行

injectpy之前是在dll的入口函数创建个线程来加载Python,现在因为需要指定要执行的脚本绝对路径,所以该方法行不通了。

我就在injectpy导出了四个函数,用于设置Python的路径和执行脚本的路径

extern "C" __declspec(dllexport) void SetPythonPath(wchar_t* path);

extern "C" __declspec(dllexport) void SetOpenConsole(bool isOpen);

extern "C" __declspec(dllexport) void RunPythonConsole();

extern "C" __declspec(dllexport) void RunPythonFile(wchar_t* pyCodePath);

然后在Python里获取到这些导出函数的偏移,在加上dll的基址就是函数的内存地址,接着使用CreateRemoteThread来调用这些函数,就能在微信里初始化Python

调用CreateRemoteThread有个注意的地方,执行后最好等待(sleep)片刻再执行其他的代码。不然可能线程还没执行完,你就已经开始其他操作了

我就封装了一个DelayCreateRemoteThread方便调用

def DelayCreateRemoteThread(*args):
    CreateRemoteThread(*args)
    time.sleep(0.05)
【Python微信机器人】第五篇: 注入Python加载运行py脚本且支持热加载

模块热加载

篇幅较长,而且是个新功能,就在另一篇文章来说明。另外,该功能已经封装成库并且发布到pypi,可以pip安装,

请看同一天发布的第二篇文章:Python实现模块热加载

源代码

https://github.com/kanadeblisst00/PyRobot-part5

如果github访问较慢,可以试试我自建的仓库

http://www.pygrower.cn:21180/kanadeblisst/PyRobot-part5

原文始发于微信公众号(Python成长路):【Python微信机器人】第五篇: 注入Python加载运行py脚本且支持热加载

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/196023.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!