软件逆向技术零基础入门19:VB语言开发的软件如何追踪注册码和注册机
当前位置:点晴教程→知识管理交流
→『 技术文档交流 』
启动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" 大概就是关键位置了。找以关键位置后下新的断点,其它断点都删除。开始分析它的算法吧。
__vbavartsteq 比较两个变量值是否相等 单步到这里有个API,在做比较。从上面反汇编代码看,比较的内容不相等,后面这个JE就跳转了。往下就直接提示失败了。看来这个JE是关键的PATCH点,将它修改或NOP掉。强制完成软件注册。 作为学习,我们继续分析它的算法,看能否找到注册码的生成算法。再次点击按钮,重新分析。
前面的CALL是调用系统API,这个位置它调用
应该是功能函数,估计具体算法是在这里面,F7进入看看它的详细代码。 进入后F8走,发现很长的一段代码可能在做初始化或一些混淆代码。走过很长一段代码来到这里在取假注册码
继续往下走,调用了个函数 rtcMidCharVar 的作用是从一个指定的字符串中,从某个起始位置开始,截取指定长度的子字符串,并将结果返回。其参数传递方式在反汇编代码中通常表现为: 参数1:起始位置(Start,通常为 I4 类型,即 32 位整数) 参数2:源字符串(Variant 类型) 参数3:截取长度(Length,I4 类型) 返回值:截取后的子字符串(存储在 EAX 寄存器中
往下走,有个串字符(UNICODE "bPe CrackMe v1.0 ")
执行完取值函数后,结果应该会保存在EAX中,我们查看下EAX的内容
看到堆栈中的内容,猜测它应该是读取到了内容并返回了所在位置。上面字符中第6位开始就是R。继续往下走,它会重复取值操作。 第二次字符串(UNICODE "bPe CrackMe v1.0 ") 第二次从9位取到了 0018F2C0 006067AC UNICODE "k"
__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 编辑过 |
关键字查询
相关文章
正在查询... |