文章目录

  • 查壳
  • 分析程序
  • 分析算法
    • 第一部分 计算用户名和序列号
    • 第二部分 根据用户名和序列号的结果改写Opcode
    • 第三部分 关键校验
    • 揣摩作者意图
    • 程序算法总结
  • 写出注册机
  • 校验结果

查壳

024这个Crackme跟023是同一个作者,难度两颗星,程序设计的很巧妙,非常有意思

分析程序

首先根据字符串的错误提示找到错误跳转到这个地址的位置,总共有两处,两处校验的地方,地址相差不远,随便找一个跟过去

两处校验分别是校验序列号和用户名是否有效,校验完了之后就是程序的核心算法

分析算法

这个程序的算法分为三个部分,每个部分之间都相互关联,环环相扣,首先来看第一部分

第一部分 计算用户名和序列号

先输入用户名和序列号,然后下断点,这个程序的校验算法部分检测的是键盘事件,而不是定时器,所以打完断点之后随便按一个键程序就能断下来

这个就是第一部分的算法,过程如下:

  1. eax的值第一次固定为CTEX的ASCII值
  2. ebx为指向用户名的指针
  3. 将eax和ebx的内容相加 结果保存在eax
  4. 然后用户名左移1位
  5. 检测用户名是否到了结尾,即循环次数为用户名的长度
  6. 用户名的结果计算完毕之后再加上序列号

第二部分 根据用户名和序列号的结果改写Opcode

首先将eax的值,也就是第一部分计算出的结果跟[0x4012D9]这个地址进行异或,

[0x4012D9]这个地址的值在算法一开始就被赋值了,所以这个值是固定的。

然后将eax右移0x10位,然后用[0x4012D9]的值减去ax,这两部分的操作都会改变[0x4012D9]处的代码,那么这么做到底是为了什么呢?现在还不知道,需要接着往下看

第三部分 关键校验

从内存地址[4011EC]开始,读入四个字节与EBX异或,结果保存在ebx,一直至内存地址[4012E4],这段正好是关键算法部分,循环结束之后比较ebx是否等于0xAFFCCFFB,如果不相等则报错,如果相等的话就跳转0x4012D9处。

这里有一个坑,就算不能在这个校验的范围内下F2断点,如果下了的话会改变最后的值

揣摩作者意图

按照正常情况下来说,有一个提示错误的分支,另外一个就一定是提示正确的分支,而这个提示正确的分支却是指向一段动态改变的代码,那就是说,我们只能通过0x4012D9处的代码让程序提示注册成功,否则这个程序就会陷入无限的死循环或者是直接奔溃。

也就是说,0x4012D9这个位置必须带我们到正确的提示,也就是说这个地址的OpCode必须为EB 26

程序算法总结

  1. 首先对用户名和注册码进行一系列的计算,得出Result
  2. 通过Result改变0x4012D9处的代码
  3. 循环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加密相关推荐

  1. opcode加密php代码,总结Opcode缓存和PHP代码的加密

    1.Zend Optimizer v3.x.x v2.x.x 在PHP-5.2.x以前的PHP版本使用,用优化代码的方法来提高PHP应用程序的执行速度,理论上要比不使用ZO要快40%-100%.实现的 ...

  2. 《实战突击.php项目开发案例整合》.(明日科技).[PDF]ckook

    图书作者: 明日科技 图书编号: 9787121141140 图书格式: PDF 出 版 社: 电子工业出版社 出版年份: 2011 图书页数: 800-900 [内容简介] <实战突击:php ...

  3. 加密算法使用(五):RSA使用全过程

    RSA是一种非对称加密算法,使用RSA前先生成一对公钥和私钥. 使用公钥加密的数据可以用私钥解密,同样私钥加密的数据也可以用公钥解密, 不同之处在于,私钥加密数据的同时还可以生成一组签名,签名是用来验 ...

  4. 系统安全相关知识学习

    系统安全相关知识学习 文章目录 系统安全相关知识学习 1. 系统安全是什么 1.1. 机密性 1.2. 完整性 1.3. 可用性 2. 如何解决安全问题 2.1. 身份识别和认证 2.2. 授权 2. ...

  5. 软件设计师考前100个知识点-摘自希赛网

    1.码制的表示 定点整数 原码与反码的0既有+0也有-0,数码的表示个数为2n-1个.补码与移码有人为定义,-0编码定义为最小数值-1,数码的表示个数为2n个,最小表示数值为2n-1. 定点小数 数码 ...

  6. [转]信息安全相关理论题(二)

    27.在工程实施之前,验收方可以不给施工方弱电布线图纸,但施工结束后必须有图纸 A. 对 B. 错 您的答案: 标准答案: B 28.在OSI七层协议中,提供一种建立连接并有序传输数据的方法的层是 A ...

  7. 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. ...

  8. js MD5加密处理

    关于MD5: MD5.js是通过前台js加密的方式对用户信息,密码等私密信息进行加密处理的工具,也可称为插件. 在本案例中 可以看到MD5共有6种加密方法: 1,  hex_md5(value) 2, ...

  9. php源码安全加密之PHP混淆算法.

    php源码安全加密的前世今生,本想发在教程区中.不知道怎么发,就写在这里面吧. PHP加密,解密是一直的话题,本人菜鸟,今天就简单向大家介绍一下并说说其中原理.提供一些加密的混淆算法. 一\PHP的加 ...

最新文章

  1. R语言基于随机森林进行特征选择(feature selection)
  2. Tomcat高级部分-使用特定模块和软件反向代理请求到后端tomcat实现负载均衡和session保持...
  3. 【DA算法】基于DA算法的FIR滤波器的FPGA实现
  4. stm32之实时时钟RTC(掉电计时保持、秒中断、闹钟中断、溢出中断)
  5. net.sf.fmj.media.cdp.civil.CaptureDevicePlugger addCaptureDevices解决方法
  6. Fiddle:使用断点:bpu,bpafter
  7. Python实现石头-剪刀-布小游戏
  8. android sdk 64 linux下载,64位Linux机器上的Android SDK
  9. python与java前景-Java和Python现在都很热门,哪个更有前途?
  10. LinkButton 传递多个参数
  11. 极佳mysql数据库碎片恢复工具,极佳SQL数据库日志恢复工具
  12. 流程和企业成熟度模型(PEMM)
  13. PHP + AJAX实现幸运转盘抽奖
  14. CAD图形的缩放——放大镜
  15. 如何通过F12开发者工具保存网页中想要的视频资源
  16. 什么是SAP Analytics Cloud
  17. 按字节编址、按字编址、按字节寻址、按字寻址。
  18. Configure Python interpreter
  19. DolphinScheduler 集群模式部署
  20. 微信小程序应用开发赛作品综合开发记录——晋鹿文旅(云开发——概览)

热门文章

  1. Dataset之图片数据增强:设计自动生成汽车车牌图片算法(cv2+PIL)根据随机指定七个字符生成逼真车牌图片数据集(自然场景下+各种噪声效果)可视化
  2. java_OA管理系统(一):Servlet总结案例仿网络聊天室
  3. tf.clip_by_global_norm理解
  4. PIL图像处理开发极简教程
  5. Sersync实现触发式文件同步
  6. c# unchecked关键字。byte 合并short
  7. 又拍云递归删除目录及文件
  8. ST17H26代码优化的疑问
  9. 新手第一课-什么是深度学习
  10. std::get(std::tuple)