[CrackMe]Chafe.1.exe的逆向及注册机编写

news2025/1/13 9:26:03

上手先试一下, 发现其没有对话框, 只有字符串, 搜索"Your serial is not valid"字符串

\

上来就直接发现关键跳转, 难道这题这么简单吗? 仔细一看实际上远远要复杂

往上一翻发现没有生成serial key的代码, 而是看到了一个SetTimer, 时间间隔设置成了1ms, 之前输入的时候发现有点卡顿, 就是因为定时器消息阻塞了消息队列。

 既然这样, 那生成serial key的算法我估计就在这个定时器例程里, 由于SetTimer里面回调设置的是NULL, 所以要找到定时器例程肯定在WM_TIMER中, 要找到这个消息必须先找到窗口过程函数。定位到RegisterClassExA, 并找到对应的窗口过程函数。

 设定条件断点, 实际上由于WM_TIMER时间很短, 不需要设定很容易就能捕获WM_TIMER消息, 但是这里还是使用这种方法

 上来后就发现了一个call, serial key生成算法肯定在里面

 这个crackme使用的思路是切换栈帧, 他自己构造了一个栈帧, 该构造的栈帧上有4个例程, 其通过挪动ESP指针来切换每个例程, 每次切换栈帧并调用对应例程如果成功都会有4的累计, 那最终会有4 * 4 = 0x10, 如果满足这个值那就说明serial key是正确的。

下面是第一次切换栈帧, 其目的是为了从serial编辑控件上获取值, 这个值会在第3次切换栈帧时被进行加密运算, 最终得到一个值。

 如果你输入的serial key值长度不为0, 或者没有溢出。那么就代表例程执行成功, 这时会把JmpEspOffset += 4, 下次跳转到新栈帧时, 就会加上这个偏移使栈顶指针降低从而跳转到下一个新栈帧上的例程

 接下来进入第2次, 由于第一次成功了, 即获得了符合条件的serial key, JmpEspOffset目前是4, 这个值代表了新构造的栈的偏移, 所以新栈顶要挪动4个字节

接着通过ret指令, 将栈顶例程地址pop到EIP里, 这样也就成功进入了下一个例程内

 实际上这个crackme程序的name控件只会关注20个字节的内容, 这个例程的目的是为了把你输入的字符长度后面到最长20字节的内容全部清零, 如果你输入的name是有内容的。满足这个条件那JmpEspOffset不会发生变化。

 马上要进入第3个例程了。第3个例程做的工作是遍历把你输入的name, 一共扫描16次, 每次获取name的4个字节。然后以你输入的serial key为基础进行如下加密:

// 伪代码
int iPtr = 0;
while (iPtr < 16)
{
    SerialKey++;
    SerialKey ^= *(DWORD *)&name[iPtr] 
    iPtr++;
}

 这种操作进行了16次后将JmpEspOffset在增加4, 此时, JmpEspOffset为0xC

 接着将要进行最后一次例程执行, 其做的事很简单, 就是把第3次例程获取的值加上0x9112478, 如果说得出来的结果溢出并最终为0, 那就说明serial key正确。并将JmpEspOffset在增加4, 此时, JmpEspOffset为0x10

 最终出来后, 首先JmpEspOffset会和上一次的JmpEspOffset值(SaveValTmp)进行对比, 如果不一样说明JmpEspOffset发生了变化(即例程执行成功, +4), 接着其会把最新的JmpEspOffset保存到SaveValTmp中后与0x10进行对比, 如果说一致那就说明serial key正确。

使用C++编写一个注册机, 如下:

根据第3个例程的算法进行反推获取如下核心代码:

 (完)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/794696.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

访问:http://localhost:8070/actuator/bus-refresh 问题

1、请求发送不出去 原因&#xff1a; 自己 config-server端 application.yml 配置的端口号是8888&#xff0c;访问server修改为配置的端口号 2、请求报错405 几个解决办法&#xff1a; 1、版本问题变为busrefresh 2、bus-refresh加单引号或双引号尝试 3、加配置尝试&#xff1a…

嵌入式_GD32看门狗配置

嵌入式_GD32独立看门狗配置与注意事项 文章目录 嵌入式_GD32独立看门狗配置与注意事项前言一、什么是独立看门狗定时器&#xff08;FWDGT&#xff09;二、独立看门狗定时器原理三、独立看门狗定时器配置过程与注意事项总结 前言 使用GD3单片机时&#xff0c;为了提供了更高的安…

服务器数据恢复-Windows服务器RAID5数据恢复案例

服务器数据恢复环境&#xff1a; 一台服务器挂载三台IBM某型号存储设备&#xff0c;共64块SAS硬盘&#xff0c;组建RAID5磁盘阵列&#xff1b; 服务器操作系统&#xff1a;Windows Server&#xff1b;文件系统&#xff1a;NTFS。 服务器故障&#xff1a; 一台存储中的一块硬盘离…

STM32 串口学习(二)

要用跳线帽将PA9与RXD相连&#xff0c;PA10与TXD相连。 软件设计 void uart_init(u32 baud) {//UART 初始化设置UART1_Handler.InstanceUSART1; //USART1UART1_Handler.Init.BaudRatebound; //波特率UART1_Handler.Init.WordLengthUART_WORDLENGTH_8B; //字长为 8 位数据格式U…

Java语言跨平台执行的核心JVM

本文重点 在前面的课程中,我们介绍了java中的三层JDK->JRE->JVM,其中JVM称为Java的虚拟机,只是用来执行的,JRE是运行环境,要想在操作系统中运行,除了JVM还需要类库,JDK=JRE+开发的包和工具。本文就将介绍一下JVM究竟为何物? JVM 有的人会认为JVM是java中的东西…

29.双击喜欢

双击喜欢 html部分 <h3>双击喜欢这个图 <i style"color: red;" class"iconfont icon-xin"></i></h3> <small>你喜欢了 <span class"count">0</span> 次</small> <div class"area&quo…

【iOS】Cocoapods的安装以及使用

文章目录 前言一、Cocoapods的作用二、安装Cocoapods三、使用Cocoapods总结 前言 最近笔者在仿写天气预报App时用到了api调用数据&#xff0c;一般的基本数据类型我们用Xcode中自带的框架就可以转换得到。但是在和风天气api中的图标的格式为svg格式。 似乎iOS13之后Xcode中可…

Baumer工业相机堡盟工业相机如何通过BGAPI SDK获取相机当前实时帧率(C++)

Baumer工业相机堡盟工业相机如何通过BGAPISDK里函数来计算相机的实时帧率&#xff08;C&#xff09; Baumer工业相机Baumer工业相机的帧率的技术背景Baumer工业相机的帧率获取方式CameraExplorer如何查看相机帧率信息在BGAPI SDK里通过函数获取相机帧率 Baumer工业相机通过BGAP…

去除重复字母(力扣)贪心 + 队列 JAVA

给你一个字符串 s &#xff0c;请你去除字符串中重复的字母&#xff0c;使得每个字母只出现一次。需保证 返回结果的字典序最小&#xff08;要求不能打乱其他字符的相对位置&#xff09;。 示例 1&#xff1a; 输入&#xff1a;s “bcabc” 输出&#xff1a;“abc” 示例 2&am…

【亲测可用】Linux上安装Redis教程

一、下载并解压Redis 1、执行下面的命令下载redis&#xff1a; wget https://download.redis.io/releases/redis-6.2.6.tar.gz 2、解压redis&#xff1a; tar xzf redis-6.2.6.tar.gz 3、移动redis目录&#xff0c;一般都会将redis目录放置到 /usr/local/redis目录&#xff1a…

如何利用设备数字化平台推动精益制造?

人工智能驱动技术的不断发展&#xff0c;尤其是基于机器学习的预测分析工具的使用&#xff0c;为制造业带来了全新的效率和价值水平。一直以来&#xff0c;精益生产&#xff08;也叫精益制造&#xff09;在制造业中扮演着重要角色&#xff0c;而现在通过与工业 4.0的融合&#…

rpc通信原理浅析

rpc通信原理浅析 rpc(remote procedure call)&#xff0c;即远程过程调用&#xff0c;广泛用于分布式或是异构环境下的通信&#xff0c;数据格式一般采取protobuf。 protobuf&#xff08;protocol buffer&#xff09;是google 的一种数据交换的格式&#xff0c;它独立于平台语…

pytest---环境切换(base-url)

前言 前面小编介绍了如何通过pytest的插件来实现自动化测试的环境的切换&#xff0c;当时使用的方法是通过钩子函数进行获取命令行参数值&#xff0c;然后通过提前配置好的参数进行切换测试环境地址&#xff0c;今天小编再次介绍一种方法&#xff0c;通过pytest的插件&#xff…

three.js入门二:相机的zoom参数

环境&#xff1a; threejs&#xff1a;129 &#xff08;在浏览器的控制台下输入&#xff1a; window.__THREE__即可查看版本&#xff09;vscodewindowedge 透视相机或正交相机都有一个zoom参数&#xff0c;它可以用来将相机排到的内容在canvas上缩放显示。 注意&#xff1a;…

二、SQL-5.DQL-9).执行顺序

一、案例&#xff1a; 查询年龄大于15的员工的姓名、年龄&#xff0c;并根据年龄进行升序排序 select name, age from emp where age > 15 order by age asc; 先执行①from&#xff08;定义emp的别名为e&#xff09;&#xff0c;再执行②where&#xff08;调用别名e&…

基于Spring包扫描工具和MybatisPlus逆向工程组件的数据表自动同步机制

公司产品产出的项目较多。同步数据库表结构工作很麻烦。一个alter语句要跑到N个客户机上执行脚本。超级费时麻烦。介于此&#xff0c;原有方案是把增量脚本放到一resource包下&#xff0c;项目启动时执行逐行执行一次。但由于模块开发人员较多&#xff0c;总有那么一两个机灵鬼…

大数据课程D2——hadoop的概述

文章作者邮箱&#xff1a;yugongshiyesina.cn 地址&#xff1a;广东惠州 ▲ 本章节目的 ⚪ 了解hadoop的定义和特点&#xff1b; ⚪ 掌握hadoop的基础结构&#xff1b; ⚪ 掌握hadoop的常见命令&#xff1b; ⚪ 了解hadoop的执行流程&#xff1b; 一、简介 1…

ElasticSearch Window Linux部署

文章目录 一、Window 集群部署二、Linux 单节点部署三、Linux 集群部署 一、Window 集群部署 创建 elasticsearch-cluster 文件夹&#xff0c;在内部复制三个elasticsearch服务 修改集群文件目录中每个节点的 config/elasticsearch.yml 配置文件 # -----------------------…

[Linux] 初识应用层协议: 序列化与反序列化、编码与解码、jsoncpp简单使用...

写在应用层之前 有关Linux网络, 之前的文章已经简单演示介绍了UDP、TCP套接字编程 相关文章: [Linux] 网络编程 - 初见UDP套接字编程: 网络编程部分相关概念、TCP、UDP协议基本特点、网络字节序、socket接口使用、简单的UDP网络及聊天室实现… [Linux] 网络编程 - 初见TCP套接…

大气预报模式:非结构化质心Voronoi网格MPAS跨尺度、可变分辨率模式应用

查看原文>>>最新MPAS跨尺度、可变分辨率模式实践技术应用及典型案例分析 目录 专题一、MPAS 模式基本信息 专题二、MPAS 代码获取及结构 专题三、MPAS 移植、编译及运行实践 专题四、MPAS 全球均匀网格的运行 专题五、MPAS 全球非均匀网格的运行 专题六、MPAS …