吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2217|回复: 13
收起左侧

[CrackMe] py写的crackme

[复制链接]
exchange110 发表于 2024-1-31 00:09
CM是什么?Crackme是什么?这是什么东西?楼主发的什么?
他们都是一些公开给别人尝试破解的小程序,制作 Crackme 的人可能是程序员,想测试一下自己的软件保护技术,也可能是一位 Cracker,想挑战一下其它 Cracker 的破解实力,也可能是一些正在学习破解的人,自己编一些小程序给自己破解,KeyGenMe是要求别人做出它的 keygen (序号产生器), ReverseMe 要求别人把它的算法做出逆向分析, UnpackMe 是要求别人把它成功脱壳,本版块禁止回复非技术无关水贴。

加的有壳,不知道有用没,软件需要联网,但是请放心使用,没有任何后门只有简单的success or fail
爆破求算法都可,成功会显示success
https://www.lanzv.com/iyKPp1ms4p3e
密码:h990

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
TADYCB + 1 + 1 用心讨论,共获提升!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

我是不会改名的 发表于 2024-2-1 17:20

单纯修改字符串很简单,反编译出pyc后直接hook就行

settexto = QMessageBox.setText
def setText(text, p_str=None):
    print("setText")
    if p_str == "错误!":
        p_str = "正确!"
    return settexto(text, p_str)

entertain.QMessageBox.setText = setText
setWindowTitleo = QMessageBox.setWindowTitle
def setWindowTitle(title, p_str=None):
    print("setWindowTitle")
    if p_str == "你干嘛~":
        p_str += "~~~~"
    return setWindowTitleo(title, p_str)

entertain.QMessageBox.setWindowTitle = setWindowTitle

还原也不难,主要用的全是标准库,建议下次自己写加密函数

一开始随机生成了key和iv

直接修改对应py

\Lib\site-packages\Crypto\Random
def get_random_bytes(n):
    print("get_random_bytes", n)
    return b"0"*n

然后获取了时间戳

def toMSecsSinceEpoch(self):
    print("toMSecsSinceEpoch")
    return 0
entertain.QDateTime.toMSecsSinceEpoch = toMSecsSinceEpoch

aes cbc 加密上面时间

key1=b"kfmd42fjdns66ex4dmfge888qazom006"
iv1=b"dkexnf5gae426gao"

生成秘钥对

key = '''-----BEGIN PRIVATE KEY-----
。。。。。。
-----END PRIVATE KEY-----'''
rsakey = RSA.import_key(key)

def generate(size: int):
    print("generate")
    return rsakey

rsa加密上面加密后的内容

然后又aes加密

key2=b"zhf2g5izi2lf5hchenwo11xicm4flyol"
iv2=b"b11houruz66zc662"

取前13位当做uid

然后又aes加密uid

key3=b"zhsvb99wo555fb1cde11hao4dzpe33ca"
iv3=b"oni1hourcvbuzz66"

最后在用一开始生成随机字节加密

上面几次aes的key都可以抓包拿到

然后尝试输入key,可以发现赋值给user_key

直接尝试反汇编器

dis.dis(entertain)

主要逻辑在entertain.CaptchaApp.verify)里面

137           0 RESUME                   0

139           2 LOAD_FAST                0 (self)
              4 LOAD_ATTR                0 (user_key_edit)
             14 LOAD_METHOD              1 (text)
             36 PRECALL                  0
             40 CALL                     0
             50 STORE_FAST               1 (user_key)

141          52 LOAD_GLOBAL              5 (NULL + QMessageBox)
             64 PRECALL                  0
             68 CALL                     0
             78 STORE_FAST               2 (msg)

142          80 LOAD_FAST                1 (user_key)
             82 LOAD_GLOBAL              6 (encrypted_key)
             94 COMPARE_OP               2 (==)
            100 POP_JUMP_FORWARD_IF_FALSE    74 (to 250)

143         102 LOAD_FAST                2 (msg)
            104 LOAD_METHOD              4 (setIcon)
            126 LOAD_GLOBAL              4 (QMessageBox)
            138 LOAD_ATTR                5 (Information)
            148 PRECALL                  1
            152 CALL                     1
            162 POP_TOP

144         164 LOAD_FAST                2 (msg)
            166 LOAD_METHOD              6 (setText)
            188 LOAD_CONST               1 ('Success')
            190 PRECALL                  1
            194 CALL                     1
            204 POP_TOP

145         206 LOAD_FAST                2 (msg)
            208 LOAD_METHOD              7 (setWindowTitle)
            230 LOAD_CONST               2 ('成功!')
            232 PRECALL                  1
            236 CALL                     1
            246 POP_TOP
            248 JUMP_FORWARD            73 (to 396)

147     >>  250 LOAD_FAST                2 (msg)
            252 LOAD_METHOD              4 (setIcon)
            274 LOAD_GLOBAL              4 (QMessageBox)
            286 LOAD_ATTR                8 (Critical)
            296 PRECALL                  1
            300 CALL                     1
            310 POP_TOP

148         312 LOAD_FAST                2 (msg)
            314 LOAD_METHOD              6 (setText)
            336 LOAD_CONST               3 ('错误!')
            338 PRECALL                  1
            342 CALL                     1
            352 POP_TOP

149         354 LOAD_FAST                2 (msg)
            356 LOAD_METHOD              7 (setWindowTitle)
            378 LOAD_CONST               4 ('你干嘛~')
            380 PRECALL                  1
            384 CALL                     1
            394 POP_TOP

151     >>  396 LOAD_FAST                2 (msg)
            398 LOAD_METHOD              9 (exec_)
            420 PRECALL                  0
            424 CALL                     0
            434 POP_TOP
            436 LOAD_CONST               0 (None)
            438 RETURN_VALUE

主要就是对比encrypted_key和user_key,encrypted_key是GLOBAL 的,直接获取

142          80 LOAD_FAST                1 (user_key)
             82 LOAD_GLOBAL              6 (encrypted_key)
             94 COMPARE_OP               2 (==)
            100 POP_JUMP_FORWARD_IF_FALSE    74 (to 250)

实际上就是最后一次aes加密结果

所以直接抓包,从第一个包里面获取key3

http://wanyuanshen.fun/get_key_iv.php?key=ikun114514

{"keys":["aes_key1 = 'kfmd42fjdns66ex4dmfge888qazom006'","aes_key2 = 'zhf2g5izi2lf5hchenwo11xicm4flyol'","aes_key3 = 'zhsvb99wo555fb1cde11hao4dzpe33ca'"],"ivs":["aes_iv1 = 'dkexnf5gae426gao'","aes_iv2 = 'b11houruz66zc662'","aes_iv3 = 'oni1hourcvbuzz66'"]}

第二个包里面获取key4

POST http://wanyuanshen.fun/receive_key_iv.php HTTP/1.1
Accept: */*
Accept-Encoding: gzip, deflate
Content-Length: 104
Content-Type: application/x-www-form-urlencoded
Host: wanyuanshen.fun
User-Agent: Python/3.11 aiohttp/3.8.4

key=22876898cd1120fabed253189e7b61dd6976779d99717a56225bad67a2de8394&iv=45134edad04f8281d8657748ca6bbd44

加密两次uid就行

from Crypto.Cipher import AES
from Crypto.Util.Padding import pad

uid = "f0eced2a1d359"
key3 = b"zhsvb99wo555fb1cde11hao4dzpe33ca"
iv3 = b"oni1hourcvbuzz66"
cipher4 = AES.new(key3, AES.MODE_CBC, iv3)
enc4 = cipher4.encrypt(pad(uid.encode(), AES.block_size))
key4 = bytes.fromhex("22876898cd1120fabed253189e7b61dd6976779d99717a56225bad67a2de8394")
iv4 = bytes.fromhex("45134edad04f8281d8657748ca6bbd44")
cipher5 = AES.new(key4, AES.MODE_CBC, iv4)
dec5 = cipher5.encrypt(enc4)
print(dec5.hex())
#643cc186d6c48261f7b081f31138f8a2

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册[Register]

x

免费评分

参与人数 5吾爱币 +6 热心值 +5 收起 理由
Tonyha7 + 2 + 1 我很赞同!
yiwai2012 + 1 + 1 大佬果然牛逼
Ki_Yo_Mi + 1 + 1 用心讨论,共获提升!
exchange110 + 1 + 1 我很赞同!
太子爷_振 + 1 + 1 热心回复!

查看全部评分

Light紫星 发表于 2024-1-31 11:54
看了一下,有tmd的壳,但是可以直接pyinstxtractor解包,然后解密pyc
发现请求了一个url,返回这个
{"keys":["aes_key1 = 'kfmd42fjdns66ex4dmfge888qazom006'","aes_key2 = 'zhf2g5izi2lf5hchenwo11xicm4flyol'","aes_key3 = 'zhsvb99wo555fb1cde11hao4dzpe33ca'"],"ivs":["aes_iv1 = 'dkexnf5gae426gao'","aes_iv2 = 'b11houruz66zc662'","aes_iv3 = 'oni1hourcvbuzz66'"]}
其他的暂时没看,反编译的不全
 楼主| exchange110 发表于 2024-1-31 13:40
Light紫星 发表于 2024-1-31 11:54
看了一下,有tmd的壳,但是可以直接pyinstxtractor解包,然后解密pyc
发现请求了一个url,返回这个
{"key ...

这个壳看来不能防pyinstxtractor
 楼主| exchange110 发表于 2024-1-31 13:44
Light紫星 发表于 2024-1-31 11:54
看了一下,有tmd的壳,但是可以直接pyinstxtractor解包,然后解密pyc
发现请求了一个url,返回这个
{"key ...

实际上这些数据有混淆的,没这么简单,有些和密钥算法没任何关系
qq465881818 发表于 2024-1-31 14:00
Light紫星 发表于 2024-1-31 11:54
看了一下,有tmd的壳,但是可以直接pyinstxtractor解包,然后解密pyc
发现请求了一个url,返回这个
{"key ...

先用unlicense-py3.11-x64 把tmd脱壳后 再修复后再看就扒光了
 楼主| exchange110 发表于 2024-1-31 15:43
qq465881818 发表于 2024-1-31 14:00
先用unlicense-py3.11-x64 把tmd脱壳后 再修复后再看就扒光了

大佬能扒下试试吗,我看看能反编译到什么程度
3969 发表于 2024-1-31 17:04
本帖最后由 3969 于 2024-1-31 17:10 编辑

有些Crackme是恶意程序,这个估计是测试程序员编程水平的
头像被屏蔽
shsww 发表于 2024-2-1 08:38
提示: 该帖被管理员或版主屏蔽
头像被屏蔽
zjlzhok 发表于 2024-2-1 10:04
提示: 该帖被管理员或版主屏蔽
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-28 04:36

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表