• 逆向工程初步160个crackme-------4


    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来试探是否能注册成功(即达到目的)

  • 相关阅读:
    Linux系统操作问题汇总
    记录一些mysql数据库常用操作命令和问题汇总
    python学习之路-练习小程序02(模拟用户登录)
    python学习之路02(基础篇2)
    python学习之路-练习小程序01(猜年龄)
    python学习之路01(基础篇1)
    hashmap详解(基于jdk1.8)
    maven创建项目太慢怎么办
    CAS原理
    JUC原子类3-AtomicLongArray原子类
  • 原文地址:https://www.cnblogs.com/revercc/p/13287083.html
Copyright © 2020-2023  润新知