papersheep 发表于 2023-1-10 05:37

python,无壳,简单版,来试试吧

本帖最后由 papersheep 于 2023-1-10 08:34 编辑

压缩包有32位和64位的CM
验证失败

验证成功

链接:https://pan.baidu.com/s/1tnc1-I6sXkTEQQyxjeUN4w
提取码:xlkl

加一个py转c后编译的版本(这个不是pyinstaller打包的)
链接:https://pan.baidu.com/s/1G75RiVBCKY0pJTdDhYj3wA
提取码:mysa

papersheep 发表于 2023-1-10 19:54

liyitong 发表于 2023-1-10 13:49
你是怎么把源代码给弄出来的

这种逆出源码的只能针对pyinstaller打包的python代码。具体流程是这样的
1. 安装python环境
2.到github或者百度上下载pyinstxtractor.py
3.在CM所在目录的命令行运行:python pyinstxtractor.py CM.exe
4.第三步运行后会得到xxx.exe_extracted的目录文件
5.进入xxx.exe_extracted,找出被加密的python源码,你会发现一个文件后缀是xxx.exe.manifest,这个xxx就是源码文件名,那么被加密的源码就是"xxx.exe_extracted/xxx",这个被加密的源码文件没有任何后缀
6.找到被加密的源码文件后,加上.pyc后缀给它
7.要破解这个加密源码文件你需要找到magic num,这个密钥长4个字节,不同版本的python对应的magic num是固定的,你现在有两种方法找到这个magic num,一种是网上写好的对照表,你在xxx.exe_extracted目录下看一下pythonxx.dll就知道这个软件是python多少版本打包的了,你知道版本后网上直接找出对应的magic num。第二种方法是xxx.exe_extracted目录下有一个struct文件,它的前4位字节就是magic num。(我自己破解的时候我就是取这个struct的前4位字节)
8.取到magic num后,就可以构建破解密钥了,目前有两种情况,第一种情况是这个软件是(python3.7以下,不包括3.7),那么你构建出来的破解密钥就是(4个字节的magic num + 4个字节的时间戳),这个时间戳可以全是0。如果软件是(python3.7以上,包括3.7),那么破解密钥就是(4个字节的magic num + 4个字节的空白数据 + 4个字节的时间戳 + 4个字节的文件长度),除了magic num,其他数据可以全是0。
9. 以这个软件为例,这个软件在被pyinstxtractor.py解析后可以看出python38.dll,所以这个软件是python3.8版本的,那么我把 "xxx.exe_extracted/xxx.pyc"放入编辑二进制文件的软件里(我用的是吾爱论坛提供的C32Asm),然后我把第8步得出的密钥插入文件头,也就是在文件最前面插入这个破解密钥,最后保存
10.到此源码的pyc就处理后了,下一步就是在自己的python环境使用Pip安装uncompyle6,安装命令:pip install uncompyle6
11. 然后进入源码.pyc所在的目录在命令行运行:uncompyle6 -o new.py 源码.pyc,那么你得出的new.py就是软件源码,不过这个源码会有一点点瑕疵。
12. 这个方法只适用于pyinstaller打包的python文件,我后续上传的那个CM是使用nuitka打包,这个就不适用这个方法了。

xqyqx 发表于 2023-1-10 08:26

username:paper
password:sheep
建议下次用Cython编译成二进制或者简单混淆一下代码

#!/usr/bin/env python
import tkinter as tk
import tkinter.messagebox as tkinter


def login_func(e_usename, e_password, root_win):
    usename = e_usename.get()
    password = e_password.get()
    if usename == "paper" and password == "sheep":
      root_win.update()
      root_win.deiconify()
    else:
      tkinter.messagebox.showerror(
            "账号密码错误",
            "购买账号:www.xxx.com",
            **("title", "message")
      )


def close_top1(top1, root_win):
    top1.destroy()
    root_win.destroy()


def main():
    root_win = tk.Tk()
    root_win.title("tkcm1")
    root_win.geometry("450x300")
    tk.Button(
      root_win,
      "已开启主要功能",
      **("text",)
    ).pack()
    root_win.withdraw()
    root_win.update()
    top1 = tk.Toplevel(root_win)
    top1.title("登录窗口")
    top1.geometry("300x100")
    None(None, (lambda: close_top1(top1, root_win)))
    l_usename = tk.Label(top1, "账号:", **("text",))
    l_password = tk.Label(top1, "密码:", **("text",))
    e_usename = tk.Entry(top1)
    e_password = tk.Entry(top1)
    l_usename.grid(0, **("row",))
    l_password.grid(1, **("row",))
    e_usename.grid(0, 1, **("row", "column"))
    e_password.grid(1, 1, **("row", "column"))
    b_login = None(
      None,
      None,
      (lambda: login_func(e_usename, e_password, root_win)),
      **("text", "command")
    )
    b_login.grid(2, **("row",))
    root_win.mainloop()


if __name__ == "__main__":
    main()

aa2923821a 发表于 2023-1-10 08:39

感谢分享 !!!谢谢

papersheep 发表于 2023-1-10 08:40

xqyqx 发表于 2023-1-10 08:26
username:paper
password:sheep
建议下次用Cython编译成二进制或者简单混淆一下代码


对对,如果使用pyinstaller打包的话一下子就可以逆回源码了,我换了一种打包方式后,我自己初学破解感觉,愣了半天也没找到思路,我用OD断点API没反应,搜索关键词字符串也没找到{:1_904:}
链接:https://pan.baidu.com/s/1G75RiVBCKY0pJTdDhYj3wA
提取码:mysa

ycx151771 发表于 2023-1-10 08:44


感谢分享 !!!谢谢

stone0505 发表于 2023-1-10 09:52

学习一下 {:1_921:}

lyisme 发表于 2023-1-10 10:16

这个东西有点意思

liangxinbeilang 发表于 2023-1-10 10:36

楼主加油

sh101848 发表于 2023-1-10 11:13

sk2006 发表于 2023-1-10 11:36

需要什么工具?网上下的 很多用不多=了
页: [1] 2 3
查看完整版本: python,无壳,简单版,来试试吧