摘要:破解对python打包好的.pyc和.pyd文件进行破解

最近闲来无事就试着破解一下使用pyinstaller打包的python程序。过程一言难尽,反正不是太好玩,尤其是当使用pyqt界面和多线程时,找到破解点都是一个很麻烦的问题。对于我要破解的软件,因为软件作者直接把函数的功能作为函数的名字,所以不是很难找。但是如果作者把函数名字起的千奇白怪呢?我用了以下几个方法但最后还是找不到破解点。

  • 最简单的一步一步跟,但是多线程,外加pyqt界面,跟个鬼鬼,一会就晕了。
  • 在windows button按钮上下消息断点,先输入序列号,然后在x64dbg下面的句柄栏里面下消息断点,因为是对按钮进行操作,所以选择WM_LBUTTONUP 这个消息。结果最后也以失败告终。
  • 因为点击"注册"字样后,会弹出一个弹窗让你输入序列号,所以极大可能会触发Windows API中的CreateWindowEx,然后一步一步的跟,只找到了注册码生成的地方。
  • 上面都失败了,然后这个该死的软件,貌似当检测到调试的时候会关闭电脑,必须先打开软件,然后再打开IDA pro等工具。
  • 最后实在没办法了,直接对大致的几个dll文件的代码段和数据段内存访问断点,观察哪个被触发了,从而定位到大概的生成序列号和注册码的pyd文件。

破解pyd的方法

  • 1.最简单也易行的方法就是用IDA pro查看生成注册码和序列号的pyd文件,然后查看strings窗口。赌脸看看里面是不是有register等字眼,比如我这个就有is_register_code的函数名字。然后找一个和作者版本相同的python,一般情况下可以通过作者软件目录下的python36.dll等文件直接获得python版本号。如果不行,利用pyinstxtractor.py(下面附件)拆分作者打包好的软件,然后里面有个sturct的文件,前几个字节就是python的版本号,详情请百度。然后直接安装相应的python,在作者的软件目录下,拿函数调用就行。这是最简单的方法。
  • 2..pyd文件并不是不可破译,而是破译起来很麻烦。在上面的方法中拿到了函数名。然后最好办的办法就是在linux下自己写一个简单的python程序(注意最好和作者的python版本一样),然后使用cpython生成.so文件。然后使用IDA Pro和cpython生成的.c文件对比。找出函数在IDA pro中的位置。为什么非要在linux下生成,因为我在windows下生成的时候调试信息是被去掉的(对应下面第一种),而在linux下生成的.so包含调试信息(对应下面第二种)。
  • 3.当你猜到函数名之后可以直接在IDA Pro中查找相关引用,直接找到函数的对应的汇编代码。
    我遇到的有两种形式。

    第一种如下:

    pyd文件逆向分析(一)1.jpg

    第二种如下:

    pyd文件逆向分析(一)2.jpg

    当发现类似以上两种形式的代码时,可以直接认定为就是一个函数。

定位函数

定位到函数之后只能一行一行跟踪汇编,但是因为多线程,x64dbg总是F9跑不到断点就停,十分麻烦,最后也没能破解出来。但是如果是简单的验证利用IDA pro以及x64dbg应该是能破解出来的。函数名字全靠猜,如果作者代码写的漂亮的话是可以的。

一些附件

pyinstxtractor.rar

使用方法:
百度使用pyinstxtractor.py反编译exe即可