分类目录归档:python

使用pywintrace监控Windows进程变动


写在前面

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

安装依赖

需要用到pywintracepsutil两个模块。

pip install pywintrace
pip install psutil

示例代码

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

i

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

js获取网页echarts图表中的数据


写在前面

最近接到某网站的爬虫需求,因为客户与目标网站是通过协议获取的账号,所以不希望从接口获取数据,而网页源代码无法获取完整的canvas数据,怎么办呢,需求还是得做。

实现思路

后来发现,echarts是动态图表,当鼠标移动到某处时,会高亮该处数据,并实时更改某个div的text内容,观察network接口,没有新的请求(也不可能有),说明数据已经存储在某个js变量里了,我就去瞅了一下echarts渲染数据时使用的函数:

var chart = echarts.init(document.getElementById("map"+Id),'write',

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