003-Cruehead-CrackMeV3
第二个需要写注册机
首先查看文件,打开文件,什么也没有,help ->about,弹出下面的弹窗

看来是没有什么线索,直接放进OD里面

这里有一个函数CreatFileA,这个函数目的是访问一个文件,如果文件不存在返回值为-1
HANDLE CreateFile(
LPCTSTR lpFileName, //指向文件名的指针
DWORD dwDesiredAccess, //访问模式(写/读)
DWORD dwShareMode, //共享模式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针
DWORD dwCreationDisposition, //如何创建
DWORD dwFlagsAndAttributes, //文件属性
HANDLE hTemplateFile //用于复制文件句柄
);
跟下去看,可以看到函数执行完成后会返回一个-1到eax,下一条指令cmp捕获到后让ZF位变成0,后面的jnz指令就没办法跳转了

如果没有这个文件的话就没有办法继续下去了,所以我们在同目录下新建一个同名称文件(CRACKME3.KEY),而且在里面写入字符串,重新开始调试


重新调试后就不会返回-1了

继续,接下来又调用了一个ReadFile函数把文件里面的字符串放进寄存器ebx和内存空间里面

而且可以看到,这个函数到这里只截取了到r的字符,也就是说前18个截取到了,后面8个暂时没有管
继续往下,有一个陌生的call,由于不清楚这个call的用处,所以f7跟进

前面两个xor清空寄存器,之后把push进来的参数,也就是18个字符给esi,然后给bl数值41,之后就是一串循环

循环是根据cl的大小来判断的,循环内部有bl的自加算法,如果bl里面的数等于4f就会跳出循环,之前给bl的数是41,也就是说这个循环会执行4f-41=14次
看一下这个代码,首先以字节的大小把刚才esi里面传入的字符给到al,然后将bl里面的数和al里面的数进行异或,异或完了之后再将它传给esi。
我们来看第一次异或后得到的结果,第一次是a的ascall码和41异或

得到了0x20,然后我们再搜索0x20的ascall码的含义

在键盘上是space,以字符的形式显示就是空格
b的ascall码和0x42(每次循环bl自加1)异或得到的结果也是0x20,所以前十四个字符在循环过后都显示为空格。

再看另外一个指令

这个是把前14个字符的ascall码加到0x4020f9这个地址上,原本地址里面数字是00,加上14次之后就变成了0x01c0这个十六进制数

那这个循环就没有什么其他含义了,往下走

可以看见刚出call后,刚才的4020f9这个地址就和12345678进行了一次异或,异或完了之后这个地址里面的数变成了123457b8,之后又进了一个call

这个call也是不清楚什么含义,f7进去看看之后发现是给esi赋值opqr,然后把123457b8(即所有输入进去字符中的前14个字符的ascall码的和异或上0x12345678之后得到的数)和opqr进行比较,如果相同就进行跳转。

而跳转是跳转到了破解成功的弹窗上,那么我们就明白了key文件里面的后4位字符和前面的14位字符的关系,后4位字符就是前面14位字符的ascall码和异或上0x12345678得到的
理清了思路,我们就可以写注册机制作key文件破解程序了
下面是注册机的脚本
username = input("please input your username:").center(14)
if len(username) > 14:
print("error,please input number less 14")
exit(0)
#先用username和0x41开始异或
tem_ = 0
xor_use = []
sum = 0
for i in range(len(username)):
tem = ord("A") + i
xor_use.append(tem ^ ord(username[i]))
#还有连加异或后得到的结果
sum += ord(username[i])
key = sum ^ 0x12345678
key_bytes = bytes(key.to_bytes(4,byteorder='little'))
with open('CRACKME3.KEY',"wb+") as f:
#把前十四个加密后的字符输入进去,然后把后四位需要进行比较的字符也输入进去,即可搞定key文件注册
f.write(bytes(xor_use))
f.write(bytes(key_bytes))
print("it is ok!")
当然,这个程序也能破解,不过破解难度会比较大,有时间的话会更新

003-Cruehead-CrackMeV3的更多相关文章
- 《zw版·Halcon-delphi系列原创教程》 Halcon分类函数003·contour,轮廓处理
<zw版·Halcon-delphi系列原创教程> Halcon分类函数003·contour,轮廓处理 为方便阅读,在不影响说明的前提下,笔者对函数进行了简化: :: 用符号“**”,替 ...
- php大力力 [003节]php在百度文库的几个基础教程mac环境下文本编辑工具
2015-08-22 php大力力003.mac环境下文本编辑工具 在windows下,使用notepad特别多.在mac下使用“备忘录”app,word,反而没有存储过txt后缀等不同文本. mac ...
- 【面试题003】c数组做为参数退化的问题,二维数组中的查找
[面试题003]c数组做为参数退化的问题,二维数组中的查找 一,c数组做为参数退化的问题 1.c/c++没有记录数组的大小,因此用指针访问数组中的元素的时候,我们要确保没有超过数组的边界, 通过下面 ...
- [反汇编练习] 160个CrackMe之003
[反汇编练习] 160个CrackMe之003. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...
- java 复习003 之排序篇
由java 复习003跳转过来的C语言实现版见some-sort-algorithms 快速排序(不稳定 O(n log n)) package vell.bibi.sort_algorithms; ...
- Genymotion模拟器一滑动页面就跳到搜索003
今天郁闷的要死,好不容易让Appium关联起Genymotion了,但是一滑动屏幕就跳转到搜索003界面,当时还以为是Appium的Bug或者Genymotion本身出问题了. 结果网上搜了一段时间( ...
- python----特性003
python特性003:计算特性 #!/usr/local/bin/python3.5 class MyNumber(object): def __init__(self,number): self. ...
- [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面
cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...
- 2017-2018-1 1623 bug终结者 冲刺003
bug终结者 冲刺003 by 王旌含 今日任务:优化界面布局,提供图片素材 需求 app图标.主界面图.主界面中按钮图:选择关卡图.关卡按键图:游戏中的小人.箱子.地板.墙.目的地:方向按钮:重置按 ...
- 『练手』003 Laura.SqlForever如何扩展 兼容更多数据库引擎
003 Laura.SqlForever如何扩展 兼容更多数据库引擎 数据库引擎插件 在 界面上的体现 导航窗体 的 工具栏 中的 引擎下拉列表 导航窗体 的 树形控件 中的 引擎主节 ...
随机推荐
- 训练题——OLED部分
训练题OLED部分 实现目标 通过IIC通信控制OLED屏幕显示出一串字符串 名词介绍 OLED屏: OLED(Organic Light-Emitting Diode),又称为有机电激光显示.有机发 ...
- Mac版SecureCRT修改配色方案
SecureCRT是一个非常好用的远程连接工具,其可以配置特定关键词的颜色来使配置调试时更显目的辨别关键内容.网络上关于SecureCRT windows版本如何配置高亮配色的教程很多,但是关于Mac ...
- python批量导出、安装依赖库文件
导出: 在原环境中 pip freeze > fname.txt 安装: 在新环境中 pip install -r fname.txt 其中fname.txt 可以随意命名,其存储安装库文件列 ...
- Windows+svn +Jenkins+发布NetCore/VUE项目
1. NetCore环境下载,注意是下载SDK,不是Runtime:https://dotnet.microsoft.com/download/dotnet-core?utm_source=getdo ...
- Monkey 用户指南(译)
原址:https://developer.android.com/studio/test/monkey.html 帮助:google翻译:https://translate.google.cn/ 自己 ...
- python 创建虚拟环境python –m venv方式
1.环境准备 1.1.刷新包清单 sudo yum update 1.2.安装SCL实用程序 sudo yum install centos-release-scl 1.3.安装Python 3.6 ...
- 20220718 第七组 陈美娜 java
如果把变量直接声明在类里:成员变量(全局变量)成员变量->属性 如果把变量声明在某个方法里:局部变量 public:访问权限修饰符,后面讲 void:没有返回值 run():方法名,标识符 {} ...
- Lua元表应用举例:配置表格转为Lua配置表
把配置表格.xlsx数据转为Lua配置表,其实就是把表格数据用Lua写一遍,这里的实现重点就是setmetatable设置元表. 以下以表格student_info.xlsx举例,展示对应Lua配置表 ...
- Matlab %补充---用的多的函数
Input promat = 'This is a sentence.' x = input(prompt) %显示prompt中的文本并等待用户输入数值或者表达式后按Return %如果用户什么都 ...
- C#向其实进程子窗体发送指令
近日,想在自己的软件简单控制其它软件的最大化最小化,想到直接向进程发送指令,结果一直无效,经过Spy++发现,原来快捷方式在子窗体上,所以需要遍历子窗体在发送指令,以下为参考代码: 1 [DllImp ...