文章目录

  • 查壳
  • 去Neg
    • 方法一 Timer搜索法
    • 方法二 4C法
      • Virtual Basic可执行程序结构研究
        • Virtual Basic程序框架结构
        • TVBHeader结构定义
        • AGUTTable(4C的位置)结构定义
      • 4C法实战
  • 破解序列号
    • 第一步
    • 第二步
    • 第三步
    • 第四步
    • 验证结果
  • 编写注册机

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

查壳

程序使用VB5.0写的无壳

去Neg

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

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

方法一 Timer搜索法

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

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

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

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

方法二 4C法

Virtual Basic可执行程序结构研究

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

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

Virtual Basic程序框架结构

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

TVBHeader结构定义
Signature                array[1..4] of char;        //00H签名,必须为VB5!
Flagl                   WORD;                       //04H.未知标志
LanguageDll             array[1..14] of char;       //06H语言链接库名,通常为”*"或者vb6chsdll
BackLanguageDll         array[1..14] of char;       //14H.后备语言链接库名
RuntimeDLLVersion       WORD;                       //22H运行库版本
Languageld              DWORD:                      //24H语言标识
BackupLanguageID        DWORD;                      //28H,未知标志
aSubMain                DWORD;                      //2CH,不为00000000则指向Sub MainO指针
aProjectlnfo            DWORD                      //30H.指针,指向tProjeclnfo结构
Plag2                   WORD;                      //34H未知标志
Flag3                   WORD;                      //36H.未知标志
Flag4                   DWORD;                     //38H未知标志
ThreadSpace             DWORD;                     //3CH.线程空间
Flag5                   DWORD;                     //14H未知标志
ResCount                WORD;                      //44H.数量,表示form与cls文件个数
ImportCount             WORD;                      //46H.数量,引用的ocx、dll文件个数
Flag6                   BYTE:                     //48H未知,可能代表运行时程序所占内存大小
Flag7                   BYTE;                     //49H未知,可能与程序启动时花费时间有关
Flag8                   WORD;                     //4AH.未知
AGUTTable               DWORD;                   //4CH.指针,指向Form GuI描述表
AExdCompTrble           DWORD;                    //50H指针,指向“引入的ocx、dll文件描述表
Aproicclpescrinion      DWORD;                   //54H,指针;指向tProjectDescriptionTable的指针
OProjectExename         DWORD                    //58H.偏移,Offset ProjectExename
OProjectTitle           DWORD;                   //5CH,偏移,Offset Projectitle
OHelpFile               DWORD;                   //60H.偏移,Ofset Helpile
OProjectName            DWORD.                   //64H.偏移,Offset ProjectName
AGUTTable(4C的位置)结构定义
Signature                DWORD                   //00H.必须是50000000
FomID                   TGUID                   //04,可能是以GUID方式命名的formID
Index                   BYTE                    //24H 窗体的序号
Flag1                   BYTE                    //28H 第一个窗体的启动标志,可能是90 也可能是10
AGUIDescriptionTable    DWORD                   //48H指针指向以“FFCC…“开始的FormGUI表
Flag3                   Dword                   //4CH.意义不明

AfKayAs.2.Exe为例说明:

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

offset 含义
00H VB5!
04H
06H 语言链接库名
14H
22H 04代表msvbvm50.dll版本
24H 语言标识
28H
2CH 00000000表示非由sub_main启动
30H 指向ProjectInfo结构
34H
36H
38H
3CH
40H
44H 只有2个FROM
46H 引用的OCX DLL文件个数为0
48H
49H
4AH
4CH Ptr 0040126C
50H 若没有引入的ocx,dll文件,此指针无效
54H 指向tProjectDescriptionTable的指针
58H ProjectExename
5CH ProjectTitle
60H HelpFile
64H ProjectName

4C法实战

在程序载入到入口点之后的第一个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

160个Crackme003之4C大法详解相关推荐

  1. 160个Crackme026之六段式注册码详解

    文章目录 查壳 分析程序 算法分析 基础校验 第一部分 第二部分 第三部分 第四部分 第五部分 第六部分 写出注册机 验证结果 查壳 这个Crackme也是用VB写的,难度是问号,自我感觉应该值三颗星 ...

  2. Keras大法(4)——Dense方法详解

    Keras大法(4)--Dense方法详解 (一)keras.layers.Dense方法 (二)使用示例 (三)总 结 (一)keras.layers.Dense方法 在开始定义模型之前,我们有必要 ...

  3. Vue项目使用symbol的方式引入svg图标和svg path大法d属性详解,section标签

    symbol标签 svg path大法d属性详解 section标签

  4. ext4数据恢复实战及文件系统结构详解

    ext4数据恢复实战及文件系统结构详解 一.前言 二.ext4数据恢复实战 三.ext4文件系统结构详解 四.ext4分区结构 五.ext4目录结构 六.目录项的删除特性 七.ext4文件结构 八.最 ...

  5. GoogLeNet网络详解与模型搭建

    文章目录 1 模型介绍 2 GoogLeNet详解 Inception模块 辅助分类器 3 GoogLeNet网络结构 4 Pytorch模型搭建代码 1 模型介绍 GoogLeNet是2014年Ch ...

  6. Matplot pyplot绘制单图,多子图不同样式详解,这一篇就够了

    Matplot pyplot绘制单图,多子图不同样式详解,这一篇就够了 1. 单图单线 2. 单图多线不同样式(红色圆圈.蓝色实线.绿色三角等) 3. 使用关键字字符串绘图(data 可指定依赖值为: ...

  7. Python必备基本技能——命令行参数args详解

    Python必备基本技能--命令行参数args详解 1. 效果图 2. 源码 2.1 简单命令行参数 2.1 轮廓检测源代码 参考 这篇博客将介绍一项开发人员.工程师和计算机科学家必备的技能--命令行 ...

  8. 以SIGSEGV为例详解信号处理(与栈回溯)

    以SIGSEGV为例详解信号处理(与栈回溯) 信号是内核提供的向用户态进程发送信息的机制, 常见的有使用SIGUSR1唤醒用户进程执行子程序或发生段错误时使用SIGSEGV保存用户错误现场. 本文以S ...

  9. 【OpenCV 4开发详解】轮廓外接多边形

    本文首发于"小白学视觉"微信公众号,欢迎关注公众号 本文作者为小白,版权归人民邮电出版社发行所有,禁止转载,侵权必究! 经过几个月的努力,小白终于完成了市面上第一本OpenCV 4 ...

最新文章

  1. Michael Jordan、Sutton、Silver等人,刚刚入选英国皇家学会会士
  2. hive sql操作
  3. 关于红酒的资料收集-2
  4. Linux系统中用户的管理
  5. 默认选中_双击dwg图纸,怎么设置默认天正打开?
  6. CodeSmith应用(四):实现选择路径对话框
  7. PyTorc 1.0 中文文档:扩展PyTorch
  8. 中恒电气成小鹏汽车充电桩供应商 今日涨停
  9. 无线路由器CPU浅析 MT7621A、 BCM47189 到底谁强?
  10. 中兴ZXVb860av2.1t刷机固件,芯片晶晨S905l-b,不失效线刷包,当贝桌面
  11. 杭州电子科技大学acm--2016
  12. Base64Utils 快速使用
  13. Imbalance data——数据不平衡问题
  14. Elementui蓝色阴影边框相关问题的解决方案
  15. 企业引入人脸识别考勤 想要代打卡?没门!
  16. [集合下载]邵式经典不完全收录 141部[59G]
  17. matlab 函数,matlab 语法1
  18. php 抓取弹幕,php实现斗鱼弹幕,一起来欣赏弹幕吧~
  19. 计算机的应用主要有哪几个,计算机的应用主要有哪几个方面?
  20. b站黑马程序员python基础学习

热门文章

  1. WSL:WSL(Windows Subsystem for Linux)的简介、安装、使用方法之详细攻略
  2. ML之LiR之PLiR:惩罚线性回归PLiR算法简介、分类、代码实现之详细攻略
  3. ML之LiR:基于编程实现简单线性回归案例
  4. OS_CORE.C(9)
  5. OS_CORE.C(5)
  6. iview area 遇到的坑
  7. Oracle 体系结构2 - 共享和专用服务器
  8. 如何解决IIS7上传文件大小限制【转】
  9. AB1601 PWM模块
  10. binarytreenode”使用 类 模板 需要 模板 参数列表_c++1117 模板核心知识(一)—— 函数模板...