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如何扩展 兼容更多数据库引擎 数据库引擎插件 在 界面上的体现 导航窗体 的 工具栏 中的 引擎下拉列表 导航窗体 的 树形控件 中的 引擎主节 ...
随机推荐
- 中国人民公安大学 Chinese people’ public security university 网络对抗技术 实验报告4
中国人民公安大学 Chinese people' public security university 网络对抗技术 实验报告 实验四 恶意代码技术 学生姓名 陈禹 年级 2018 区队 ...
- #Python #微信 #消息防撤回 Python实现微信防撤回
微信(WeChat)是腾讯公司于2011年1月21日推出的一款社交软件,8年时间微信做到日活10亿,日消息量450亿.在此期间微信也推出了不少的功能如:"摇一摇"."漂流 ...
- 循环结构(Java)
基本介绍 while循环语法 while(布尔表达式){循环内容} 只要布尔表达式为true,循环则会一直循环下去 我们大多数会让循环停止下来,我们需要一个让表达式失效的方式来结束循环 少部分需要循环 ...
- Linux系统管理实战-进程管理
进程管理 了解进程 状态/生命周期 查看进程 管理进程 kill killall pkill 进程的调度 进程的nice 了解进程状态/生命周期 什么是进程? 进程的状态? 进程的生命周期? 查看进程 ...
- 阿里云Linux服务器部署JDK8实战教程
下载地址 https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 文件上传 把下载的文 ...
- Java mysql查询数据库重复数据(单个或多个字段)
查询表重复数据: SELECT * FROM 表1 f WHERE (f.字段1,f.字段2) in (SELECT 字段1,字段2 FROM 表1 GROUP BY 字段1,字段2 HAVING c ...
- 【.NET】Swagger 允许接口重名
问题: Swagger Failed to load API definition. 相信用过swagger的小伙伴 一定经历过这样的错误,问题点很简单,是接口重名了. 我百度了一下,找不到答案. 谷 ...
- Vue3+Vite项目中 使用WindiCSS.
之前工作有了解过根据类名来写元素的样式,一听就发出疑问:这样写项目可读性恐怕不是很好吧... 之后来到杭州工作后,开始使用WindiCSS后发现 真香!!! 由于近期所写的项目都是自己一个人开发的 ...
- greenDao基础用法(一)
1.配置 1.1 在 build.gradle(project) 中,加入这句 classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // a ...
- vmware网络故障处理
1.基本情况,更新vmware后发现联不上ssh了.查看物理机和虚拟机的ip,使用ping命令发现 虚拟机可以ping物理机且有网络 但是物理机是无法ping虚拟机的 2.网络的教程整理了,各有问题, ...