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
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打包,这个就不适用这个方法了。 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() 感谢分享 !!!谢谢 xqyqx 发表于 2023-1-10 08:26
username:paper
password:sheep
建议下次用Cython编译成二进制或者简单混淆一下代码
对对,如果使用pyinstaller打包的话一下子就可以逆回源码了,我换了一种打包方式后,我自己初学破解感觉,愣了半天也没找到思路,我用OD断点API没反应,搜索关键词字符串也没找到{:1_904:}
链接:https://pan.baidu.com/s/1G75RiVBCKY0pJTdDhYj3wA
提取码:mysa
感谢分享 !!!谢谢 学习一下 {:1_921:} 这个东西有点意思 楼主加油 需要什么工具?网上下的 很多用不多=了