CrackMe004:Darkde工具+.MAP辅助OD调试

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

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

CrackMe004和CrackMe005是同一个作者用Delphi写的小程序;由于平时逆向C++程序多一些,因此CrackMe005就没有逆向

在这里插入图片描述

1.现象

程序输入用户名和验证码后,没有提示信息,也没有验证按钮弹出,此时CrackMe001的关键字符串思路应该失效了;不过据说输入正确的验证码会显示一张美女的图片

在这里插入图片描述

2.逆向思路

常规的通过错误提示框中特定字符串为突破口的方式对本程序失效,需要寻找新的突破口,先看一下程序是用什么语言编写的

注意:如果看过上面介绍,这里就操作了寂寞;其实这步还是很有用的,因为正常逆向程序前,都要运行一下程序,看一下程序使用的编程语言和是否有壳等基本信息,后面笔记也会有这个步骤

在这里插入图片描述

程序使用Delphi语言编写,无壳;可以使用Delphi的反编译工具Darkde4尝试看看能不能找到突破口

step 1.寻找突破口?

  • 窗体部分

直接双击模块,会弹出详细信息,会发现本来以为会显示图片的控件是一个按钮,且关联了2个事件(单击和双击事件)

在这里插入图片描述

  • 过程部分

描述整个程序的所有响应事件和对应的RVA(相对偏移地址,相对内存映像基地址的偏移);下面有5个事件,在窗体部分可以看到与控件的对应关系

在这里插入图片描述

突破口1:通过单击和双击事件,用相应的RVA可以直接在OD中查找函数入口(OD的反汇编窗口显示的地址就是RVA形式,其实这里的RVA是有误导的,在PE中这应该叫VA),分析函数的具体实现

在这里插入图片描述

step 2.单击事件

提示:OD分析程序前,可以使用IDA生成MAP文件供OD调试用,这样可以提高逆向的效率;笔记里基本上OD都是导入了IDA分析的MAP文件后,才开始OD的调试的

单击事件Panel1Click的RVA是0x457FB8,在这个地址处设置断点,输入用户名和注册码(test123456);断点命中后分析函数执行流程

下面是单击事件入口处的截图,OD界面的显示效果可以根据自己的习惯进行设置(下面截图也给出了设置位置)

在这里插入图片描述

下面是单击事件处理逻辑的主要部分的截图,可以看到通过分析,爆破的结果也展示出来了

注意:下面是使用OD作为主要逆向工具才会有这么详细的截图的,后续笔记很多都是结合OD和IDA分析的,因为IDA更好的代码展示,呈现处理逻辑时,很多用的都是IDA了

在这里插入图片描述

上述函数执行流程汇总:

  • 1.获取用户名,将用户名长度 + 0x1E的结果转化成字符串
  • 2.拼接:步骤1的字符串 + 用户名 + 循环次数;累计循环18次,因此用户名test123,计算结果是“37test12318”
  • 3.比较:[esi+x0x30C]的值与0x85是否相等?不相等直接退出,相等进行另一个类似的重复校验,接着会显示一副美女图片

结论:通过函数处理的流程发现,只有第3步是关键,第1和2步相当于分析了个寂寞…(如果使用IDA分析,很容易就看到跳过步骤1和步骤2);一句话,[esi+0x30C]的值要求是0x85

注:如果暴力破解的话,分析流程已经结束了,后面就不用看了

step 3.双击事件

分析完单击事件,取消单击事件设置的断点,用同样的套路分析双击事件

这次吸取教训,先看看双击对用户名的整个流程;发现真正有用的是[esi+x0x30C]的值与0x3E是否相等?相等,将[esi+0x30c]赋值成0x85单击事件的关键跳转需要的条件

00457E7C >/.  55  push    ebp                          ;_TForm1_Panel1DblClick,双击事件的响应函数
...
00457EF5  |.  83B>cmp     dword ptr ds:[esi+30C], 3E   ;关键比较,要求是0x3E
00457EFC  |.  75 >jnz     short <loc_457F08>           ;关键跳转
00457EFE  |.  C78>mov     dword ptr ds:[esi+30C], 85   ;如果[esi+30C]0x3E,则[esi+30C]=0x85(单击事件的要求)
00457F08 >|>  33D>xor     ebx, ebx
...

暴力破解:如果暴力破解的话,将00457EFC处的汇编指令改成nop;每次先双击一下显示图片的界面,再单击一下,就会显示出图片

step 4.寻找第二个突破口

通过分析单击事件([esi+0x30C]值是0x85)、双击事件([esi+x0x30C]值是0x3E)的关键跳转需要的条件发现,只要满足[esi+x0x30C]值是0x3E,2个事件就会同时满足,因此看看代码里什么时候将[esi+x0x30C]赋值为0x3E作为下一个突破口

在OD中,右键 -> Search for -> All constants中输入3E,查看是否有对[esi+x0x30C]赋值语句?

在这里插入图片描述

找到一个怀疑点,定位到相应的反汇编代码,找到对应的函数的入口,发现是_TForm1_chkcode函数

在这里插入图片描述

如果还记得Darkde4的话,会发现_TForm1_chkcode函数是注册码输入框键盘按键弹起的响应函数,猜测这个函数就应该是写出程序注册机的关键函数

在这里插入图片描述

step 5.chkcode事件分析

_TForm1_chkcode函数处设置断点;输入注册码时,当输入第一个字符时就命中断点(因为有键盘弹起的操作)

在这里插入图片描述

注意:分析这个程序要吸取教训,作者很喜欢设置一些无关紧要的运算逻辑进行干扰

可以先从第二个突破口开始分析,分析附近代码会发现,用户名"test123"对应的正确的序列号是"黑头Sun Bird12dseloffc-012-OKtest123"

在这里插入图片描述

用这个分析出来的正确序列号验证一下是ok的(先双击后单击才可以),说明分析的是正确的

在这里插入图片描述

为了写出注册机器,需要分析一下正确序列号生成逻辑

在这里插入图片描述

正确逻辑:先获取用户名长度,加5转换成十进制,然后用特定字符串执行拼接公式:"黑头Sun Bird"+用户名长度+"dseloffc-012-OK"+用户名

step 6.注册机

#include "StdAfx.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
	char pwd1[30] = "黑头Sun Bird";
	char pwd2[30] = "dseloffc-012-OK";
	char user_name[100] = {0};
	printf("请输入用户名:");
	scanf_s("%s", user_name, 100);
	printf("对应的序列号:%s%d%s%s\n", pwd1, strlen(user_name) + 5, pwd2, user_name);
	system("pause");
    return 0;
}

用注册机生成的用户名和序列号,先双击一下显示图片位置,再单击,显示出图片,验证结果:

在这里插入图片描述

3.扩展:MAP文件辅助OD进行调试

OD分析程序前,让IDA帮忙自动添加一些函数的签名,这在处理不熟悉的编程语言时很用,当然也可以将自己的一些分析一起进行保存,下面是CrackMe004案例的分析结果

在这里插入图片描述

只有个别的函数没有分析成功,这大大减轻了分析的工作量,下面是生成MAP文件给OD使用的方法:

step 1.IDA操作生成.MAP文件

在这里插入图片描述

step 2.OD导入.MAP文件

步骤:OD->插件->LoadMapEx加载MAP文件

下面是OD加载MAP文件前后的对比,只要使用过一次MAP文件,相信下次再逆向程序时,你一定先用IDA分析一波

在这里插入图片描述

4.参考

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 [安全攻防进阶篇] 中,有关于逆向分析的教程可以帮助你了解如何使用OllyDbg逆向CrackMe程序。 OllyDbg是一种常用的逆向工具,可以用于分析和修改程序的执行流程和内存。使用内存断点和普通断点,可以在程序执行过程中捕获关键的代码位置,帮助我们找到CrackMe程序的OEP(Original Entry Point),即程序的入口点。 在 [安全攻防进阶篇] 中还有关于逆向分析两个CrackMe程序的详细教程,包括逆向分析和源码还原的步骤。这些教程将帮助你理解逆向分析的基本概念和技巧,提升你的安全能力。 如果你想深入学习如何使用OllyDbg逆向CrackMe程序,可以参考这些教程。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [[安全攻防进阶篇] 六.逆向分析之OllyDbg逆向CrackMe01-02及加壳判断](https://blog.csdn.net/Eastmount/article/details/107777190)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [逆向crackme之ESp定律脱壳](https://blog.csdn.net/qq_58970968/article/details/125357834)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值