分类标签归档:C++

使用pysqlcipher3操作Windows微信数据库


写在前面

之前写过一系列微信数据库的文章,包括找句柄、获取数据库密钥、调用sqlite3_exec查询、备份、解密等。但是一直不知道怎么直接操作加密的库,近来发现腾讯开源了WCDB,几个平台的微信数据库都是以这个作为底层,Windows微信也不例外,遂拉代码,编译,记录下打开数据库后执行的一系列PRAGMA命令,再使用普通的sqlcipher执行相似操作,也可以打开。

编译WCDB

前置操作

1、拉取WCDB
2、在WCDB目录下拉取sqlcipher并检出035036eb02f68c2978ae18693427cd0f786df93e分支
3、在WCDB目录下拉取zstd并检出69036df

Read more

在目标进程中构造函数


写在前面

也做了一段时间的Windows逆向,编写了包含一系列API的WeChat机器人,将dll注入目标进程后,调用就成了问题,要调用,就要知道api函数的地址。
想要搞到地址,就要使用GetProcAddress这个函数,可是这个函数需要两个参数,CreateRemoteThread只能传递一个参数,怎么办呢?这里提供两种解决方案。

获取RVA

这种方案比较简单,主要思路就是把dll加载到自身进程,再通过函数地址 - 模块句柄的方式获取到目标函数的RVA。
然后使用GetModuleHandle拿到远程进程中的模块句柄,加上RVA就得到了函数地址。
这种办法自然也有局限性,比如64位进程无

Read more

JavaAccessBridge的使用


写在前面

工作中要通过自动化来操作java桌面程序,Windows的UIA只能识别顶层窗口,无法具体到内部的元素,所以无法使用,经过一番搜索,发现可以通过JavaAccessBridge来访问java中的ui组件。

相关文件

Java在某个版本后内置了JAB,可以在JDK安装目录\\include\\win32\\bridge下找到以下文件:

  1. AccessBridgeCallbacks.h (事件监听)
  2. AccessBridgeCalls.c (API)
  3. AccessBridgeCalls.h (API)
  4. AccessBridgePackages.h (数据结构)

可以在J

Read more

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

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

使用VS2019创建ATL组件


写在前面

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

创建工程

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

Read more

Linux调用pb模型并编译为so文件


写在前面

本文主要使用g++进行编译,介绍相关指令。

编译so文件

需要预先编译安装OpenCV。
pch.h

#ifndef PCH_H
#define PCH_H

#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/dnn.hpp>

using namespace std;
u

Read more

cv2调用tensorflow模型


问题概述

之前从tensorflow的C/C++接口中成功调用了saved_model,回味过程的时候看到opencv中的dnn,可以直接调用训练好的模型,但是这个不是saved_model,而是h5模型转换得到的另一种pb模型。

转换代码

另外会打印输入输出层的名字,使用tensorflow调用转换好的pb模型时会用到,但cv2的dnn就用不到了。

import tensorflow as tf
from tensorflow.python.framework.convert_to_constants import convert_variables_to_constants_v2

def

Read more