首页
社区
课程
招聘
[原创]160个CrackMe003详细分析
发表于: 2019-2-28 15:20 12636

[原创]160个CrackMe003详细分析

2019-2-28 15:20
12636

之前在网上搜索了下关于这个Crackme的分析,好像并没有看到比较详细的分析文章,4C法的原理也没有解释的很清楚。所以就发出来了。

程序使用VB5.0写的无壳

程序打开后 会有大概7秒的弹窗

在这7秒内 什么都不能干,所以第一件事就是把这个7秒的neg给去掉

首先将内存定位到程序开始处0x401000

搜索Timer,Timer是VB程序默认的定时器变量,

我们找到Timer之后 在上面的位置可以看到一个0x1B58,这个是计时器的秒数。也就是十进制的7000,7000毫秒就是7秒。所以第一种去Neg的方法就是将0x1B58改为0x0001

但是此种方法也有一定的局限性,如果程序的作者将计时器的默认名称改掉之后 根本无法在内存中搜索到Timer关键字 也就无法下手。下面介绍一种通用的解决方法

对于Visual Basic5/6编译生成的程序,不管自然编译还是伪编译,其程序入口点处的结构都是一样的。来到OEP处:


指针0x4067D4指向的结构就是Virtual Basic程序的VBHeader结构,由此伸展开,整个VB程序的框架就在这了。

可能的Virtual Basic程序框架结构如图

AfKayAs.2.Exe为例说明:

其对应每个字节的含义如下表

在程序载入到入口点之后的第一个push也就是VBHeader的位置,数据窗口跟随。

然后在数据窗口输入刚才的地址+4C,找到form GUI描述表的指针

数据窗口跟随DWORD

接着会来到一块有规律的数据区域,每一个小块的数据是每一个窗体的信息,其中00和01是窗体的序号 而10是第一个窗体的启动标志。

所以 我们只要把第一个窗体数据块的00改成10 然后把第二个窗体的数据块的10改成00,或者将窗体的序号调换。即可去除neg。

这个程序和002那个程序一模一样 无非是换了套浮点算法而已 就算你看不懂浮点指令 也可以通过单步跟踪 观察FPU栈的数值猜测到序列号

首先输入一个错误的用户名和序列号

下面是验证步骤

还是和002一样 获取用户名长度 然后根据得到的结果算出来一个值 我这里这个结果为622287

第二步 首先将刚才计算的结果转为浮点数 放入到FPU栈 然后将结果加上2.0 得到622289。逆向这个程序你并不需要看懂每一条浮点指令,只需要单步跟踪 然后时时观察FPU栈的情况。

还是将刚才的结果转为浮点数并入栈 然后将622289乘以一个值再减去一个值 最后得到结果ST0=1866865

将刚才的结果1866865减去一个值 得到结果1866880 到此校验就结束了

接下来使用Keymake编写注册机,设置如下

接着运行注册机 出现了正确的序列号,至于为什么会出现两次,这个我也不知道,这个软件我用的并不熟。哈哈 就这样吧。

需要udd文件和分析文档的可以到我的Github下载:https://github.com/TonyChen56/160-Crackme

 
 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2019-4-27 14:00 被鬼手56编辑 ,原因: 图片失效
收藏
免费 3
支持
分享
最新回复 (3)
雪    币: 26
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
厉害
2019-2-28 21:20
0
雪    币: 1434
活跃值: (3054)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
3
TVBHeader是什么,我在网上只查到了VBHeader
2022-4-5 13:20
0
雪    币: 2436
活跃值: (2023)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
对去NAG还是没理解,有人指点一下吗?
1,改启动标志:将上面那个窗口启动标志改为10,下面那个窗口改为00,是不是就先启动上面那个窗口,后运行下面那个窗口,而去除NAG。
2,改窗口序号:如果改启动标志我没有理解错的话,把上下两个窗口序号改了,启动标志10还是下面那个窗口,那么先启动的不还是下面那个窗口吗?
2022-6-29 16:44
0
游客
登录 | 注册 方可回帖
返回
//