记一次简单的crackme

article/2025/11/2 9:33:01

好久没有更新博客了,发个之前做的一个crackme

crackme过程

观察观察程序

打开程序
在这里插入图片描述
随便输入点看看
在这里插入图片描述
猜测输入name,根据程序中的加密算法得到serial。找到name对应的serial即可成功破解

丢exeinfo,无壳,32位
,

调试(VB文件的一些了解

在这里插入图片描述

1)执行程序后,在EP代码中首先要做的就是调用VB引擎的主函数(ThuRTMain()),EP的地址为 00401238。
2)此处的PUSH 00401E14命令用来把**RT_MainStruct结构体的地址(401E14)**压进栈中。
3)然后0040123D地址处的命令 CALL 00401232命令调用401232地址处的JMP DWORD PTR DS:[4010A0]指令。
4)该JMP指令会跳转至VB引擎的主函数ThunRTMain()(前面压进栈的401E14的值作为函数的参数)
以上三行代码是VB文件的全部启动代码

间接调用

0040123D地址处的CALL 00401232命令用于调用ThuRTMain()函数,这里使用了较为特殊的技法。不是直接跳转到MSVBVM60.dll里的ThuRTMain()函数,而是通过中间00401232地址处的JMP命令跳转。
在这里插入图片描述
这就是VC++,VB编译器中常用的间接调用法
4010A0地址是IAT(导入地址表)区域,包含则会MSVBVM60.ThuRTMain()函数的实际地址

ThunRTMain()函数

在这里插入图片描述
上图显示了ThuRTMain()代码的开始部分,可以注意到地址完全不同了。这是MSVBVM60.dll模板的地址区域。换言之,我们分析的不是程序代码,而是VB引擎代码。只是简单了解一下哈哈哈,这就马上进入正题

分析crackme

说实话刚丢进dbg的时候,面对一大堆的汇编我也不懂啊(bushi
刚开始肯定是难事,作为小白开始的时候就可以先利用这个小程序的错误消息框和字符串这个切入点

检索字符串

xdbg检索字符串:运行程序,右键→搜素→字符串
在这里插入图片描述
这个就像是ida检索字符串捏
在这里插入图片描述
往上找找
在这里插入图片描述
其实到这里就很好理解了
使用某种算法,通过比较我们输入的serial和根据name及加密算法得到的serial,代码分真代码和假代码(也就是通过条件判断,serial相同则继续向下执行真代码(即输出你成功的消息),不同就直接跳转到00403408处的假代码(说我们输入错误
这也就是为什么我们要选它的提示错误消息框作为切入点的原因,它会进行判断决定跳转哪一部分的代码
在这里插入图片描述
(调用00403329地址的__vbaVarTstEq()函数,比较(test命令),返回值(AX),由403332地址判断是真还是假)

调用__vbaVarTstEq()函数比较字符串后,执行TEST命令(TEST命令为逻辑比较,仅改变EFLAGS寄存器而不改变操作数的值)检测AX的值是否为0,再由JE指令决定执行哪一部分代码。

相关知识点
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

查找字符串地址

在这里插入图片描述
00403329地址处调用&__vbaBarTstEq()函数,其上面的两条push指令为比较函数的参数。

那么**SS:[ebp-0x44]**等等又说明什么了吗?

SS是栈段,EBP是基址指针寄存器,换而言之,SS:[ebp-0x44]是栈内的地址,它恰好又是函数中声明的局部对象的地址(局部对象存储在栈内)
在这里插入图片描述
那思路就变得简单明了,在执行比较函数之前,会先将根据我们输入的Name加密算的serial和我们自己输入的serial压进栈,那么我们只需观察栈的窗口即可。
EAX的值–>存储我们输入的serial的地址
EDX的值–>存储正确的serial的地址
在这里插入图片描述
得到正确的serial。
在这里插入图片描述

下面就详细分析一下加密算法

生成serial的算法

很显然条件判断代码属于某个函数。该函数可能就是check按钮的事件处理程序。原因在于选择Check按钮后,该函数会被调用执行,且含有用户代码来弹出成功/失败的消息框

查看函数开始的地方,即check按钮的事件处理程序,典型的栈帧,在这设置断点开始调试
在这里插入图片描述

读取Name字符串的代码

在这里插入图片描述它的作用是将对象变量指向内存中的对象

可以看到name字符串(以字符串对象形式)存储到[ebp-88]地址

加密循环

在这里插入图片描述
上面循环的动作原理,就像是链表中使用next指针引用下一个元素一样,__vbaVarForInit(),__vbaVarForNext()可以让逆向分析人员在字符串对象中逐个引用字符。并且设置loop count(EBX)使其指定次数运转循环

实测仅使用接收的Name字符串中的前4个字符。在代码内检查字符串的长度,若少于4个字符,就会弹出错误消息框)

加密方法

我输入的Name字符串为"naruku"
在这里插入图片描述
查看栈窗口
在这里插入图片描述
查看相关内存
EDX:
在这里插入图片描述
EAX:
在这里插入图片描述
ECX:
在这里插入图片描述
运行以下(蓝色背景)函数
在这里插入图片描述
将加密后的值存储到ECX寄存器所指的缓冲区

此时的栈:EDX→D2=210(ord(n)+ 100(16进制:64))
在这里插入图片描述
D2就是serial的前两个字符

下面代码将D2转换为D
在这里插入图片描述
调用函数后,查看EAX所指的缓冲区,生成了 'D2’字符串
在这里插入图片描述
查看实际字符串的地址(00552E3C)。数字D2变为Unicode字符串D2
在这里插入图片描述
下面的代码将生成的字符串连接起来:
在这里插入图片描述
最后不断循环,生成以下的序列号

serial=old(“D2C5D6”)+add(“C9”)=“D2C5D6D9”

加密方法整理如下:

1)从给定的Name字符串前端逐一读取字符(共四次)

2)将字符转换为数字(ascii代码)

3)向变换后的数字加上密钥64

4)再次将数字转换为字符

5)连接变换后的字符

若有错误,欢迎指出更正!!
参考书籍:逆向工程核心原理,加密与解密


http://chatgpt.dhexx.cn/article/UICCdONy.shtml

相关文章

open62541 (R 1.1.2)中文文档 (译文)第一篇 (1 - 5)

open62541(R 1.1.2) 文档 注:原文PDF文档 是从官网下载的 Linux64bit的发布版本中自带的文档,原PDF中的源代码用PDF浏览器查看,有残缺。需要结合源文件中的示例代码进行相应的修改。或参考其它版本的文档。原文代码中…

深度学习实践——模型部署优化实践

系列实验 深度学习实践——卷积神经网络实践:裂缝识别 深度学习实践——循环神经网络实践 深度学习实践——模型部署优化实践 深度学习实践——模型推理优化练习 源码: 1. 对应的github地址 https://github.com/Asionm/streamlit_demo 2. 对应的gitee地…

基于python+pyqt+halcon实现视觉定位(halcon12.0)【附部分源码】

文章目录 前言演示视频一、项目文件目录讲解二、Qt Designer设置ui界面0.qrc资源文件的设置1.CtuImageMatching.ui的设置2.CameraSetting.ui的设置3.Calibration.ui的设置4.Helper.ui的设置 三、使用命令把qt文件转成py文件四、py文件解析1.CtuImageMatching.py重要函数解析2.C…

2019-10-28-dotnet-代码调试方法

titleauthordateCreateTimecategories dotnet 代码调试方法 lindexi 2019-10-28 08:50:11 0800 2019-6-5 9:4:44 0800 dotnet 本文将会从简单到高级,告诉大家如何调试 dotnet 的代码,特别是桌面端。本文将会使用到 VisualStudio 大量的功能,通…

2019-11-29-dotnet-代码调试方法

titleauthordateCreateTimecategories dotnet 代码调试方法 lindexi 2019-11-29 8:50:0 0800 2019-6-5 9:4:44 0800 dotnet 本文将会从简单到高级,告诉大家如何调试 dotnet 的代码,特别是桌面端。本文将会使用到 VisualStudio 大量的功能,通过…

前端开发 跨平台的构架GSOAP

前言:此文叙述了跨平台GSOAP,并对多线程在服务器上的实现做举例做了介绍 gSOAP是一个夸平台的,用于开发Web Service服务端和客户端的工具,在Windows、Linux、MAC OS和UNIX下使用C和C语言编码,集合了SSL功能。SOAP/XML…

【逆向】逆向练习及相关总结

文章目录 crakeme练习crackme1crackme2crackme3 解题步骤总结关键代码查找方法常见代码C类对象逆向分析C虚函数逆向分析系统dll文件的指令kernel32.dll、user32.dll、ntdll.dll文件TEB、PEB crakeme练习 crackme1 学到的知识点: main函数查找方法:运行…

JavaScript-js数组去重

1,利用Set()方法 let list [1,2,1,2,4,4,5] let Newlist Array.from(new Set(list)) console.log(Newlist)//输出[ 1, 2, 4, 5 ]2,新建一个数组,逐一保存原数组中的值,判断新数组中是否已有该数值,无则保存&#xff…

常用的JS数组去重方法大全

写在前面: 我们要想使用数组去重,那就必须对数组有一定的了解,关于JS数组的一些方法以及使用,可参考: ①JavaScript 内置对象之-Array ②ES5新增数组方法 ③浅谈JavaScript中ES6新增的Set和Map结构以及Array.from方法 …

js去重都有哪些方法?

1、去重方法一 arr.splice 2、去重方法二 借助新数组,判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中(原数组长度不变但被按字符串顺序排序) 3、创建一个新数组,判断新数组中是否存在该元素如果不存在则将此元素添加到新数组中 4、借助i…

JS中数组去重的五种方法

数组去重的几种方法(JavaScript版) 前言:你需要知道JavaScript中的 splice函数 的用法 splice函数介绍: splice函数用法:splice函数介绍看不懂没关系,怎么用一看例子一目了然 第一种:双重for循环去重 原…

js数组中对象去重的方法

一个数组中含有对象,并且去除数组中重复的对象 id相同的,保留第一个,其它的删除 let arr [{ id: 0, name: "张三" },{ id: 1, name: "李四" },{ id: 2, name: "王五" },{ id: 3, name: "赵六" },{…

js实现数组去重的方式(7种)

目录 JS数组去重的方式1.利用Set()Array.from()2.利用两层循环数组的splice方法3.利用数组的indexOf方法4.利用数组的includes方法5.利用数组的filter()indexOf()6.利用Map()7.利用对象 JS数组去重的方式 例:将下面数组去除重复元素(以多种数据类型为例…

js数组去重(9种方法),你都会了吗?

以下共有九种数组去重的方式和详解(包含对象数组去重): 1.利用Array.from(new Set)去重: // 1.利用set去重 // Set是es6新增的数据结构,似于数组,但它的一大特性就是所有元素都是唯一的,没有…

解决Linux没有ens33

#临时关闭 systemctl stop NetworkManager # 永久关闭网络管理命令 systemctl disable NetworkManager #开启网络服务 systemctl start network.service

【ubuntu虚拟机】ens33未出现在ifconfig问题

事情发生与2023年4月12日,windows上安装了docker-desktop,奈何wsl不好用,便卸载了,之后我的虚拟机ubuntu无法联网,于是开始解决之旅 事故原因 ifconfig查了一下,没有ens33网卡,于是用ip addres…

Centos开机后ens33网卡失效连不上网

今天使用xshell连接虚拟机一直失败 打开虚拟机ip addr 发现如下问题 解决方案 1.尝试重启网关 ifup ens33 (无法解决) # ifup ens332.停止网卡,设置disable后重新启动 (依旧失败) # systemctl stop NetworkManager…

centos7网络配置没有ens33文件

注意:此教程中的centos是已经能够上网的状态! 问题来源 需要使用centos7来搭建一些服务器,由于我用的VMware总是自己变ip并且不能设置,所以只能从centos系统配置文件下手 。 从网上教程来看,centos7 的网卡名叫 ens33&…

Linux 初始化网络配置ens33

配置文件路径: [rootnode2 ~]# vi /etc/sysconfig/network-scripts/ifcfg-ens33 TYPEEthernet BOOTPROTOstatic DEFROUTEyes IPV4_FAILURE_FATALno #IPV6INITyes #IPV6_AUTOCONFyes #IPV6_DEFROUTEyes #IPV6_PEERDNSyes #IPV6_PEERROUTESyes #IPV6_FAILURE_FATALno…

怎么修改Linux网络名为ens33,Centos7更改ens33网卡名称为eth0

用ifconfig查看网卡名称为ens33,现在要将它修改成eth0 [rootlocalhost ~]# ifconfig ens33: flags4163 mtu 1500 inet 192.168.1.3 netmask 255.255.255.0 broadcast 192.168.1.255 inet6 2409:8a02:9014:8440:20c:29ff:fe95:cc8f prefixlen 64 scopeid 0x0 inet6 f…