160个Crackme024之Opcode加密
文章目录
- 查壳
- 分析程序
- 分析算法
- 第一部分 计算用户名和序列号
- 第二部分 根据用户名和序列号的结果改写Opcode
- 第三部分 关键校验
- 揣摩作者意图
- 程序算法总结
- 写出注册机
- 校验结果
查壳
024这个Crackme跟023是同一个作者,难度两颗星,程序设计的很巧妙,非常有意思
分析程序
首先根据字符串的错误提示找到错误跳转到这个地址的位置,总共有两处,两处校验的地方,地址相差不远,随便找一个跟过去
两处校验分别是校验序列号和用户名是否有效,校验完了之后就是程序的核心算法
分析算法
这个程序的算法分为三个部分,每个部分之间都相互关联,环环相扣,首先来看第一部分
第一部分 计算用户名和序列号
先输入用户名和序列号,然后下断点,这个程序的校验算法部分检测的是键盘事件,而不是定时器,所以打完断点之后随便按一个键程序就能断下来
这个就是第一部分的算法,过程如下:
- eax的值第一次固定为CTEX的ASCII值
- ebx为指向用户名的指针
- 将eax和ebx的内容相加 结果保存在eax
- 然后用户名左移1位
- 检测用户名是否到了结尾,即循环次数为用户名的长度
- 用户名的结果计算完毕之后再加上序列号
第二部分 根据用户名和序列号的结果改写Opcode
首先将eax的值,也就是第一部分计算出的结果跟[0x4012D9]这个地址进行异或,
[0x4012D9]这个地址的值在算法一开始就被赋值了,所以这个值是固定的。
然后将eax右移0x10位,然后用[0x4012D9]的值减去ax,这两部分的操作都会改变[0x4012D9]处的代码,那么这么做到底是为了什么呢?现在还不知道,需要接着往下看
第三部分 关键校验
从内存地址[4011EC]开始,读入四个字节与EBX异或,结果保存在ebx,一直至内存地址[4012E4],这段正好是关键算法部分,循环结束之后比较ebx是否等于0xAFFCCFFB,如果不相等则报错,如果相等的话就跳转0x4012D9处。
这里有一个坑,就算不能在这个校验的范围内下F2断点,如果下了的话会改变最后的值
揣摩作者意图
按照正常情况下来说,有一个提示错误的分支,另外一个就一定是提示正确的分支,而这个提示正确的分支却是指向一段动态改变的代码,那就是说,我们只能通过0x4012D9处的代码让程序提示注册成功,否则这个程序就会陷入无限的死循环或者是直接奔溃。
也就是说,0x4012D9这个位置必须带我们到正确的提示,也就是说这个地址的OpCode必须为EB 26
程序算法总结
- 首先对用户名和注册码进行一系列的计算,得出Result
- 通过Result改变0x4012D9处的代码
- 循环0x3E次,校验最后的结果
写出注册机
过程分析清楚了,但是想写出注册机的话还是得费点劲的,这种逆推算法的事情我不太擅长,看见就脑阔疼,索性直接从看雪上面拷了一个,代码如下:
虽然这个注册机效率有点慢,但好歹能编译通过,而且计算正确,之前找了好几个要么编译不过,要么算的不对,我也是服了
#include <iostream>
#include <windows.h>
using namespace std;int main(void)
{CHAR szName[20] = { 0 };cout << "Name:";cin >> szName;DWORD dwNum = 0x58455443;//程序实现填入的全局变量for (int i = 0; i < strlen(szName); i++)//用户名循环相加DWORD{void *p = &szName[i];_asm{mov edi, p;mov eax, dword ptr[edi];add dwNum, eax;}}//DWORD dwPass = 0;while (1){DWORD temp = (dwNum + dwPass) ^ 0x584554;temp -= (WORD)((dwNum + dwPass) >> 0x10);if (dwPass % 0x100000 == 0) //这里if语句可以不要只是用来看看它在跑密码还是死机了cout << dwPass << endl;if (temp == 0x585426EB)//这就是上一个算法得到的正确的opcodebreak;dwPass++;}cout << "Pass:" << dwPass << endl;system("pause");
}
校验结果
输入用户名和计算出来的序列号,提示成功 破解完成
需要相关文件的可以到我的Github下载:https://github.com/TonyChen56/160-Crackme
160个Crackme024之Opcode加密相关推荐
- opcode加密php代码,总结Opcode缓存和PHP代码的加密
1.Zend Optimizer v3.x.x v2.x.x 在PHP-5.2.x以前的PHP版本使用,用优化代码的方法来提高PHP应用程序的执行速度,理论上要比不使用ZO要快40%-100%.实现的 ...
- 《实战突击.php项目开发案例整合》.(明日科技).[PDF]ckook
图书作者: 明日科技 图书编号: 9787121141140 图书格式: PDF 出 版 社: 电子工业出版社 出版年份: 2011 图书页数: 800-900 [内容简介] <实战突击:php ...
- 加密算法使用(五):RSA使用全过程
RSA是一种非对称加密算法,使用RSA前先生成一对公钥和私钥. 使用公钥加密的数据可以用私钥解密,同样私钥加密的数据也可以用公钥解密, 不同之处在于,私钥加密数据的同时还可以生成一组签名,签名是用来验 ...
- 系统安全相关知识学习
系统安全相关知识学习 文章目录 系统安全相关知识学习 1. 系统安全是什么 1.1. 机密性 1.2. 完整性 1.3. 可用性 2. 如何解决安全问题 2.1. 身份识别和认证 2.2. 授权 2. ...
- 软件设计师考前100个知识点-摘自希赛网
1.码制的表示 定点整数 原码与反码的0既有+0也有-0,数码的表示个数为2n-1个.补码与移码有人为定义,-0编码定义为最小数值-1,数码的表示个数为2n个,最小表示数值为2n-1. 定点小数 数码 ...
- [转]信息安全相关理论题(二)
27.在工程实施之前,验收方可以不给施工方弱电布线图纸,但施工结束后必须有图纸 A. 对 B. 错 您的答案: 标准答案: B 28.在OSI七层协议中,提供一种建立连接并有序传输数据的方法的层是 A ...
- AES加密时抛出java.security.InvalidKeyException:#160;Illegal#160;key#160;size#160;or#160;def...
原文:AES加密时抛出java.security.InvalidKeyException: Illegal key size or def 使用AES加密时,当密钥大于128时,代码会抛出 java. ...
- js MD5加密处理
关于MD5: MD5.js是通过前台js加密的方式对用户信息,密码等私密信息进行加密处理的工具,也可称为插件. 在本案例中 可以看到MD5共有6种加密方法: 1, hex_md5(value) 2, ...
- php源码安全加密之PHP混淆算法.
php源码安全加密的前世今生,本想发在教程区中.不知道怎么发,就写在这里面吧. PHP加密,解密是一直的话题,本人菜鸟,今天就简单向大家介绍一下并说说其中原理.提供一些加密的混淆算法. 一\PHP的加 ...
最新文章
- R语言基于随机森林进行特征选择(feature selection)
- Tomcat高级部分-使用特定模块和软件反向代理请求到后端tomcat实现负载均衡和session保持...
- 【DA算法】基于DA算法的FIR滤波器的FPGA实现
- stm32之实时时钟RTC(掉电计时保持、秒中断、闹钟中断、溢出中断)
- net.sf.fmj.media.cdp.civil.CaptureDevicePlugger addCaptureDevices解决方法
- Fiddle:使用断点:bpu,bpafter
- Python实现石头-剪刀-布小游戏
- android sdk 64 linux下载,64位Linux机器上的Android SDK
- python与java前景-Java和Python现在都很热门,哪个更有前途?
- LinkButton 传递多个参数
- 极佳mysql数据库碎片恢复工具,极佳SQL数据库日志恢复工具
- 流程和企业成熟度模型(PEMM)
- PHP + AJAX实现幸运转盘抽奖
- CAD图形的缩放——放大镜
- 如何通过F12开发者工具保存网页中想要的视频资源
- 什么是SAP Analytics Cloud
- 按字节编址、按字编址、按字节寻址、按字寻址。
- Configure Python interpreter
- DolphinScheduler 集群模式部署
- 微信小程序应用开发赛作品综合开发记录——晋鹿文旅(云开发——概览)
热门文章
- Dataset之图片数据增强:设计自动生成汽车车牌图片算法(cv2+PIL)根据随机指定七个字符生成逼真车牌图片数据集(自然场景下+各种噪声效果)可视化
- java_OA管理系统(一):Servlet总结案例仿网络聊天室
- tf.clip_by_global_norm理解
- PIL图像处理开发极简教程
- Sersync实现触发式文件同步
- c# unchecked关键字。byte 合并short
- 又拍云递归删除目录及文件
- ST17H26代码优化的疑问
- 新手第一课-什么是深度学习
- std::get(std::tuple)