吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

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

[KeyGenMe] 有点难度的KeygenMe

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

本帖最后由 huoji120 于 2018-8-27 00:08 编辑

研究了一天没研究起来.现在头晕眼花的.拿给你们看看吧、

本帖子中包含更多资源

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

x

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
ban_op + 1 + 1 热心回复!

查看全部评分

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

AmIzero 发表于 2018-8-27 09:38
算法没时间看
0040111B         | EB 17                         | jmp give_a_try.401134                                                                        |
004011F5         | EB 12                         | jmp give_a_try.401209                                                                        |

免费评分

参与人数 1热心值 +1 收起 理由
liphily + 1 eb大法万岁

查看全部评分

xjun 发表于 2018-8-27 13:35
自己跑一下出 flag

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
//

#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <limits.h>
#include <random>

int main(int argc, char* argv[])
{
    int hash[42] = {
        0x63B25AF1, 0xC5659BA5, 0x4C7A3C33, 0x0E4E4267, 0xB611769B, 0x3DE6438C, 0x84DBA61F, 0xA97497E6,
        0x650F0FB3, 0x84EB507C, 0xD38CD24C, 0xE7B912E0, 0x7976CD4F, 0x84100010, 0x7FD66745, 0x711D4DBF,
        0x5402A7E5, 0xA3334351, 0x1EE41BF8, 0x22822EBE, 0xDF5CEE48, 0xA8180D59, 0x1576DEDC, 0xF0D62B3B,
        0x32AC1F6E, 0x9364A640, 0xC282DD35, 0x14C5FC2E, 0xA765E438, 0x7FCF345A, 0x59032BAD, 0x9A5600BE,
        0x5F472DC5, 0x5DDE0D84, 0x8DF94ED5, 0xBDF826A6, 0x515A737A, 0x4248589E, 0x38A96C20, 0xCC7F61D9,
        0x2638C417, 0xD9BEB996
    };

    //
    //先算出第一个 rand 值
    //

    unsigned int i = 1;
    unsigned int result;
    while (i < UINT_MAX)
    {
        __asm{
            mov eax, i //rand 
                mov ecx, 66h //'f'

                mul     ecx
                mov     ecx, 0xFAC96621
                push    eax
                xor     edx, edx
                div     ecx
                pop     eax
                push    edx
                mul     eax
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                mul     edx
                div     ecx
                mov     eax, edx
                pop     edx
                mul     edx
                div     ecx

                mov result, edx;
        }
        if (result == hash[0])
        {
            printf("first rand = %x\n", i);
            break;
        }

        i++;
    }

    //
    //反推算出 srand值
    //
    for (unsigned int i = 1; i < UINT_MAX; i++)
    {
        int random = 0x31333359 + i; //此值固定  nt函数returnlen,xor常量 ,xor OEP第一个字节
        srand(random);
        if (rand() == 0x4077) // first rand
        {
            printf("srand = %x   strHexCount = %x\n", random, i);
            break;
        }
    }

    //
    //得出flags
    //
    srand(0x31333d38);
    int randnum;
    for (int i = 0; i < 42; i++)
    {
        randnum = rand();
        for (char c = 1; c <= 0xff; c++)
        {
            __asm{
                mov eax, randnum //rand 
                    xor ecx, ecx
                    movzx ecx, c //'f'

                    mul     ecx
                    mov     ecx, 0xFAC96621
                    push    eax
                    xor     edx, edx
                    div     ecx
                    pop     eax
                    push    edx
                    mul     eax
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    mul     edx
                    div     ecx
                    mov     eax, edx
                    pop     edx
                    mul     edx
                    div     ecx

                    mov result, edx;
            }

            if (result == hash[i])
            {
                printf("%c", c);
                break;
            }
        }
    }

    getchar();
    return 0;
}

点评

思路很棒,但是在反推srand的seed时,i的上界限制到0xFF*0x2A足以  发表于 2018-8-27 18:04

免费评分

参与人数 2吾爱币 +3 热心值 +2 收起 理由
DCO + 1 + 1 膜拜俊师傅
Pizza + 2 + 1 前排膜拜小俊师傅

查看全部评分

BsofHimmeltest 发表于 2018-8-27 03:56
研究一下,没甚麽想法 只能知道记忆体内的位置 但抓不出来比较值
004011E6 之後开始比较 Incorrect 在 004011FB Congrats在 0040120B
头像被屏蔽
sstm 发表于 2018-8-27 08:28
提示: 作者被禁止或删除 内容自动屏蔽
DCO 发表于 2018-8-27 11:50
这是一道求解方程的数学题。。。。。
rurg 发表于 2018-8-27 12:31
哪弄来的东西?感觉就是个坑。先读取输入框中字符串长度,然而字符串最大只能接受41个,要想正确通过得42个字符串,因此不爆破应该是没法成功的吧,感觉是个坑

本帖子中包含更多资源

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

x
xjun 发表于 2018-8-27 14:27
xjun 发表于 2018-8-27 13:35
自己跑一下出 flag

[md]```

@Pizza 是这题的作者,就是网顶杯 第二轮的 Reverse 块

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
凉游浅笔深画眉 + 1 + 1 自己人玩自己人啊

查看全部评分

skywilling 发表于 2018-8-27 18:01
这道题目是汇编编译的,可见出题人汇编掌握的熟练程度之高。这道题目使用了两个微软未公布的反调试api:
[Asm] 纯文本查看 复制代码
00402091    E8 A0F2FFFF     call <jmp.&ntdll.NtSetInformationThread>

004020BF    E8 6CF2FFFF     call <jmp.&ntdll.NtQueryInformationProcess>

可见出题人对反调试方法的了解之多
根据题目的提示输入的格式是
[Asm] 纯文本查看 复制代码
flag{.................}

长度是42,未知数据长度是36
本题目使用了srand在固定seed下产生相同随机数列的特点,以保证flag是唯一存在的
yubin 发表于 2018-8-27 20:26
感谢分享

免费评分

参与人数 1违规 +1 收起 理由
A-new + 1 请勿灌水,提高回帖质量是每位会员应尽的义务!

查看全部评分

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

本版积分规则

返回列表

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

GMT+8, 2024-11-24 15:40

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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