LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

软件逆向技术零基础入门19:VB语言开发的软件如何追踪注册码和注册机

admin
2026年1月23日 17:59 本文热度 89
    本篇一起学习下VB语言编写的软件,这也是一个软件逆向入门练习用的CRACKME程序。

    作为一个VB语言编写的软件,本篇和大家一起学习下网上说的VB万能断点法,找它的关键位置。
    网上说的万能断点法针对按钮事件 取消NAG,启动框,灰色按钮或隐藏按钮,启动时的timer事件等都可用。具体方法如下:

启动OllyDBG,将软件拖入后,在程序模块中按下CTRL+B 查找 “816C2”,搜索到的地址都按F2下好断点。然后返回软件界面按下功能按钮,看它断在哪个位置,JMP返回的就是按钮的事件代码了。

    将搜索到的地址全下好断点后,输入假的注册码GZH:IT0365,点击按钮看软件会断在哪个位置:

按下按钮后,返回到OD中查看

F8单步返回到按钮事件代码中

查找整个反汇编代码看到有注册成功的字样

00402DF7   .  C745 9C D4224>mov dword ptr ss:[ebp-0x64],19.004022D4  ;  UNICODE "Registration Successful"

大概就是关键位置了。找以关键位置后下新的断点,其它断点都删除。开始分析它的算法吧。

00402DA0   .  51            push ecx                                 ; /var18 = 0060038400402DA1   .  52            push edx                                 ; |var28 = 0018F3CC00402DA2   .  C745 901000>mov dword ptr ss:[ebp-0x64],0x1          ; |00402DA9   .  C745 94 02800>mov dword ptr ss:[ebp-0x6C],0x8002       ; |00402DB0   .  FF15 6C614000 call dword ptr ds:[<&MSVBVM50.__vbaVarTs>; \__vbaVarTstEq

__vbavartsteq 比较两个变量值是否相等

单步到这里有个API,在做比较。从上面反汇编代码看,比较的内容不相等,后面这个JE就跳转了。往下就直接提示失败了。看来这个JE是关键的PATCH点,将它修改或NOP掉。强制完成软件注册。

     作为学习,我们继续分析它的算法,看能否找到注册码的生成算法。再次点击按钮,重新分析。

00402D65   .  56            push esi00402D66   .  897D E8       mov dword ptr ss:[ebp-0x18],edi00402D69   .  897D E4       mov dword ptr ss:[ebp-0x1C],edi00402D6C   .  897D D4       mov dword ptr ss:[ebp-0x2C],edi00402D6F   .  897D C4       mov dword ptr ss:[ebp-0x3C],edi00402D72   .  897D B4       mov dword ptr ss:[ebp-0x4C],edi00402D75   .  897D A4       mov dword ptr ss:[ebp-0x5C],edi00402D78   .  89794       mov dword ptr ss:[ebp-0x6C],edi00402D7B   .  89784       mov dword ptr ss:[ebp-0x7C],edi00402D7E   .  FF93 F8060000 call dword ptr ds:[ebx+0x6F8]            ;  19.00401F1100402D84   .  3BC7          cmp eax,edi00402D86   .  712         jge short 19.00402D9A

前面的CALL是调用系统API,这个位置它调用

call dword ptr ds:[ebx+0x6F8]

应该是功能函数,估计具体算法是在这里面,F7进入看看它的详细代码。

进入后F8走,发现很长的一段代码可能在做初始化或一些混淆代码。走过很长一段代码来到这里在取假注册码

继续往下走,调用了个函数

rtcMidCharVar 的作用是从一个指定的字符串中,从某个起始位置开始,截取指定长度的子字符串,并将结果返回。其参数传递方式在反汇编代码中通常表现为:

‌参数1‌:起始位置(Start,通常为 I4 类型,即 32 位整数)

‌参数2‌:源字符串(Variant 类型)

‌参数3‌:截取长度(Length,I4 类型)

‌返回值‌:截取后的子字符串(存储在 EAX 寄存器中

往下走,有个串字符(UNICODE "bPe CrackMe   v1.0                        ")

到CALL位置,看到堆栈中的调用参数。反汇编代码中看到,它是从字符串中第6位开始取2位

执行完取值函数后,结果应该会保存在EAX中,我们查看下EAX的内容

看到堆栈中的内容,猜测它应该是读取到了内容并返回了所在位置。上面字符中第6位开始就是R。继续往下走,它会重复取值操作。

第二次字符串(UNICODE "bPe CrackMe   v1.0                                ")

第二次从9位取到了

0018F2C0   006067AC  UNICODE "k"

因篇幅都是在重复取值就不截图了,最终取完值在堆栈中可以看到全部内容:
执行完后,又调用了个API:

__vbavaradd 两个变量值相加

和前面内容一样都是在重复操作。前面取出了值,后面在进行拼接,堆栈中可以看到

拼接完的内容

大概猜测这里的

0018F130   006068C4  UNICODE "rkh1oyie"

应该就是正确的注册码了。

拼接完后,又进行了个比较。应该就是真假码对比了。在堆栈中可以看到在进行

004038B6   .  50            push eax                                 ; |var28 = 0018F128

004038B7   .  FF15 6C614000 call dword ptr ds:[<&MSVBVM50.__vbaVarTs>; \__vbaVarTstEq

至此程序算法部分就分析完了。

大概算法思路:从一个字符串中不同位置取一个字符出来,最后进行拼接得到最终注册码。


阅读原文:https://mp.weixin.qq.com/s/xqF7C15j_pkmQNSirfz5tw


该文章在 2026/1/23 17:59:15 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2026 ClickSun All Rights Reserved