吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2000|回复: 14
收起左侧

[CrackMe] 【python】本人的第二个cm

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

吸取了上一贴的教训,我重新修改了一下我的代码(肯定不是上次的x2了),也是本人的第二个cm,规则和上个差不多。
这次采用了Pyinstaller+pyarmor 最大的区别可能是这次会申请管理员权限
无恶意代码,不联网,每次随机生成序列号

————————————————————————————————————————


————————————————————————————————————————
下载链接:

一号:https://cloud.alongw.cn/f/qJEtl/CMpython2.exe
二号:
https://qwindf.lanzouj.com/iNPBm1xbmcdi              密码:98x6
希望可以出个keygen

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

阳光肥肥 发表于 2024-5-4 23:02

使用pyinjector注入dll,dump出函数的字节码,根据字节码写keygen即可
[Plain Text] 纯文本查看 复制代码
18     >>   84 LOAD_GLOBAL              5 (int)
             86 LOAD_FAST                1 (_var_var_0)
             88 CALL_FUNCTION            1
             90 LOAD_CONST              12 (2025)
             92 BINARY_LSHIFT
             94 LOAD_GLOBAL              6 (len)
             96 LOAD_FAST                1 (_var_var_0)
             98 LOAD_CONST              13 ('52pj')
            100 BINARY_ADD
            102 CALL_FUNCTION            1
            104 LOAD_GLOBAL              5 (int)
            106 LOAD_FAST                1 (_var_var_0)
            108 CALL_FUNCTION            1
            110 LOAD_CONST               7 (1)
            112 BINARY_LSHIFT
            114 BINARY_MODULO
            116 BINARY_ADD
            118 STORE_FAST               3 (_var_var_2)

 19         120 LOAD_GLOBAL              7 (hex)
            122 LOAD_FAST                3 (_var_var_2)
            124 CALL_FUNCTION            1
            126 LOAD_METHOD              8 (replace)
            128 LOAD_CONST              14 ('0')
            130 LOAD_CONST              15 ('')
            132 CALL_METHOD              2
            134 STORE_FAST               3 (_var_var_2)

本帖子中包含更多资源

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

x
qq465881818 发表于 2024-5-2 15:54

import os, struct, marshal, zlib, _frozen_importlib
PYTHON_MAGIC_NUMBER = _frozen_importlib._bootstrap_external.MAGIC_NUMBER
PYZ_ITEM_MODULE = 0
PYZ_ITEM_PKG = 1
PYZ_ITEM_DATA = 2
PYZ_ITEM_NSPKG = 3

class ArchiveReadError(RuntimeError):
    pass


class ZlibArchiveReader:
    __doc__ = "\n    Reader for PyInstaller's PYZ (ZlibArchive) archive. The archive is used to store collected byte-compiled Python\n    modules, as individually-compressed entries.\n    "
    _PYZ_MAGIC_PATTERN = b'PYZ\x00'

    def __init__(self, filename, start_offset=None, check_pymagic=False):
        self._filename = filename
        self._start_offset = start_offset
        self.toc = {}
        if start_offset is None:
            self._filename, self._start_offset = self._parse_offset_from_filename(filename)
        with open(self._filename, "rb") as fp:
            fp.seek(self._start_offset, os.SEEK_SET)
            magic = fp.read(len(self._PYZ_MAGIC_PATTERN))
            if magic != self._PYZ_MAGIC_PATTERN:
                raise ArchiveReadError("PYZ magic pattern mismatch!")
            pymagic = fp.read(len(PYTHON_MAGIC_NUMBER))
            if check_pymagic:
                if pymagic != PYTHON_MAGIC_NUMBER:
                    raise ArchiveReadError("Python magic pattern mismatch!")
            toc_offset, *_ = struct.unpack("!i", fp.read(4))
            fp.seek(self._start_offset + toc_offset, os.SEEK_SET)
            self.toc = dict(marshal.load(fp))

    @staticmethod
    def _parse_offset_from_filename(filename):
        """
        Parse the numeric offset from filename, stored as: `/path/to/file?offset`.
        """
        offset = 0
        idx = filename.rfind("?")
        if idx == -1:
            return (
             filename, offset)
        try:
            offset = int(filename[(idx + 1)[:None]])
            filename = filename[None[:idx]]
        except ValueError:
            pass
        else:
            return (
             filename, offset)

    def is_package(self, name):
        """
        Check if the given name refers to a package entry. Used by PyiFrozenImporter at runtime.
        """
        entry = self.toc.get(name)
        if entry is None:
            return False
        typecode, entry_offset, entry_length = entry
        return typecode in (PYZ_ITEM_PKG, PYZ_ITEM_NSPKG)

    def is_pep420_namespace_package(self, name):
        """
        Check if the given name refers to a namespace package entry. Used by PyiFrozenImporter at runtime.
        """
        entry = self.toc.get(name)
        if entry is None:
            return False
        typecode, entry_offset, entry_length = entry
        return typecode == PYZ_ITEM_NSPKG

    def extract(self, name, raw=False):
        """
        Extract data from entry with the given name.

        If the entry belongs to a module or a package, the data is loaded (unmarshaled) into code object. To retrieve
        raw data, set `raw` flag to True.
        """
        entry = self.toc.get(name)
        if entry is None:
            return
        typecode, entry_offset, entry_length = entry
        try:
            with open(self._filename, "rb") as fp:
                fp.seek(self._start_offset + entry_offset)
                obj = fp.read(entry_length)
        except FileNotFoundError:
            raise SystemExit(f"{self._filename} appears to have been moved or deleted since this application was launched. Continouation from this state is impossible. Exiting now.")
        else:
            try:
                obj = zlib.decompress(obj)
                if typecode in (PYZ_ITEM_MODULE, PYZ_ITEM_PKG, PYZ_ITEM_NSPKG):
                    if not raw:
                        obj = marshal.loads(obj)
            except EOFError as e:
                try:
                    raise ImportError(f"Failed to unmarshal PYZ entry {name!r}!") from e
                finally:
                    e = None
                    del e

            else:
                return obj
[/mw_shl_code]
[Python] 纯文本查看 复制代码
from pyarmor_runtime_000000 import __pyarmor__
__pyarmor__(__name__, __file__, b'PY000000\x00\x03\x08\x00U\r\r\n\x80\x00\x01\x00\x08\x00\x00\x00\x04\x00\x00\x00@\x00\x00\x00?\x05\x00\x00\x12\t\x04\x00\x8c\xab\xe0h\x8aY\xe4U\xb6\x1e,r\x98\t\xf3g\x00\x00\x00\x00\x00\x00\x00\x00\x9f\xd9\x0e\xdd(\x00;\xa8\x0b\xdbv\x8c\x04}\x81]>\xa5H2\xdfy\xab\xb4(\xd0S\xbfS}fc\xc3c3>\xcc*;cX\xf9s*\x15p\xda\r\xc8d<,\x826\xe0c\xc0`9\xb6\xc4&\tn\x18\xb8G\x147\xe4J\xaem\x19\xef\x05\xf1\xce$UN\xbdm\x9c\xd3|\xa2\x80\xf5z)7\x9d\xf3_\x18TE\xa2\xd7\xeb\xf6%W+\t\x05v\xf3pD\x07b\xcaIj\t\t\x18\xe7AV\xfa\xe8H\x06\x95Z~<\xa1\x95\xfb\x808\x18\xec\xc1|\x84#:\xc1\x9c\x92\xc8x\x87\x7f\x11A\x0e\x02ab,\x04\xcfeQ\x11\xd7w\x8b2\xc5\xd4*<l\xb7\x83\xaay\xd4\x8e\xac\x1e\x1b\xf1\xd1\xc3\xbbn\xc5\xf0B4\xdc]\x05c\x80Xo\xf4G\x18IOX\x83\xb4\xc1\xe6[c\r\x89\x86\x0e\xaa)Z\x0eGI\x01\x03\x8e\x9c4\xee10\xb0z)\x91(\xb8d\xf8J\x8b\xba\x0e\x01\xcb\xe7Q\x9d\xe4\x14~\xa5=m~\x145C\xd8\t\x0e\x05p\x1d\x9e\x9e\xf2F[l\x14\xddB\xf2\xf9:\xba\xe8\x93\xd3\x92\xbd\xdb\xfc\x04\x9ay\xb0$\xa4\xa2FL?^,\xcf.\xbb11\xc8\xb0\x86\x94d\xf8\x81\xb9\xd1\x1eE\xf4\xba\xaaN\xcfH\x81\xb0"^\xbah\xdc\xc3Z\xf8\x0f\xc2\xdf\xf3${\xd2\xc5\xb3\x01Y\xf6\xf4\x02\x06\xf83"Wk\xcc\x8c\xbc\xcf\x8ds\xd3Kd\x96\x17$\x98J\xd1\t\xfd\xb2\x1dXA\x16\xd7\xf8gH\xdc\xb4\xeeg\xc4M\xf7\xa8\xb5\xa7\xe4\xde\xbaO+\xcd\xae\xb8n\r\xaa\xaad{x\xdc4sV\xcb\x0e\xf1\xfd\xc3\xe7\xacLx\x8d\x0b~\xce\x14\xaa\x14\xdf_sn\x8e\x16\xa1@\r\x15\xdc\xdf\xf1o\xb0\xf9\x8e\xa52\x85E/\x84Mh<\xdb\xf3\x00\xb1t\rX\x86\x9ei\x0cL\xc8\x1f\xaf\xb4B\xac\xa0\xca\xd4\xb1\xb6\x89T\xeb\xd2\x11\xa9W\xe8P|\x98\x84\xa5Q}5\x1d\xa2,_\n[5pe\x1c\x10yk\xb2&O\xc4\x1f>\x0c\x91^J/\xeen\xaa\x91\xb9P]j\xca/\xc0l\xeb\xf2\x94\xe7\xbe\x91\xdb|\x15}\xd6>\xdaJ\x99g\xa0G\xbf\xcc\x17\xf944\xd3\xe24\xbb\xa5\xce\x1d\x88g\xff\x07w\xe6N\x07\x8c\xbc\xd5\x10\xc3x7\x8f,jv\x04\x93\xce\xec\xba\xeeB\xc2\xebW\x9e\xef\xf05\xd4q\xfa\xf5\xa3\xecv\xda\x9a\xa2uB\xf7lF\x14\x18\xbf\xf7\r\x9e\x8cc\xdeW\x9b\xcb\xef\xc0+X?!\xdf\x06\xc2mk\xfc\\$\xff\xbc\x81z\xc2\xfcQ}\xdfJM\xe7@\xb7\x9cX \xfbyD\xfa!\t-\xe7\xec\xc1\xd9\xe2\x01\xe9\xcb\xa3C\x92\xdf\xea65\xcc\x0e\x08\xfeg`\x04\xa5\xe8\x07\xc7\xa5\x1b]\xb5\xd8\xdfa\xfd\xe8\x97\x8c\xb5g\xe0\x9a\xd3\x9e]\x84\xf22\x8b!\xe8\x1e+\x8bK\xa9\xfc\xbfl\xc3\xd4S!\xe8\xe0p\x82\xe2zb0\xc7\xf5]\x92\xa6\xc6\x1d\xd8Sa\xebV\xf4\x12\x9e9\xc6\x98\x98\x81t\xc3\xa6\xeeE\xf6\xc1CEW\x1c\x12V\x19\xf7\xd6\xe9Q\xe7\xb2\xb1m\x93V3\x0cf\x07\xc0\x1ew\x0ej\xd0\xdaE\x7ff\xa3Bi\x8e\xae\x8c\'\xad\xba(IS\t\xad\x07y\x7f\x8d\xd3]\xa0\xe0$\xf3\x84d\r\xd1*g\xcf\x16\xb9\xc3\xb7\xfb\xf4\x88\xd0\xee\xf8\xa7fxe\xba\x8e\xa6\xfe\x12k\xd8\xedq!a\x16\xdfd#+\x87 \'\x1c\x90-\xec\x16+xu\x8b}\x12t\x16\x9f\xd0\xf9\xbbs=DN\xcf=U\xdd\x80\x1c\x13\xc9\xf8\x8e,\x1a\xb5\xd3\x11\xd7\xf4}\xb8Jh\x1d\x98\xe3i\xdcU\xfe\xfbx\xda\xbdF\xdc;\x0c\xf4XCK\x99\xa3,\xc9\xe1\x89y\n\xfc\x1f\xd5\x017+\xca\x94\xa8P\xe0\xa9\xe6)\xe6\xecd\x8f\x93\xaf\x0c:3\x1b\x11PL\x19\xa7\xb6\xf9\xd9` Fa\xcc\x86w\xe6\xae\x96\xef\xd0\x88\xb65\xc9\xc18\xc4*6Fk\x19\xe2\xceV\x7f\xe6~\xdf\x1at\xa2Q[\x07\xf9\x14\\\x8cRC\x19\x07\x1eJn~\xdc\xd1\xf1F\xa57E8\xa9\x1a\x9c\x91\x84\xca\x86\x9d\xf9\xd7\xfd\x1b/\xa9\xd9^C"\xb1\xc2\x94\xddW\xccd\'\x1c\x95\xca\x82\x7f\x14m\xb58\x938f\xf44\xf4CT\xd6J\x1bf+\xbc)\'\xd3\xb6KXq\xbc\xc2X\xc7\x9a^\xc8\x01F\x0f\x04\xb9>K_\x8ftX\x1c\xdf\x9a\xef\xdbF\xbb\x07;S\x94\x88\xb4\xc5\xa5}\xca\x08\x19\x997X\xd3X4\x1cNx\x00\xc12\xbaQ\x19+#\x1eA\x94\x016\xc1\xbc\x80\xaa\x0fhOz\xc0\n\xc0\x04 &\x07\xc7\xe6E\xaf\xca{\x96<\xbb@\x7f\xc1\x12\xa1s\x92Vg\xdc\xc3`} \xa1Ihd\xe5\x88\x95n\x08 6\x9dg\xfa\x82\x1bS\xae\xc8L\xc2t;\x01`\xf9\xb7\xd6\x02\xd8\x14\xb7\xed\xf0\xc2\xcc`\xa3H\xd7 `\xf3\xce\x04s\xff\xc5`\xf8BB#\x1a\x9d\xab\x002 \xbf\x1e\x87\xd23\x8d\xb5\xb3\xa0\x03>\x8a\x92\x16p\xe4\xfa\x95\x04\xacZ\x8f\x070\xb9>\xab\xca\x94x\xa9\xe9\x10P\x07\x98\x9a\xd8\xa6\x1e\xa8}&!E\x1eB5>C(\x05[4\x89Yk\xab\xdd\xdcx\x06\x15i&\xb5\xc9\x80\x18\xc4@ \xb4-\xdc\x00\xeb\xe4}\xbd`\x0b\xbaq\xd9H\x19k\x1a\xed\xc5\x1eBO\xbd\x83.\x86U\x04[o\'\x01\xa7\xb8Q)\x08\xfe\xbb\t\xa9u\xac\xd0\xc6\xb7\xba3\x1c]7\x11w\x89\xf7\xdf\x9e\x9e\xa9#\xb7cG9X\xf8')
 楼主| QwindF 发表于 2024-5-1 21:46
问问大家的意见,对gui的看法,是觉得gui更好还是命令行更好。
gui的话体积会大很多
48325619 发表于 2024-5-2 12:37
这次用的pyarmor免费版,还是不稳定的,考虑买个收费版吧
 楼主| QwindF 发表于 2024-5-2 12:39
48325619 发表于 2024-5-2 12:37
这次用的pyarmor免费版,还是不稳定的,考虑买个收费版吧

目前没有经济实力,以后再说吧(
具体是哪一方面不稳定呢
48325619 发表于 2024-5-2 12:40
QwindF 发表于 2024-5-2 12:39
目前没有经济实力,以后再说吧(
具体是哪一方面不稳定呢

免费版破解方法已经在github开源了
 楼主| QwindF 发表于 2024-5-2 12:50
48325619 发表于 2024-5-2 12:40
免费版破解方法已经在github开源了

看了相关的教程,发现国内并没有类似的思路。
github上的方法也没那么简单,而且里面不止PyArmor
希望各位能分享破解的过程
48325619 发表于 2024-5-2 12:57
QwindF 发表于 2024-5-2 12:50
看了相关的教程,发现国内并没有类似的思路。
github上的方法也没那么简单,而且里面不止PyArmor{:1_918 ...

一个压缩包而已,我已经解决了

本帖子中包含更多资源

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

x
 楼主| QwindF 发表于 2024-5-2 16:15
qq465881818 发表于 2024-5-2 15:54
import os, struct, marshal, zlib, _frozen_importlib
PYTHON_MAGIC_NUMBER = _frozen_importlib._boot ...

加油!希望能出keygen以及经验分享
qq465881818 发表于 2024-5-2 16:19
QwindF 发表于 2024-5-2 16:15
加油!希望能出keygen以及经验分享

不会py
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-11-24 11:06

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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