吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1236|回复: 3
收起左侧

[CrackMe] 来自Keymaker中的cm例子

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

最近是技术退步了还是技术退步了,竟分析了一天毫无头绪
好在是ASM编写的,正在努力暴力分析
拿上来网友试试

本帖子中包含更多资源

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

x

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
tomhex + 1 + 1 谢谢@Thanks!

查看全部评分

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

 楼主| JuncoJet 发表于 2024-6-13 09:17
本帖最后由 JuncoJet 于 2024-6-13 09:20 编辑

研究出来了
因为是ASM写的CM所以代码全是汇编指令
没有什么特征,而且指令用的比较冷门
比如求字符串长度,还有比较字符串的代码

免费评分

参与人数 1吾爱币 +1 热心值 +1 收起 理由
610100 + 1 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

zunmx 发表于 2024-6-17 17:11
暴力破解:

本帖子中包含更多资源

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

x

免费评分

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

查看全部评分

爱飞的猫 发表于 2024-6-30 00:15

401A46 是主要窗口事件处理函数,其中:

处理 WM_INITDIALOG 时,为机器码控件注册了个自己的事件处理函数:

    gControlHwnd = GetDlgItem(hWnd, 101);       // gControlHwnd = 机器码控件句柄
    unknown = j_SetWindowLongA(gControlHwnd, GWL_WNDPROC, (LONG)sub_401EBA);
    j_SetWindowLongA(gControlHwnd, GWL_USERDATA, unknown);

当处理的窗口事件为 WM_COMMAND (按下按钮)时,利用 PostMessageA 通知机器码控件的事件处理函数进行序列号验证处理:

      if ( lParam )
      {
        if ( lParam >= 0xB )
          PostMessageA(gControlHwnd, 1123u, 1u, lParam); // 第一次进入
        else
          MessageBoxA(hWnd, "错误的注册码!请确认你输入的大小写是否正确。", 0, 0x10u);
      }
      else
      {
        MessageBoxA(hWnd, "注册成功!谢谢你的注册。", "完成", 0);
      }

lParam 存储按钮控件句柄,永不为 0

继续到 401EBA 分析 1123 号事件即可:

        SendMessageA(gCodeFieldHandle, WM_GETTEXT, 100u, (LPARAM)code);
        SendMessageA(hWnd_machine_code, WM_GETTEXT, 260u, (LPARAM)machine_code);
        b64_decode(code, decoded);
        len = strlen(machine_code) + 1;
        v7 = machine_code;
        v8 = decoded;
        do
        {
          if ( !len )
            break;
          v9 = *v7++ == *(_BYTE *)v8;
          v8 = (int *)((char *)v8 + 1);
          --len;
        }
        while ( v9 );
        PostMessageA(gMainWndHandle, WM_COMMAND, 1u, len);

004023B8 看起来就是个标准的 base64 解密过程,然后将机器码与序列号解码后的内容进行比对。

相同则 len = 0,否则 len = 其他值


Python 做的注册机:

import base64

def keygen(machine_code: str) -> str:
  return base64.b64encode(machine_code.encode()).decode().rstrip('=')

# machine_code: 123456789
# serial      : MTIzNDU2Nzg5

免费评分

参与人数 2吾爱币 +4 热心值 +2 收起 理由
JuncoJet + 3 + 1 热心回复!
你好,再见 + 1 + 1 你好厉害呀,分析得这么清楚

查看全部评分

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

本版积分规则

返回列表

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

GMT+8, 2024-12-22 12:14

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

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