首页
社区
课程
招聘
11
[原创]Python调用微信OCR识别文字和坐标
发表于: 2023-11-24 18:24 13700

[原创]Python调用微信OCR识别文字和坐标

2023-11-24 18:24
13700

原理

在看雪看到一篇文章:[原创]逆向调用QQ截图NT与WeChatOCR-软件逆向-看雪-安全社区|安全招聘|kanxue.com。里面说了怎么调用微信和QQ本地的OCR模型,还有很详细的分析过程。


我稍微看了下文章,多的也看不懂。大概流程是使用mmmojo.dll这个dll来与WeChatOCR.exe做通信的,也是用它来启动和关闭WeChatOCR.exe进程的。所以关键只需要知道这个dll里的导出函数怎么使用,就能自己实现调用OCR。并且可以脱离微信,不需要启动微信就能调用。既然这样,那完全可以使用Python加载mmmojo.dll启动WeChatOCR.exe并和它通信进行OCR识别。


代码怎么实现的就不多说的,感兴趣的可以看github的源码。我就说下有意思的一个技巧和一个踩坑的地方

回调指针技巧

OCR识别成功完成后会调用你给定的回调函数,并将结果作为参数传给回调函数。而其中一个回调函数的原型是static void OCRRemoteOnConnect(bool is_connected, void* user_data);。第一个参数是当前连接状态,比较有意思的是第二个参数


第二个参数是你给定的一个指针,它可以通过SetMMMojoEnvironmentCallbacks这个导出函数来设置,然后你就可以在回调函数里访问到这个指针。这个有什么用呢?就以上面github里的C++代码为例,代码里是将它设置为类的this指针,然后在建立连接后调用OCRRemoteOnConnect回调函数时,通过这个this指针改变类变量m_connect_con_var,然后你才能调用DoOCRTask,如果m_connect_con_var变量没有被设置,说明没有连接成功,就一直等待。


搜了一下,在Python里也可以实现这样一个操作,把这个值设置成Python类对象,然后就可以在回调函数访问这个类对象。原理大概像这篇文章:python - Back-casting a ctypes.py_object in a callback - Stack Overflow。先使用ctypes.py_object将对象转化为一个PyObject指针传给c层,然后在回调函数里再通过ctypes.cast(context, py_object).value得到这个对象,在这个项目里的代码如下:

1
2
3
4
5
6
7
8
# 将self转为c指针设置成user_data
SetMMMojoEnvironmentCallbacks(m_mmmojo_env_ptr, 0, py_object(self))
# 在回调函数里使用它
def OCRRemoteOnConnect(is_connected:c_bool, user_data:py_object):
    print(f"OCRRemoteOnConnect 回调函数被调用, 参数, is_connected: {is_connected}")
    if user_data:
        manager_obj:OcrManager = cast(user_data, py_object).value
        manager_obj.SetConnectState(True)

[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!

收藏
点赞 11
支持
分享
赞赏记录
参与人
雪币
留言
时间
gusong
+1
期待更多优质内容的分享,论坛有你更精彩!
2025-2-16 21:45
slcn
为你点赞~
2024-3-15 09:18
PLEBFE
为你点赞~
2024-1-3 03:30
York Waugh
为你点赞~
2023-12-26 22:19
Jtian
为你点赞~
2023-12-22 01:32
zhczf
为你点赞~
2023-12-6 11:04
小旺不正经
为你点赞~
2023-12-3 08:55
cxbcxb
为你点赞~
2023-11-26 21:53
asdll
为你点赞~
2023-11-25 12:36
crackwiki
为你点赞~
2023-11-24 20:48
科学上网
为你点赞~
2023-11-24 19:03
最新回复 (6)
雪    币: 3984
活跃值: (31431)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2023-11-25 21:34
1
雪    币: 3528
活跃值: (5844)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
没技术含量,但是写的很清楚很详细,值得推广,好贴,如果都这样写帖子,那极大推动技术进步!
2023-11-25 22:11
0
雪    币: 2161
活跃值: (2815)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
4
麻烦 用pybind11 几行代码
2023-11-28 01:53
0
雪    币: 315
活跃值: (2692)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
evilbeast 麻烦 用pybind11 几行代码
那直接用C++写的dll不就行了,干嘛还用pybind11封装一下
2023-11-29 11:37
0
雪    币: 498
活跃值: (47976)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
2023-12-2 07:46
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢分享
2023-12-2 11:04
0
游客
登录 | 注册 方可回帖
返回

账号登录
验证码登录

忘记密码?
没有账号?立即免费注册