前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >新160个CrackMe分析-第4组:31-40(上)

新160个CrackMe分析-第4组:31-40(上)

原创
作者头像
极安御信安全研究院
发布2022-09-23 21:04:07
3540
发布2022-09-23 21:04:07
举报
文章被收录于专栏:极安御信安全研究院

 作者:selph

目录:

031-Cruehead.11

032-Bengaly-Crackme22

​• 033-dccrackme13

034-fireworx54

035-Dope211225

036-Andrnalin.26

037-fireworx27

038-Eternal Bliss.38

039-eKH19

040-DaNiEI-RJ110

1. 031-Cruehead.1

算法难度:⭐⭐⭐

爆破难度:⭐

信息收集

运行情况:

查壳与脱壳:

无壳:

调试分析

字符串提示信息:

直接从字符串提示信息找到验证点

这是一个自写的弹窗函数还....,继续向上交叉引用

到了上一层:看到的是个窗口过程函数,这里在比对消息码,这里弹窗往上有个DialogBoxParamA的调用,应该就是创建Register对话框的函数,所以跟进这里的窗口过程

跟进之后,可以看到这有两个明显的函数调用获取用户输入,分别保存在了两个全局变量里,然后就关闭窗口了,接下来还得从刚刚创建窗口的地方往下看

往下看就是使用获取的NameSerial进行一个函数调用,然后用调用结果比对,选择是否弹窗成功

接下来看Name的校验计算:

首先是判断字符的合法性,必须是字母,如果是小写字母则转变成大写字母

然后累加每个字母的值,和5678h进行异或,得到用户名的校验值

接下来是序列号的校验:

循环遍历每一个字符,序列号如果说是纯数字,那么减去0x30就相当于是把字符数字变成整数类型的数字,然后每次操作一个数字累加到edi之前就先乘以一次10,那么这个逻辑就相当于是字符串转整型的操作

然后进行一个异或1234h,返回校验值

最后比较这两个校验值,相同则弹窗成功:

注册机

注册码生成算法:

#define _CRT_SECURE_NO_WARNINGS #include int main() {     char name[100] = { 0 };     char serial[100] = { 0 };     int name_check = 0;     std::cin >> name;     for (int i = 0; name[i]; i++) {         if (name[i] > 'Z')name[i] -= 0x20;         name_check += name[i];     }     name_check ^= 0x5678;     name_check ^= 0x1234;     sprintf(serial, "%d", name_check);     std::cout << serial << std::endl; }

结果:

2. 032-Bengaly-Crackme2

算法难度:⭐⭐

爆破难度:⭐

信息收集

运行情况:

没有任何label,就2个框框输入和check

查壳与脱壳:

UPX壳,ESP定律即可

调试分析

是个手写窗口过程的程序,从头到尾跟进,这里就是调用自写函数

跟进以后,很明显的看到了窗口过程函数:

直接跟进到窗口过程里:发现,验证弹窗的过程正好就写在这里:

刚开始是先获取用户输入:

获取完成输入之后,对用户名进行一个处理,然后对序列号进行一个处理,就进行对比,如果相同,则跳转

用户名处理过程:

a. 取一个字节

b. 求平方,结果加到esi

c. 右移这个字节1位,结果加到esi

d. esi减去这个字节

e. 然后循环处理每一个字节,最终结果在esi

对于序列号的处理,这个call实际上就是_atoi函数(已经不止一次逆这个函数了......

直接就是反着操作一波,就可以还原序列号了

注册机

注册码生成算法:

#define _CRT_SECURE_NO_WARNINGS #include int main() {     char name[100] = { 0 };     char serial[100] = { 0 };     int len = 0;     int check = 0;     std::cin >> name;     len = strlen(name);     for (int i = 0; name[i]; i++)     {         char tmp = name[i];         check += tmp * tmp;         check += tmp >> 1;         check -= tmp;     }     _itoa(check, serial, 10);     std::cout << serial << std::endl;     return 0; }

结果:

3. 033-dccrackme1

算法难度:⭐⭐

爆破难度:⭐

信息收集

运行情况:

打开是一个弹窗:

然后才显示窗口

查壳与脱壳:

无壳:

调试分析

Delphi程序,Check按钮逻辑:

获取Name,计算一个值,转字符串,和Serial比对

注册机

注册码生成算法:

#define _CRT_SECURE_NO_WARNINGS #include int main() {     char name[100] = { 0 };     char serial[100] = { 0 };     int len = 0;     int check = 0;     std::cin >> name;     len = strlen(name);     for (int i = 0; name[i]; i++)     {         char tmp = name[i];         check += (tmp - 0x17) * (tmp - 0x11);     }     _itoa(check,serial,10);     std::cout << serial; }

效果:

4. 034-fireworx5

算法难度:⭐

爆破难度:⭐

信息收集

运行情况:

只有一个输入框,没有check按钮

查壳与脱壳:

无壳,那个年代Borland Delphi程序很主流啊

调试分析

硬编码比对验证,硬编码的值是Label的值

效果:

5. 035-Dope21122

算法难度:⭐⭐

爆破难度:⭐⭐⭐⭐(入口点难找)

信息收集

运行情况:

查壳与脱壳:

无壳

调试分析

这是个delphi程序,但是用DDIDR都不能分析出来内容,然后看视频得知使用PE.Explorer程序可以辅助分析,吾爱爱盘可以下载到

首先查看RC资源:发现这个按钮标题和事件

接下来点击反汇编查看VCL方法,找到这个事件:

分析这个地址:0x421DC8,由于这是个Delphi程序,里面会存在各种乱七八糟的函数调用,固本次分析采用动态静态结合的方式进行,这里关于出现的call的功能是通过x86dbg运行得知的,为了方便展示,这里依然是使用IDA的截图:

刚开始是获取输入的Name和Serial,Name长度需要大于等于4

接下来是对Name的处理:

遍历字符串每次取一个字节,左移9位,然后累加到ebx

验证环节依然是对比:

将刚刚计算的累加值变成字符串,然后对比输入的序列号,对比不相同则弹窗失败

注册机

注册码生成算法:

#define _CRT_SECURE_NO_WARNINGS #include int main() {     char name[100] = { 0 };     char serial[100] = { 0 };     int len = 0;     int check = 0x37;     std::cin >> name;     len = strlen(name);     for (int i = 0; name[i]; i++)         check += (name[i] << 9);     _itoa(check, serial, 10);     std::cout << serial << std::endl; }

效果:

参考资料

[1] 新160个CrackMe算法分析-035-Dope2112.2_哔哩哔哩_bilibili

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 031-Cruehead.1
    • 信息收集
      • 运行情况:
      • 查壳与脱壳:
    • 调试分析
      • 注册机
  • 2. 032-Bengaly-Crackme2
    • 信息收集
      • 运行情况:
      • 查壳与脱壳:
    • 调试分析
      • 注册机
  • 3. 033-dccrackme1
    • 信息收集
      • 运行情况:
      • 查壳与脱壳:
    • 调试分析
      • 注册机
  • 4. 034-fireworx5
    • 信息收集
      • 运行情况:
      • 查壳与脱壳:
    • 调试分析
    • 5. 035-Dope21122
      • 信息收集
        • 运行情况:
        • 查壳与脱壳:
      • 调试分析
        • 注册机
      • 参考资料
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档