吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 614|回复: 1
收起左侧

[CrackMe] zig+ollvm跨平台编译的crackme

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

crackme说明

程序为zig编写,固定注册码。难度主要有

  1. 字符串通过comptime(编译时计算)全部加密
  2. 通过llvm启动以下功能的pass
    1. ibr:间接分支
    2. icall:间接调用 (call 寄存器)
    3. igv:间接全局变量
    4. junk:花之令
    5. split:基本块分割
    6. sub:指令替换(add/and/sub/or/xor)

跨平台

zig支持交叉编译,大家根据自己电脑自行选择,见附件crackme.zip

windows

crackme-x86_64-windows-gnu.exe
crackme-aarch64-windows-gnu.exe
crackme-x86-windows-gnu.exe

linux

crackme-aarch64-linux-gnu
crackme-x86_64-linux-gnu
crackme-x86-linux-gnu

macos

crackme-aarch64-macos-none
crackme-x86_64-macos-none

源码

见附件src.zip,注册码为解压密码




本帖子中包含更多资源

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

x

免费评分

参与人数 1热心值 +1 收起 理由
msdishiu1050 + 1 我很赞同!

查看全部评分

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

 楼主| HOWMP 发表于 2024-9-30 11:43
公布答案

[C] 纯文本查看 复制代码
const std = @import("std");
const os = std.os;
const posix = std.posix;
const key = @import("option").key;
const string = []const u8;

fn encrypt(comptime str: string) [str.len]u8 {
    comptime var enstr: [str.len]u8 = undefined;
    @setEvalBranchQuota(1024 * 1024);
    for (0..str.len) |i| {
        enstr[i] = str[i] ^ key[i % key.len];
    }

    return enstr;
}

inline fn x(comptime str: string) []u8 {
    comptime var e = encrypt(str);
    var buf = (&e).*;
    for (0..buf.len) |i| {
        buf[i] ^= key[i % key.len];
    }
    return buf[0..str.len];
}

inline fn println(str: string) void {
    const writer = std.io.getStdOut().writer();
    _ = writer.write(str) catch unreachable;
    writer.writeByte('\n') catch unreachable;
}

pub fn main() void {
    const reader = std.io.getStdIn().reader();
    println(x("input your flag"));
    var buf: [32]u8 = std.mem.zeroes([32]u8);
    const line = reader.readUntilDelimiter(&buf, '\n') catch {
        println(x("input error 1"));
        return;
    };
    if (line.len != 17) {
        println(x("input error 2"));
        return;
    }

    if (!std.mem.eql(u8, line[0..16], x("d9Be6f0e833709fe"))) {
        println(x("input error 3"));
        return;
    }
    println(x("input ok"));
}
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

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

GMT+8, 2024-10-31 16:23

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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