CrackMe006:隐藏掉按钮_od隐藏软件按钮-程序员宅基地

技术标签: CrackMe160思路  安全  

下面是网上的160个CrackMe的部分逆向笔记,包括逆向思路、注册机实现和逆向中常用的知识整理

注意:逆向前一定要先操作一下软件,熟悉软件的运行现象;逆向一定要自己操作一遍,看是很难看会的(高手除外)

CrackMe006CrackMe007是同一个作者,CrackMe006是基础

在这里插入图片描述

1.现象

破解程序要求将Ok按钮和Cancella按钮隐藏掉,显示出后面完整的图片

在这里插入图片描述

2.程序基本信息

在这里插入图片描述

无壳,编程语言是Delphi

3.DarkDe工具分析

分析窗口主要关心窗体过程选项卡,里面会看到控件关联的响应函数(或者叫事件)和相应的RVA

在这里插入图片描述

2个关键按钮响应事件的RVA都已经找到,可以用OD开始对程序进行分析

先分析哪个按钮?推荐先分析Cannella按钮

教训:我先分析的序列号对话框的响应事件CodiceChange,然后显示出Ok按钮,…;如果先分析Cannella按钮,破解后Ok按钮变灰会自动取消

4.分析程序-Cancella按钮

不要着急直接用OD加载程序运行,要先用IDA帮我们分析一波,然后生成MAP文件,在OD中导入MAP文件,这可以大大提高效率(下面分析的都是在MAP加载后的基础上进行分析的)

OD中在Cancella按钮对应的RVA 442E8(实际是函数的入口地址)处设置断点,输入test123456当做l临时用户名和序列号;点击Cancella按钮,断点命中后分析响应函数

在这里插入图片描述

step 1.响应函数

下面是响应函数的主要处理逻辑

在这里插入图片描述

为了让Cancella控件不可见,响应函数应该执行的流程:

  • 1.获取序列号转成十进制;获取用户名
  • 2.执行关键函数(sub_442AF4,后面会重点分析),期望结果:eax非零
  • 3.关键跳转不跳转,会将Cancella控件不可见,Ok按钮使能

step 2.分析关键函数

为了写注册机,要重点分析一下响应函数中的sub_442AF4函数

提示:为了加快分析的进度,可以使用OD对照着IDA中的分析结果进行动态调试,下面是对照调试的结果(其中IDA和OD很多注释和变量名都被手动修改了>)

调试技巧:对比发现,IDA的反编译是真的香;根据个人习惯,分析关键函数时,OD最好结合IDA一起使用;两者合在一起相当于IDA查看伪源码(IDA也可以动态调试,看个人习惯),OD是调试器

在这里插入图片描述

简单总结:

  • 1.对用户名进行特定运算后取阶乘结果=阶乘((user_name + 4) % 7u + 2)
  • 2.然后这个阶乘值 * 用户名中每个字符的ASCII码,累加
  • 3.最后总结果与31337进行比较,相等就返回1,表示成功;不相等返回0,表示失败

一句话:用户名计算的伪序列号 - 真正序列号 == 31337,表示注册成功

step 3.注册机

提示:分析时,顺便修改一下IDA中变量名称,且加注释,分析完后IDA中反编译代码基本就是注册机原型了

注册机主要是为了计算出正确的序列号,关键函数有如下公式

用户名计算的伪序列号x - 真正序列号y == 31337;即x - y = 31337 ,得到y = x - 31337

因此,假设序列号是0,有如下注册机代码(核心部分直接copy的IDA中的分析结果)

#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int cal_factorial(int n) {
    						// 计算阶乘
	int num = 1;
	for (int i = 1; i <= n; i++) num *= i;
	return num;
}
int sub_442AF4(char* user_name)
{
    
	// 阶乘((user_name + 4) % 7u + 2)
	int factorial = cal_factorial(*(unsigned __int8 *)(user_name + 4) % 7 + 2);
	int accumulate = 0;
	int user_name_len = strlen(user_name);
	int i = 1;
	do 
	{
    
		// 阶乘*用户名的每个字符的ASCII码,累加
		accumulate += factorial * *(unsigned __int8 *)(user_name + i++ - 1);
		--user_name_len;
	} while (user_name_len);
	
	return accumulate - 31337; //y = x - 31337
}
int main() {
    
	char user_name[100] = {
    0};
	printf("请输入用户名(长度>6):");
	scanf_s("%s", user_name, 100);
	printf("对应的序列号:%d\n", sub_442AF4(user_name));
	system("pause");
    return 0;
}

输入算出来的序列号,点击Cancella按钮;效果是Cancella按钮消失,Ok按钮使能

在这里插入图片描述

5.分析程序-Ok按钮

一样的套路分析Ok按钮,下面是Ok按钮的分析结果

step 1.响应函数

分析时,用IDA和OD一起进行分析,可以定位到关键函数,关键函数要返回1,才能逆向成功

在这里插入图片描述

step 2.分析关键函数

下面是关键函数重要部分的分析截图

在这里插入图片描述

关键函数中的校验流程如下:循环取出序列号的最后一位,平方,乘以当前序列号还没有处理字符的长度,对0x19取模运算,再加上0x41

对应的公式:len * (int16)sqrt(serial[len--]) % 0x19 +0x41

step 3.注册机

下面是IDA分析的关键函数的主体部分,简单修改一下就可以写出注册机

在这里插入图片描述

对应的简易注册机

#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
    
	char serial[100] = {
    0};
	char user_name[100] = {
    0};
	printf("请输入序列号(长度>6):");
	scanf_s("%s", serial, 100);
	
	for (int i = strlen(serial) - 1; i >= 0; i--) {
    
		user_name[i] = (serial[i] * serial[i] * (i + 1)) % 25 + 65;
	}

	printf("对应的用户名:%s\n", user_name);
	system("pause");
    return 0;
}

验证结果:

在这里插入图片描述

6.完整的验证操作

  • 1.用户名逆向出正确的序列号,使Cancella按钮消失,Ok按钮使能

    示例:test123 -> -30141

在这里插入图片描述

  • 2.序列号逆向出用户用户名,使Ok按钮消失,显示出完整图片,逆向完成

    示例:-30141 -> “ACMEUG”

在这里插入图片描述

7.参考

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_44531336/article/details/124906465

智能推荐

JavaScript实现简单的注册表单校验_js判断注册表项是否存在-程序员宅基地

js实现简单的注册表单校验案例分析:一般在我们注册时页面会要求我们填写基本信息,而信息格式的正确与否决定了我们能否注册成功。当我们写完一行注册信息,鼠标焦点离开当前行时,行会用我们填写的信息去与后台编写的正则表达式匹配,若不符合格式,给出提示,反之。技术总结:document.getElementById—获取对象(返回一个对象,用var接收).onblur()—失去焦点事件对象.i..._js判断注册表项是否存在

edge浏览器 您的flash可能被禁用或者版本过低_怎么看edge的flash版本-程序员宅基地

转自:http://blog.sina.com.cn/s/blog_540316260102xkp1.html从Win 8开始,微软的Windows操作系统就已经将Flash Player内嵌。故对于Win 10系统使用微软默认的Edge浏览器,或者使用IE11浏览器,通常情况下都可以正常在优酷、YouTube、土豆、酷六、搜狐等视频网站正常播放视频。然而,有的人会发现。在Win 10_怎么看edge的flash版本

Java - Lambda Error:Variable used in lambda expression should be final or effectively final_java should be final-程序员宅基地

Lambda表达式提示变量错误:Variable used in lambda expression should be final or effectively final...注释掉第二行就OK。分析:根据语法,变量必须为final,但是 a 已经被修改了。为什么 Lambda 表达式(匿名类) 不能访问非 final 的局部变量呢? 因为实例变量存在堆中,而局部变量是在栈上分配,Lambda 表达(匿名类) 会在另一个线程中执行。如果在线程中要直接访问一个局部变量,可能线程执行时该.._java should be final

编程问题总结——[Error] ‘pow‘ was not declared in this scope_[error] 'pow' was not declared in this scope-程序员宅基地

问题描述:编译代码时系统报错:[Error] ‘pow’ was not declared in this scope代码如下:#include <stdio.h>double fn( double x, int n );int main(){ double x; int n; scanf("%lf %d", &x, &n); printf("%lf",pow(x,n));// printf("%.2f\n", fn(x,n_[error] 'pow' was not declared in this scope

计算机恶搞bat代码,电脑重启bat代码怎么设置 电脑整人bat代码大全-程序员宅基地

在电脑系统中,我们可以设置一些操作的快捷键,比如电脑重启快捷键,怎么设置呢?下面小编给大家讲解一下关于电脑重启bat代码的解决方法,希望大家喜欢!电脑重启bat代码的解决方法一分钟后关机点击Windows﹢R键,输入 shutdown -s 。输完代码以后,点击回车。将会出现“windows将在一分钟后关闭”的提示框。马上关机同样点击Win﹢R键,输入 shutdown -p。点击回车,可以看到电..._bat整人锁电脑

基于redis的分布式RateLimiter(限流)实现-程序员宅基地

业务背景系统需要对接某IM厂商rest接口,向客户端推送消息(以及其他IM业务)该厂商对rest接口调用有频率限制:总rest调用9000次/30s;消息推送600次/30s系统为分布式集群,需要控制整个分布式集群总的接口调用频率满足以上限制Guava RateLimiter上篇文章 《Guava RateLimiter源码解析》中...

随便推点

JDBC链接Msql数据库_jdbc网页出来为m-程序员宅基地

package com.util;import java.io.Serializable;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLExc_jdbc网页出来为m

C#今日头条推荐新闻爬取-程序员宅基地

List toutiaolist;var request = (HttpWebRequest)WebRequest.Create(“https://www.toutiao.com/api/pc/feed/?min_behot_time=0&category=all&utm_source=toutiao&widen=1&tadrequire=true”);var ...

一、YARN 架构由什么组成?_yarn架构的几个组成部分有哪些-程序员宅基地

一、YARN 架构由什么组成?首先我们来看看 YARN 的架构图,如下图所示。 从 YARN 的架构图来看,它主要由ResourceManager、NodeManager、ApplicationMaster和Container等以下几个组件构成。 1、 ResourceManager(RM)   YARN 分层结构的本质是 ResourceManager。这个实体控制整个集_yarn架构的几个组成部分有哪些

grub源码分析之startup_raw.S_real_to_prot-程序员宅基地

转载于 “https://blog.csdn.net/conansonic/article/details/78534950”继续上一章的分析,0x8200地址处的代码定义在startup_raw.S文件中。grub-core/boot/i386/pc/startup_raw.S_start:LOCAL (base):ljmp $0, $ABS(LOCAL (codestart))....._real_to_prot

mysql 编译安装 GCC 5.3 or newer is required (-dumpversion says 4.8.5)-程序员宅基地

源码安装MySQL8时cmake提示如下信息CMake Error at cmake/os/Linux.cmake:67 (MESSAGE): GCC 5.3 or newer is required (-dumpversion says 4.8.5)Call Stack (most recent call first): CMakeLists.txt:453 (INCLUDE)上网一搜大多数都是下载boost库,可是我又不是没有boost库,有的还说是gcc版本过低,我这边知道,所以

window 安装 deepin双系统 (thinkpad install deepin)-程序员宅基地

thinkpad install deepin几年前的thinkpad一直安装的是window,本来配置就不高,虽然我已经把内存加到了16g,硬盘又加了两块 120g的ssd,再拖一块hdd,但是游戏还是玩不动,更难受的是,前端开发的 node_module 文件都巨多,window 真心慢到要死,而且window 的终端也太难用了。于是我就一直想着将这台老兵换一个linux系统,好歹偶尔敲敲...

推荐文章

热门文章

相关标签