技术标签: CrackMe160思路 安全
下面是网上的160个CrackMe的部分逆向笔记,包括逆向思路、注册机实现和逆向中常用的知识整理
注意:逆向前一定要先操作一下软件,熟悉软件的运行现象;逆向一定要自己操作一遍,看是很难看会的(高手除外)
CrackMe006
和CrackMe007是同一个作者,CrackMe006是基础
破解程序要求将Ok
按钮和Cancella
按钮隐藏掉,显示出后面完整的图片
无壳,编程语言是Delphi
分析窗口主要关心窗体
和过程
选项卡,里面会看到控件关联的响应函数(或者叫事件)和相应的RVA
2个关键按钮响应事件的RVA都已经找到,可以用OD开始对程序进行分析
先分析哪个按钮?
推荐先分析Cannella
按钮
教训:我先分析的序列号对话框的响应事件
CodiceChange
,然后显示出Ok
按钮,…;如果先分析Cannella
按钮,破解后Ok
按钮变灰会自动取消
不要着急直接用OD加载程序运行,要先用IDA帮我们分析一波,然后生成MAP文件,在OD中导入MAP文件,这可以大大提高效率(下面分析的都是在MAP加载后的基础上进行分析的)
OD中在Cancella
按钮对应的RVA 442E8
(实际是函数的入口地址)处设置断点,输入test123
和456
当做l临时用户名和序列号;点击Cancella
按钮,断点命中后分析响应函数
下面是响应函数的主要处理逻辑
为了让Cancella
控件不可见,响应函数应该执行的流程:
sub_442AF4
,后面会重点分析),期望结果:eax非零Cancella
控件不可见,Ok
按钮使能为了写注册机,要重点分析一下响应函数中的sub_442AF4
函数
提示:为了加快分析的进度,可以使用OD对照着IDA中的分析结果进行动态调试,下面是对照调试的结果(其中IDA和OD很多注释和变量名都被手动修改了>)
调试技巧:对比发现,IDA的反编译是真的香;根据个人习惯,分析关键函数时,OD最好结合IDA一起使用;两者合在一起相当于IDA查看伪源码(IDA也可以动态调试,看个人习惯),OD是调试器
简单总结:
结果=阶乘((user_name + 4) % 7u + 2)
一句话:用户名计算的伪序列号 - 真正序列号 == 31337,表示注册成功
提示:分析时,顺便修改一下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
按钮使能
一样的套路分析Ok
按钮,下面是Ok
按钮的分析结果
分析时,用IDA和OD一起进行分析,可以定位到关键函数,关键函数要返回1,才能逆向成功
下面是关键函数重要部分的分析截图
关键函数中的校验流程如下:循环取出序列号的最后一位,平方,乘以当前序列号还没有处理字符的长度,对0x19取模运算,再加上0x41
对应的公式:len * (int16)sqrt(serial[len--]) % 0x19 +0x41
下面是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;
}
验证结果:
1.用户名逆向出正确的序列号,使Cancella
按钮消失,Ok
按钮使能
示例:test123 -> -30141
2.序列号逆向出用户用户名,使Ok
按钮消失,显示出完整图片,逆向完成
示例:-30141 -> “ACMEUG”
js实现简单的注册表单校验案例分析:一般在我们注册时页面会要求我们填写基本信息,而信息格式的正确与否决定了我们能否注册成功。当我们写完一行注册信息,鼠标焦点离开当前行时,行会用我们填写的信息去与后台编写的正则表达式匹配,若不符合格式,给出提示,反之。技术总结:document.getElementById—获取对象(返回一个对象,用var接收).onblur()—失去焦点事件对象.i..._js判断注册表项是否存在
转自:http://blog.sina.com.cn/s/blog_540316260102xkp1.html从Win 8开始,微软的Windows操作系统就已经将Flash Player内嵌。故对于Win 10系统使用微软默认的Edge浏览器,或者使用IE11浏览器,通常情况下都可以正常在优酷、YouTube、土豆、酷六、搜狐等视频网站正常播放视频。然而,有的人会发现。在Win 10_怎么看edge的flash版本
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代码如下:#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代码的解决方法一分钟后关机点击Windows﹢R键,输入 shutdown -s 。输完代码以后,点击回车。将会出现“windows将在一分钟后关闭”的提示框。马上关机同样点击Win﹢R键,输入 shutdown -p。点击回车,可以看到电..._bat整人锁电脑
业务背景系统需要对接某IM厂商rest接口,向客户端推送消息(以及其他IM业务)该厂商对rest接口调用有频率限制:总rest调用9000次/30s;消息推送600次/30s系统为分布式集群,需要控制整个分布式集群总的接口调用频率满足以上限制Guava RateLimiter上篇文章 《Guava RateLimiter源码解析》中...
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
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 的架构图来看,它主要由ResourceManager、NodeManager、ApplicationMaster和Container等以下几个组件构成。 1、 ResourceManager(RM) YARN 分层结构的本质是 ResourceManager。这个实体控制整个集_yarn架构的几个组成部分有哪些
转载于 “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
源码安装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版本过低,我这边知道,所以
thinkpad install deepin几年前的thinkpad一直安装的是window,本来配置就不高,虽然我已经把内存加到了16g,硬盘又加了两块 120g的ssd,再拖一块hdd,但是游戏还是玩不动,更难受的是,前端开发的 node_module 文件都巨多,window 真心慢到要死,而且window 的终端也太难用了。于是我就一直想着将这台老兵换一个linux系统,好歹偶尔敲敲...