crackme–3因为涉及到浮点数操作以及一些指令和寄存器(由于本人对浮点指令不了解),所以先隔过去分析后面的程序。

工具:1. 按钮事件地址转换工具E2A

2. PEID

3. Ollydbg

首先:我们先来运行一下程序熟悉程序的基本情况

让输入用户名和注册码,并且注册成功后会显示一张朱茵小姐的照片。

好我们正式开始分析,先用PEID查看程序的基本信息。

其是用Delphi写的32位程序。随后我们载入OD后运行程序,随便输入用户名和注册码程序没有反应,尝试一下字符串搜索,打开字符串搜索后我们发现

恭喜恭喜,注册成功

nb,直接双击查看相关代码。我们往上找到函数头部其地址为00457fb8

我们用E2A打开程序看看所有按钮事件的地址

发现图片框单击事件对应的地址也为00457fb8,所以此处为单击事件的处理地址

我们在函数头下断点下完断点之后单击图片框后程序会断在此处,然后F8单步执行,遇到一条比较和跳转指令,且此跳转指令会掠过:恭喜恭喜,注册成功,我们先强制设置eIP为0045803d(即让其不跳转),然后在点击执行最后程序注册成功,显示出来一张朱英的照片所以说明只要程序单击图片框且在此处不跳转则其就会注册成功。

我们重新加载程序,并分析跳转处的代码

cmp dword ptr ds:[esi+0x30C],0x85
jnz XCKme.004580B3

当esi+0x30c地址处的数据为0x85时其就可以实现不跳转(即注册成功)。

esi+0x30c 等于021B1BF0,在输入窗口中查看其为0,所以必须有操作使其为0x85

打开E2A我们看看其他按钮事件的处理,我们看到除了单击事件外还有一个双击事件,很可疑我们根据其地址,在OD中查看

我们在双击按钮事件地址头部下段,并双击图片框程序会停在此处,我们F8单步跟踪看看其会不会使021B1BF0数据变为0x85(注意在这之前要把单击事件的断点删除,否则双击的时候其会断在单击事件断点处)

F8向下执行发现一处比较跳转指令,看到0x85比较可疑分析一下

`00457EF5 |. 83BE 0C030000>cmp dword ptr ds:[esi+0x30C],0x3E

00457EFC |. 75 0A jnz XCKme.00457F08

00457EFE |. C786 0C030000>mov dword ptr ds:[esi+0x30C],0x85

00457F08 |> 33DB xor ebx,ebx

`

如果esi+0x30c地址处的数据等于0x3e,则不跳转并把地址处的数据改为0x85

正好esi+0x30c == 021B1BF0,所以只要此处不跳转即可注册成功,

要想不跳转即esi+0x30c地址处的数据得为0x3E,所以继续跟踪021B1BF0地址看看什么操作可以使其数据变为0x3E

打开E2A查看其他按钮处理事件看到注册码控件的处理事件地址,在OD上搜索并跟踪在函数头处下断点看看其能不能使021B1BF0地址处的数据变为0x3E,(要想让程序断在此处必须改变注册码控件的内容)

断在此处后在F8单步向下执行,又发下一处跳转指令,且看到OX3E数据,分析此处代码

00457D35  |.  E8 52BFFAFF   call CKme.00403C8C
00457D3A |. 75 0A jnz XCKme.00457D46
00457D3C |. C783 0C030000>mov dword ptr ds:[ebx+0x30C],0x3E

执行完00403c8c函数后如果不跳转则会把ebx+0x30c地址处的数据变为0x3E,ebx+0x3e等于021B1BF0,所以当只要不跳转就可以注册成功(可以强制改变EIP验证),

函数00403c8c函数为关键函数,单步进入函数进行分析其是比较esi所指的数据与edi所指数据是否相等,esi值为021B5A7C所指的数据为(其就为真注册码)而esi所指的数据为我们输入注册码,我们需要知道esi所指的真注册码是怎么产生的,我们在数据窗口中追踪,并往关键函数上分析发现

在此函数处堆栈中显示出了真序列号的各个片段,其中第一个参数为用户名,第二个本身就存在,第三个为局部变量2,需追踪局部变量2是如何产生的

往上追踪发现,

局部变量2为用户名的长度加5产生的(以asiic形式存在),

所以最后得到注册码为:黑头Sun Bird用户名+5dseloffc-012-OK用户名

总结:有关Delphi的程序,可以利用按钮事件地址转换器分别分析其各个按钮事件(尤其注意一些判断转移指令),可以采用显式改变eip来试探是否能注册成功(即达到目的)

逆向工程初步160个crackme-------4的更多相关文章

  1. 逆向工程初步160个crackme-------2

    有了第一个crackme的经验后,这个crackme用了半个小时就验证成功了.(思路和第一个crackme相似) 动态调试工具:ollydbg (2.10) 文件分析工具:PEID (0.95) 同样 ...

  2. 逆向工程初步160个crackme-------7

    这两天有点发烧,被这个疫情搞得人心惶惶的.我们这里是小镇平常过年的时候人来人往的,今年就显得格外的冷清.这是老天帮让在家学习啊,破解完这个crackme明天就去接着看我的加密解密,算了算没几天就开学了 ...

  3. 逆向工程初步160个crackme-------1

    放假在家学习的效率真的很低,看完看雪加密解密的前两章就迫不及待的找了几个crackme练习一下,顺便熟悉ollydbg的使用. 工具:exeinfope(查壳工具),ollydbg(2.10版) 1. ...

  4. 逆向工程初步160个crackme-------3

    这个Crackme3 涉及到浮点指令以及浮点数的存储与运算,我没学习过浮点指令,不得不从网上恶补了1个小时,一边看汇编指令一边百度其指令含义. 回头得好好补补这方面的知识了,太菜了! 我大致了解了一下 ...

  5. 逆向工程初步160个crackme-------6

    工具:1. 按钮事件地址转换器E2A 2. PEID 3. Ollydbg 同样我们先来运行一下这个程序, ok按钮是被禁用的,有一个help按钮点击后弹出一个消息框:消息框显示提示信息为.本程序需要 ...

  6. [反汇编练习]160个CrackMe之001

    [反汇编练习] 160个CrackMe之001. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  7. [反汇编练习] 160个CrackMe之027

    [反汇编练习] 160个CrackMe之027. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  8. [反汇编练习] 160个CrackMe之026

    [反汇编练习] 160个CrackMe之026. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

  9. [反汇编练习] 160个CrackMe之025

    [反汇编练习] 160个CrackMe之025. 本系列文章的目的是从一个没有任何经验的新手的角度(其实就是我自己),一步步尝试将160个CrackMe全部破解,如果可以,通过任何方式写出一个类似于注 ...

随机推荐

  1. Blind Super-Resolution Kernel Estimation using an Internal-GAN 论文解读

    背景与思路来源 目前 SR 模型中合成 LR 使用的模糊核问题 目前大多数 SR 的 model 都是用的合成下采样图片来进行训练的,而这些合成的图片常常使用的是 MATLAB 里面的 imresiz ...

  2. P1255_数楼梯(JAVA语言)

    思路:BigInteger 四杀! 简单递推,注意long会超范围 题目描述 楼梯有N阶,上楼可以一步上一阶,也可以一步上二阶. 编一个程序,计算共有多少种不同的走法. 输入输出格式 输入格式: 一个 ...

  3. 解Bug之路-主从切换"未成功"?

    解Bug之路-主从切换"未成功"? 前言 数据库主从切换是个非常有意思的话题.能够稳定的处理主从切换是保证业务连续性的必要条件.今天笔者就来讲讲主从切换过程中一个小小的问题. 故障 ...

  4. Flutter Widget中的State

    一.Flutter 的声明式视图开发 在原生系统(Android.iOS)或原生JavaScript 开发的话,应该知道视图开发是命令式的,需要精确地告诉操作系统或浏览器用何种方式去做事情. 比如,如 ...

  5. javascript 取自己

    var own=docment.currentScript;

  6. 如何在CMDB中落地应用的概念?

    如何在CMDB中落地应用的概念? 我们前面讲了应用是整个微服务架构体系下运维的核心,而CMDB又是整个运维平台的基石.今天我就讲讲在CMDB中如何落地应用这个核心概念,以及如何建立应用集群分组的思路. ...

  7. python基础(四):切片和索引

    Python中的序列有元组.列表和字符串,因此我们都可以通过索引和切片的方式,来获取其中的元素. 索引 Python中的索引,对于正向索引,都是从0开始的.但是对于反向索引,确实从-1开始的.如图所示 ...

  8. 【剑指offer】9:变态跳台阶

    题目描述: 一只青蛙一次可以跳上1级台阶,也可以跳上2级--它也可以跳上n级.求该青蛙跳上一个n级的台阶总共有多少种跳法. 解题思路: 先考虑最简单情况就是只有一级台阶,仅有一种跳法.两级台阶,有两种 ...

  9. PAT B1039/A1092 到底买不买项链

    小红买些珠子做项链,但是卖家不肯拆散了卖,于是帮忙判断一下,某串珠子是否全部包含自己想要的珠子,如果是告诉她有多少多余的珠子,如果不是,又缺了那些珠子现在为了方便起见用"0-9"& ...

  10. Leedcode算法专题训练(贪心)

    1. 分配饼干 455. 分发饼干 题目描述:每个孩子都有一个满足度 grid,每个饼干都有一个大小 size,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足.求解最多可以获得满足的孩子数 ...