PC微信逆向获取聊天表情


写在前面

PC微信版本:3.5.0.46
今天有个老哥提出需求,问我能不能把微信的表情包保存到本地,因为之前找到过未加密图片数据的Hook点,本来以为差不多的,然而并不是,所以有了这篇文章。

思路

首先还是在接收消息的地方下断,发一个表情,查看消息内容,把xml数据拷贝出来,看看都用到了哪些属性,然后在OD里右键-查找-查找所有字串,搜索某个属性,把push这些属性的指令都下断。

然后再发一个表情消息,会在某个push属性的地方断下,取消掉之前所有的断点,再BP CreateFileW,然后一直运行直到CreateFileW的路径包含CustomEmotion,此时记下文件句柄(eax),取消

Read more

Python通过COM口调用微信发消息CALL


写在前面

赶在二月底来更新。
WeChat版本:
3.5.0.46
编译环境:
Windows10 Pro
VS 2019 Community

实现思路

思路,之前的文章基本讲过:

  1. 编写32位DLL,添加内联汇编调用微信发消息CALL
  2. 开辟远程进程,在远程进程中开辟远程线程和写入DLL绝对路径
  3. 调用LoadLibrary让微信加载自己的DLL
  4. 将DLL加载进自己创建的exe进程中,计算导出函数的偏移
  5. 以同样的方式,在远程进程中写入数据,创建远程线程调用目标函数
  6. 创建32位ATL简单对象,编写注入、调用、卸载等一系列接口
  7. 注册COM组件
  8. 64/32位Python调用

Read more

PC微信逆向之发送消息


写在前面

最近在搞微信的发送消息CALL,跟着网上的教程,一步一步走,很容易定位到CALL的地址,在适当的地方用OD断下,修改压入的参数内容,消息内容或接收人成功改变,但在使用C++调用的时候,因为不懂汇编指令,所以踩了一些坑。

工具

微信 3.5.0.46
Windows10 Pro
OllyICE 1.10
Cheat Engine 7.0
Visual Studio 2019

定位CALL地址

这部分感觉讲不太明白,而且网上有很多现成的教程,找这个CALL的思路还是比较简单的,推荐阅读下面这篇文章:
CSDN:PC微信逆向:发送与接收消息的分析与代码实现
下面是我定位到的内容:

787D

Read more

requests处理form-data和payload类型的参数


写在前面

在使用requests发送post请求时,会遇到不同的表单类型,比较常见的是application/x-www-form-unlencoded,直接传递字典即可,有时会遇到multipart/form-data和Request Payload类型,只要做简单的处理即可。

form-data类型

import requests

def get_form_data(data:dict) -> tuple:
    data_files = []
    for key in data.keys():
        if not isinstance(data[key],list

Read more

解决Python解压Zip文件出现中文乱码


写在前面

最近有很多项目需要用到zip解压,python自带了zipfile模块,但是文件带有中文名时会出现乱码,查找资料后发现zipfile中文件名使用了cp437的编码方式,使用utf8或者gbk重新解析一下即可。

实现

import zipfile
import os,shutil
def ziptest():
    zip_file = zipfile.ZipFile('./test.zip')
    DIR = './test_zip'
    zip_list = zip_file.namelist()
    if os.path.exists

Read more

Python实现鼠标和键盘Hook


写在前面

有时需要实时监控下一次鼠标点击的动作,所以就考虑通过Hook来实现,主要原理是Windows通过消息机制来运作,在消息传递过程加上一层自己的操作,就实现了动作监听,python有现成的轮子,PyHook3,可以很方便的使用。

PyHook3

注:键盘Hook请自行研究

import pythoncom
import PyHook3 as pyHook
import ctypes

def onMouseEvent(event):
     # 监听鼠标事件
     print(dir(event))
     if not event.WindowName:
         re

Read more

Windows消息机制在python中的使用


写在前面

此问题是在不同线程之间通信时出现的,在开始下一次任务之前,要确保某个子线程已退出(后来才想到在适当地方join前述子线程就可以了),不过当时已经使用PostMessage实现了不同线程通信,在此记录一下,或许他日有用。

实现代码

import ctypes
WM_USER = 0x400
WM_PLAYER_STOP = WM_USER + 0x1
# 用于接收消息,在接收到消息之前将阻塞进程
GetMessageW = ctypes.windll.user32.GetMessageW
GetMessageW.argtypes = [ctypes.POINTER(ctypes.win

Read more

Python消息弹框的使用


写在前面

python的tkinter中有消息弹框的实现,但这个方法有一个略微让人不爽的地方,需要在调用之前声明一个tk对象(不需要mainloop)并且调用withdraw隐藏,否则会有一个意料之外的窗口弹出,实际上是tkinter帮你创建了一个tk窗口。本文介绍一下tkinter消息弹框和Windows API弹框的使用。

tkinter

from tkinter import messagebox
from tkinter import Tk
root = Tk()
root.withdraw()
# 错误弹框
messagebox.showerror(title = 'Erro

Read more

Pyinstaller打包时包含静态资源


写在前面

最近在做一个项目,交付时使用exe,但是有几个DLL依赖需要放到同级目录,被问及能不能把DLL隐藏起来,之前从没有搞过类似的事情,于是打开百度,搜索一番,还是有戏的。

打包进EXE

Pyinstaller可以使用makespec命令生成spec文件,或者在初次打包时自动生成,此时修改相应的spec文件:

# 以元组的形式写到datas列表里,第一个值为文件路径(使用反斜杠),第二个值为打包后相对exe文件的目录,'.'表示根目录
datas=[('xxx.dll','.'),('xxx.png','.')

Read more

使用VS2019创建ATL组件


写在前面

之前遇到32位程序调用64位DLL的问题,百度的结果是使用com组件完成进程间通信,真的是很不错的思路,可以完成多种混合编程。本文记录一下如何开发一个简单的COM组件。

创建工程

打开VS2019,新建项目,选择ATL项目,点击创建,然后选择ATL项目类型,可执行文件、动态链接库或者是服务,只是注册方式不一样。然后在解决方案资源管理器中,右键创建的项目->添加->新建项目,选择ATL->ATL简单对象,然后弹出属性页,填写短名称和ProgID,ProgID一般为组件类.短名称,后面调用组件的时候要用到ProgID。填写这两项即可,别的不需要管,填写完毕点击完成。

Read more