使用pywintrace监控Windows进程变动


写在前面

最近突发奇想,想监控某个进程的启动和退出事件,搜了一下,有个专门的名词来描述这类事件,叫做Event Trance For Windows,简称ETW,跟Windows的事件管理器有比较大的关系。
为了快速实现这个想法,决定使用python来完成,上github搜索,发现一个名为pywintrace的项目,只要稍作修改就能实现我们的需求。

安装依赖

需要用到pywintracepsutil两个模块。

pip install pywintrace
pip install psutil

示例代码

直接拿项目中的示例,稍作修改即可(需要管理员权限执行示例代码),这里以微信作为示例:

i

Read more

使用pysqlcipher3操作Windows微信数据库


写在前面

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

编译WCDB

前置操作

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

Read more

解析某音短视频X-Bogus


写在前面

首先推荐一篇资料:
某音短视频 X-Bogus 逆向分析,JSVMP 纯算法还原
这篇文章介绍了通过插桩日志抠算法的过程,很有参考价值。
文章已经实现的部分,本文不再重复,本文主要介绍从X-Bogus还原19位数组的过程,方便理解算法。

目标

// 从
var x_bogus = 'DFSzswVVUyXANrqJSkdAml9WX7jG';
// 还原出
var x_array = [64, 0.00390625, 1, 28, 7, 22, 69, 63, 0, 186, 99, 164, 90, 214, 32, 0, 190, 144, 201];

正向梳理

Read more

匿名管道和CreateProcess在Python中的应用


写在前面

有时候需要在程序内部调用cmd执行命令,主程序需要拿到命令的输出信息,python中有以下几种方案可以实现该操作:

  1. os.popen
  2. os.system(可能无法拿到返回)
  3. subprocess

其中使用最为广泛的,应该是subprocess.Popen,本文所要介绍的内容,就是参考该库源码实现的。
为了能够动态的读取目标进程的输出,而不是等到子进程执行完毕一次性读取,所以没有使用subprocess

CreateProcess

CreateProcess是一个Windows API,该API用于创建一个新的进程,并返回新进程相关信息,可以通过自定义参数重定向目标进

Read more

使用frida获取小程序code


写在前面

最近接了个需求,某个老哥想让我帮忙恢复被删的聊天记录(虽然最后没有成功),获取手机端wx数据库密码时遇到了点挫折,有时候imei+uin进行MD5加密后再取前7位的逻辑不对,别人提供的终极解决方案是使用frida进行Hook,直接把密码打印出来。
虽然最后我没有采用那个方法,但是试了下用frida获取微信小程序code,还是比较方便的,搜了别人的代码,并修改了一些因微信版本更新产生的错误。
怎么安装frida就自行百度吧。

代码

以下代码在微信电脑版3.7.0.30测试通过。

import frida
import sys

session = frida.attach('W

Read more

在目标进程中构造函数


写在前面

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

获取RVA

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

Read more

如何注入jar包到目标程序


写在前面

最近在研究Java ui元素嗅探技术,主要目的是识别鼠标指针所在位置的Java元素,本来是通过WindowsAccessBridge中的API实现,但是局限性太多,还有一种思路是通过java awt识别,这种方法自然是要用Java来实现。
虽然我现在不会写具体逻辑,但是可以先记录下怎么将jar包导入到目标JVM,这种技术以后也总会有用的。

具体实现

import com.sun.tools.attach.VirtualMachine;
...
public static void inject(String pid,String jarPath){
    // 根据pid附加目标j

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微信逆向--离线解密数据库


写在前面

前面的几篇文章,已经找到sqlite3_exec函数并调用,也实现了数据库在线备份,本篇文章,尝试定位保存数据库密码的基址,并编写一个离线解密工具。

回顾

在开始之前,要先回顾一下之前得到的结果: 数据库初始化

785BE313    8D55 CC         lea     edx, dword ptr [ebp-34]
785BE316    52              push    edx
785BE317    8B08            mov     ecx, dword ptr [eax]
785BE319    8B06            mov 

Read more

PC微信逆向--在线备份数据库


写在前面

在前面三篇文章,已经找到数据库句柄、sqlite3_exec函数和一系列备份用的函数地址,本篇文章,尝试完成微信数据库在线备份。

回顾

数据库句柄

[[WeChatWin.dll + 0x222F3FC] + 0x1888][[WeChatWin.dll + 0x222F3FC] + 0x188C]

函数地址

微信版本:3.6.0.18

sqlite3_open = 1138ACD0
sqlite3_backup_init = 1131C110
sqlite3_backup_step = 1131C510
sqlite3_sleep = 1138B510
sqlite3_backu

Read more