作者:selph

目录:

• 011-wocy.11

• 012-ACG-crcme12

• 013–Acid_burn3

• 014-Splish4

• 015-BradSoblesky.15

• 016-fly_crkme36

• 017-Cabeca7

• 018-crackme_00068

• 019-Acid_Byte.39

• 020-cosh.310

016-020请看下期

  1.  011-wocy.1算法难度:⭐爆破难度:⭐
    

信息收集

运行情况:

查壳与脱壳:
MFC程序,无壳

查字符串:
提示字符串:Registed

调试分析
老样子,从关键提示字符串入手,交叉引用查校验函数

这里函数里不知道这个[esi+60h]和[esi+64h],通过动态调试执行可知,这里是分别获取的用户名和ID号,然后验证逻辑就很简单了,用户名和ID号需要是倒序的即可

结果:

  1.  012-ACG-crcme1算法难度:⭐⭐爆破难度:⭐
    

信息收集
运行情况:

查壳与脱壳:
无壳

查字符串:
有很多看不懂的提示语,还有个文件名

调试分析
抄起IDA直接干,用户函数就3个,这么简洁这应该是纯汇编写的程序吧(猜的),从start开始分析

首先打开一个文件,读取其中的内容,该内容应该长度是12字节:

然后就像下面这样,对12个字节的每个字节进行一个运算,逐一校验结果

然后接下来就是,如果验证全部通过,就弹窗提示ok,否则就直接启动窗口

        暴力破解

把所有判断跳转都nop掉即可

        算法分析

序列号运算的核心是异或,异或是可逆的,所以可以反着把序列号生成出来:

 #include

int main()
{
int arr[12] = { 0x168,0x160,0x170,0xec,0x13c,0x1cc,0x1f8,0xec,0x164,0x1f8,0x1a0,0x1bc };
int serial[12] = { 0 };
for (int i = 0; i < 12; i++)
{
serial[i] ^= arr[i];
serial[i] >>= 2;
serial[i] = serial[i]&0x000000FF ^ 0x1b;
}
for(char var : serial)
{
printf(“%c”,var);
}
}

计算结果是:ACG The Best

执行结果:

总结
很简单无脑的一次算法分析

  1.  013--Acid_burn算法难度:⭐⭐爆破难度:⭐
    

信息收集
原160个CM的第一个,以前做过一遍,老费劲了,现在再来一遍看看

暴力破解已经懒得介绍了,看得懂完整分析也肯定知道该改哪里了

运行情况:
启动的时候有Nag:

提供了两种注册方法:用户名+序列号,序列号

查壳与脱壳:
无壳:Delphi程序

 调试分析
分析Delph GUI程序借助IDR辅助方便查看窗口事件(纯IDA分析的话,查字符串交叉引用定位也能找到这些函数)

首先是启动窗口:窗口启动的时候调用FromCreate函数里,执行流MessageBox,这就是所谓的NAG,烦人弹窗

然后是序列号验证:

接下来是用户名+序列号验证:

首先对用户名4个字节进行一顿处理,然后把值保存起来,用户名必须大于等于4个字符

这里开头往[431750]赋了个初始值:0x29

接下来计算序列号,然后跟用户输入比对

去除NAG
去除Nag只需要修改该函数直接返回即可:

算法分析
序列号验证:硬编码验证,输入Hello Dude!即可

用户名+序列号验证,序列号可以写出注册机:

 #include

int main()
{
int res = 0x29;
char name[20] = {0};

std::cin >> name;
res = name[0] * res * 2;std::cout <<"CW"<<"-" << res << "-" <<"CRACKED";

}

总结
以前做半天,现在分析起来很快啊,对于特定语言的逆向,如果能有对应的工具帮助识别函数功能,那简直是帮大忙了

PS:用户名+序列号验证这里先校验了用户名长度,校验的时候计算了一堆中间值,真的一点用没有!!!

  1.  014-Splish算法难度:⭐⭐爆破难度:⭐
    

信息收集
运行情况:
开始有个启动屏幕,然后进入程序主界面

按照说明,目标是禁用启动屏幕,完成硬编码校验,写用户名序列号注册机

查壳与脱壳:

无壳:

调试分析
用户函数比较少,直接从起点硬刚:

这个call应该就是程序的入口了

这个call里面就进入窗口消息循环了,在那之前调用了几个用户函数:

有一个是对参数进行处理的,有一个call的参数是实例句柄,很可疑,进入查看

这里头是创建了一个窗口,然后延时关闭,要去除NAG,直接把这个函数处理了就好:

然后找到一个函数貌似是消息处理函数:这里根据参数的Msg号进行跳转执行

往下找,发现硬编码check分支:将用户输入和硬编码:HardCoded进行比对,一致了跳转

一致了跳转的最终位置是,说明这里硬编码已经找到了:

接下来找找用户名序列号验证:

验证会进行三次计算,首先是计算用户名得到一个结果:

然后计算序列号得到一个结果:

最后将两个运算结果进行比对:

算法分析
拿用户名计算一个结果,跟序列号计算一个结果进行比对的验证逻辑,写注册机的话则是先用用户名计算一个结果,然后用这个结果反推序列号

 #include

int main()
{
const char* num = “2345678901”;
char serial[20] = { 0 };
char name[20] = { 0 };
char name_res[20] = { 0 };
int len = 0;

std::cin >> name;
len = strlen(name);
//std::cin >> serial;for (int i = 0; i < len; i++)
{name_res[i] = name[i] % 0xA;name_res[i] ^= i;name_res[i] += 2;if (name_res[i] > 0xA)name_res[i] -= 0xA;
}//for (int i = 0; i < len; i++)
//{
//  serial_res[i] = serial[i] % 0xA;
//}for (int i = 0; i < len; i++)
{serial[i] = num[name_res[i]];
}std::cout << serial << std::endl;

}

       结果:

总结
算是个编写注册机的练习,这个cm中练习了汇编转C的操作

  1.  015-BradSoblesky.1算法难度:⭐爆破难度:⭐
    

信息收集
运行情况:
序列号验证:

查壳与脱壳:
MFC程序,无壳:

查字符串:
存在提示信息:

调试分析
硬编码字符串和用户输入字符串比对,没啥好说的

结果:

新160个CrackMe分析-第2组:11-20(上)相关推荐

  1. 群组密钥交换的新方法研究与分析【会议】

    群组密钥交换的新方法研究与分析 写在前面的话 会议记录 写在前面的话 <网络空间安全青年科学家长安论坛>,本篇博客为南京信息工程大学沈剑老师的报告内容. 会议记录

  2. Crackme006 - 全新160个CrackMe学习系列(图文|视频|注册机源码)

    知乎:逆向驿站 原文链接 CrackMe006 | 难度适中适合练手 |160个CrackMe深度解析(图文+视频+注册机源码) crackme006,依然是delphi的,而且没壳子,条线比较清晰, ...

  3. 视频+图文+注册+机源码 | 160个CrackMe深度解析合集 | 逆向破解入门

    全部合集的获取请关注微信公众号:逆向驿站 回复:160 即可获得其余合集 以下是示例文章 160个CrackMe深度解析合集-001 提倡"刨根问底",拒绝"浅尝辄止&q ...

  4. Crackme006 - 全新160个CrackMe深度解析系列(图文+视频+注册机源码)

    原文链接 CrackMe006 | 难度适中适合练手 |160个CrackMe深度解析(图文+视频+注册机源码) crackme006,依然是delphi的,而且没壳子,条线比较清晰,算法也不难,非常 ...

  5. [反汇编练习] 160个CrackMe之024

    [反汇编练习] 160个CrackMe之024. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  6. [反汇编练习] 160个CrackMe之023

    [反汇编练习] 160个CrackMe之023. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. [反汇编练习] 160个CrackMe之021

    [反汇编练习] 160个CrackMe之021. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  8. 160个crackme 持续更新(1\2\3\4\6\8\9)

    最近感觉自己啥都不会吧,就算会也就是点皮毛,还是练的太少了,从160个crackme开始 慢慢来吧,从简单的开始 1.Acid burn OD动态调试一下,靠字符串定位打断点,如下 跟进这个函数可以看 ...

  9. 160个CrackMe之108 mfc程序 寻找按钮事件,代码还原(上)

    ·前言  虽然网上已经有帖子写160个CrackMe,我个人还是以正向的思路来逆向一部分的crackme,还有一些 代码还原的小技巧,挑选出这160个CrackMe中由c,c++,汇编编写的程序来来写 ...

最新文章

  1. Python 赋值运算符
  2. [国家集训队]航班安排
  3. Java学习之移动文件(转)
  4. 模板使用自定义类型_「Shopify模板」Shopify模板编辑Shopify模板代码更改教程
  5. Nginx代理功能与负载均衡详解
  6. CNN提取文本特征,融合PMF模型实现推荐系统
  7. exit()与_exit()函数的区别(Linux系统中)
  8. java testwhileidle,springboot使用druid时报错:testWhileIdle is true, validationQuery not set
  9. jQuery动画stop()用法
  10. linux 下部署tomcat问题
  11. 使用 Kind 在 5 分钟内快速部署一个 Kubernetes 高可用集群
  12. Maximum Clique最大团问题
  13. 怎么把PWM信号转为模拟量
  14. ila、dbg_hub、jatg时钟关系
  15. Excel怎样从一串字符中的某个指定“字符”前后截取字符及截取字符串常用函数
  16. 张江陵怎么从机械到计算机的,2014湖北省大学研究生院排行出炉 武汉大学居榜首...
  17. gradle引入本地jar
  18. 8139d网卡工作原理 [不断更新]
  19. sv中virtual的使用(function/task部分)
  20. 王德学:关停小煤矿难度超乎想象

热门文章

  1. Kratos 集成Gin
  2. 新钉钉,又对「协同」下了手
  3. 推荐:这才是你寻寻觅觅想要的 Python 可视化神器
  4. 牙齿白白的,笑容甜甜的
  5. VB编程:Val字符串转数字,CStr数字转字符串-6
  6. Android 适配问题分享和总结
  7. A*算法之在U3d下实现简单的自动寻路
  8. 【MySQL系列】 MySQL表的增删改查(进阶)
  9. 多级分销系统数据库模型(猜想)
  10. 迁移废弃的Kotlin Android Extensions插件