CrackMe009:VB Decompiler第一次登场

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

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


重要的事情说3遍:

笔记更新换位置了!
笔记更新换位置了!
笔记更新换位置了!

新位置:我写的新系列,刚开始写没几天,后续文章主要在新地址更新,欢迎支持;写作不易,且看且珍惜(点击跳转,欢迎收藏

连续的4个CrackMe都是同一个作者编写的,都是VB程序;其中CrackMe008使用的是关键字符串思路,是最简单的一个;CrackMe009多了一个用户名
在这里插入图片描述

1.现象

需要输入正确的用户名和key程序才能破解成功

在这里插入图片描述

2.查看程序基本信息

在这里插入图片描述

无壳,VB编写

3.响应函数和关键跳转

爆破程序要找到程序的关键跳转,下面使用2种方法进行分析,加深理解

思路 1.错误字符串法

思路:通过错误字符串在OD中找到关键函数(CrackMe001有详细的介绍),简单操作就是在错误字符串下断点,向上回溯找到关键跳转和函数入口(按钮的响应函数)

下面是OD分析的按钮响应函数主要结构

在这里插入图片描述

其中:

  • 0x4022CB:是关键跳转,单步调试时,直接nop掉这行的反汇编,直接显示注册成功,爆破成功
  • 0x401FF0:按钮的响应函数入口,如果想写出注册机,要从这个函数开始分析

思路 2.使用VB Decompiler分析

VB Decompiler是分析VB的神器;加载程序后,程序只有一个按钮,因此0x401FF0就应该是按钮的响应函数入口,也很容易找到关键跳转

在这里插入图片描述

说明:Native Code标识程序是自然编译的(编译为机器码),可以用OD直接调试

2种思路对比,逆向VB程序还是使用专用工具VB Decompiler可以提高效率

4.注册机

分析前要了解一些VB的相关知识

  • VB中,文本是Unicode编码,每个变量所在地址的前8个byte是数据的类型信息,首地址+8才是数据开始存储的地方
  • VB中,大多数函数的参数都放在eaxecx中,返回值放在[ebp-0x34]

step 1.VB Decompiler分析

提示:分析VB程序的注册流程时,一定要结合VB Decompiler显示的反汇编结果进行分析,否则能把人累死…

下面是工具VB Decompiler分析的代码,加上了自己猜测的注释(不一定正确,但是会有助于用OD调试)

在这里插入图片描述

加完注释感觉注册机基本上逆向出80%了,只要在看一下

在这里插入图片描述

这2个相同语句具体是做什么的逆向就完成了

step 2.OD分析

用户名使用test123,key使用456进行测试

step 2-1.求出用户名长度

在这里插入图片描述

获取的用户名后,使用类似strlen的计算符,计算出用户名的长度;

有2处+8要注意:

  • 1.第一处:edx中存放的是用户名,但是edx+8才是真实的用户名的存放位置,且是Unicode编码
  • 2.第二处:计算用户名长度存在eax中,但是eax+8位置的数据才是真实的用户名长度

step 2-2.用户名计算key

下面是对用户名处理的for循环逻辑,会取出每个用户名中的字符,累加得到最后结果

示例:test123经过for循环的计算结果为0x256

在这里插入图片描述

说明:rtcMidCharVar从字符串中取相应字符,VB中的MID函数,用法MID(“字符串”,“开始的位置”,“取几个字符”)

step 2-3.查看一下疑惑的地方

在这里插入图片描述

示例:test123经过for循环的计算结果为0x256,再乘十进制的1234567890,得到738271598220

上面2个疑惑的语句的作用就是将738271598220结果的第4位和第9位改成-,即得到真正的key:738-7159-220

在这里插入图片描述

step 2-4.简单验证猜想

最后将738-7159-220与用户输入的key进行比较,相等就弹出注册成功窗口;验证结果是ok,说明分析是正确的

在这里插入图片描述

提示:这种将最后的key在程序运行的某个时刻放在stack上是十分不安全的,但是很多程序却使用这种方式,这会导致只要耐心的单步调试,然后时刻观察stack就有可能发现真正的key

step 3.注册机

有了上面的分析,注册机很容易写出

#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
	char key[100] = {0};
	char user_name[100] = {0};
	printf("请输入用户名(长度>0):");
	scanf_s("%s", user_name, 100);

	//用户名每一位求和
	long long res = 0;
    for (int i = 0; i < strlen(user_name); i++) {
		res += user_name[i];
	}
	res *= 1234567890;

	//没有使用to_string,直接使用sprintf进行int -> string转换了
	sprintf(key, "%I64d", res);
	//替换第4位和第9位
	key[3] = '-';
	key[8] = '-';
	
	printf("用户名:%s, 对应的密码是%s\n", user_name, key);
	system("pause");
    return 0;
}

验证结果:

在这里插入图片描述

5.参考

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
反编译工具(VB Decompiler Pro):是一款针对使用Visual Basic 5.0/6.0开发的程序的反编译器。反编译工具(VB Decompiler Pro)可以被编译成伪代码p-code或native code模式。由于伪代码是由高级指令组成, 因此是很有可能反编译成源代码的(当然, 变量名,函数名等等是无法反编译的).反编译工具(VB Decompiler Pro)可以恢复众多伪代码指令,但要反编译成源代码还是有很多工作需要完成, 反编译器将帮助您更轻松的分析程序算法以及部分恢复源代码。 如果一个程序被编译成native code, 从机器码恢复源代码是几乎不可能的. 但即便是这种情形下VB Decompiler还是可以帮助你分析程序. VB Decompiler包含了一个强大的支持包含MMX和SSE的Pentium Pro指令集的反编译器. 它还包含一个代码分析器, 用于搜索所有API调用,汇编代码中的字符串引用并将结果修改为相应的注释。 加入一个程序被编译成.net汇编,反编译器将恢复所有的托管代码的数据表和模块,并且使用IL反汇编器反汇编所有的方法,函数以及事件。反编译并不需要.NET Framework并且支持所有的32位Windows操作系统。 VB Decompiler也将反编译文件中的所有的图形界面窗体以及控件。出于技术需要,反编译器可能显示所有控件的编译地址。 对于加壳的VB程序,首先需要脱壳后才能正常反编译。 总而言之, VB Decompiler是一款出色的程序分析工具. 尤其是当您不慎丢失源代码并且需要部分恢复原工程的时候。
VB Decompiler Pro Visual Basic能编译程序为p-code或native code形式的EXE, DLL或OCX文件. VB Decompiler Pro 能反编译Visual Basic 5.0/6.0的p-code形式的EXE, DLL 或 OCX文件。 对native code形式的EXE, DLL或OCX文件,VB Decompiler Pro 也能给出反编译线索。 如果一个程序被编译成native code, 从机器码恢复源代码是几乎不可能的. 但即便是这种情形下VB Decompiler还是可以帮助你分析程序. VB Decompiler包含了一个强大的支持包含MMX和SSE的Pentium Pro指令集的反编译器. 它还包含一个代码分析器, 用于搜索所有API调用,汇编代码中的字符串引用并将结果修改为相应的注释. 标准版及专业版VB Decompiler的功能介绍LitePro通用脱壳(支持UPX, NSPack以及一些其他常见的可执行文件压缩壳)反编译窗体(frm和frx)以及用户控制(ctl)对象文件完整的伪代码p-code反编译(解析操作码并转换为标准vb指令,反编译GUID对象)两种伪代码反编译模式(包含堆栈解析或不包含堆栈解析)反汇编native code过程(使用强大的Pentium Pro反汇编器,支持MMX及FPU指令集)反汇编native code过程中的字符串引用以及API调用(使用强大的Pentium Pro反汇编器,支持MMX及FPU指令集)部分反编译native code(使用代码仿真引擎)在反编译的代码中根据语法显示不同的颜色字符串引用列表以及搜索引擎快速反编译VB5/6程序的混淆工具VB5/6程序的修补工具将反编译的数据保存入单个DB文件反编译.Net程序将所有的过程列表保存入map文件, IDC脚本或是HIEW的Names文件价格
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值