本帖最后由 srygg 于 2025-4-6 21:03 编辑
反编译了一个VB编写的程序,其中有一段代码是验证码的校验。因为反编译后的代码和实际编程时的代码有区别,求懂的高手指点一下,这段验证代码的计算方法。
软件运行后的用户ID是:F9F08-888FC-FAFF9-103
是不是注册码和"134245656756", "77896129807896"这两个参数运算后如果结果是“12567ABCDEF”就代表注册码是正确的?
[Visual Basic] 纯文本查看 复制代码 Dim var_150 As Variant
loc_0041660A: var_150 = var_29C
loc_00416642: var_154 = Registry.PropBag.WriteProperty("HKEY_LOCAL_MACHINE", global_0042306C, var_144)
loc_004166B0: global_52 = Proc_4_6_41FAF0("134245656756", "77896129807896", Me)
loc_004166DD: var_3C = GetTickCount(0)
loc_0041671D: var_50 = FormMain.TextSN.Text
loc_00416725: var_154 = var_50
loc_004167B2: global_00423074 = Trim(var_50)
loc_00416806: var_2C = Replace(global_00423070, "-", global_004
06734, 1, -1, 0)
loc_004168F5: If (Proc_1_1_41ABA0(Left(var_2C, Len(var_2C)(-2)), 0, 0) <> Right(var_2C, 2)) Then
loc_00416904: On Error Resume Next
loc_0041697F: var_803C = Proc_4_10_4219D0(P
roc_4_6_41FAF0(Proc_4_9_4210E0(Replace(global_
0423070, "-", "EA", 1, -1, 0), -1, fs:[00000000h]), "12345678", ), , )
loc_00416AA0: var_805C = Proc_4_3_41F300(Proc_4_11_421D60(Proc_4_6_41FAF0(Proc_4_9_4210E0(var_803C & "12567ABCDEF", , ), CStr(45389077), ), 19, 0), Proc_4_6_41FAF0(global_00423074, CStr(1911)))
loc_00416AC8: If var_805C Then
loc_00416B47: var_58 = Proc_4_6_41FAF0(global_00423074, "12345678")
loc_00416B55: var_54 = "SN"
loc_00416B63: var_50 = "HKEY_LOCAL_MACHINE"
loc_00416B90: Registry.var_50 = Forms
loc_00416B95: var_154 = var_2A8
loc_00416C10: var_150 = FormMain.TextSN
loc_00416C2A: var_150.Text = "注册成功,请重新启动程序。"
loc_00416C32: var_154 = var_150
loc_00416C7D: End If
loc_00416C86: On Error GoTo 0
重新整理一下思路,还是用OD入手,看看能不能整出个结果。
用OD打开程序后,用中文搜索引擎查找关键字。
一开始以为如此简单,直接跳转到这里就OK了,没想到没戏。初一看是注册成功了,实际读取密码时还是只显示前两位,和没注册前是一样的情况。
结果是在这里,那么从这段子程序的开始跑一下代码,看看能不能追到码。
参考其它贴子,这个了程序的开始处会有一个代码 push epb。那么往上翻一下,找一下。代码比较多,看得眼花缭乱,对OD的使用还是不太熟悉,有没有快捷的方法能找到最近的PUSH EPB呢?
用个笨办法,用VB Decompiler反编译程序,参考看一下验证注册码这段程序开始的位置。
再看OD里的代码,00416570找到验证注册码这个子程序的入口。
为什么是这个地方呢,我也是参考其它贴子里看来的。百度了一下,是这个原因,不知道理解对不对。
按F2,在这里下个断点。
再按F9运行程序,因为不知道正确的注册码是什么格式,先输入一串数字“1234567890”
再点注册,这行变灰了,程序停在了断点处。
再按F8开始单步执行。
在运行这个位置时,寄存器EAX出现了一长串的数字"10457217104811626634545376"
那么这串数字代表什么意思呢?
在之前的反编译后的代码里有这样两个数字
[Visual Basic] 纯文本查看 复制代码 loc_004166B0: global_52 = Proc_4_6_41FAF0("134245656756", "77896129807896", Me)
上面的结果正好是这两个数相乘的结果。
续按F2单步运行下去,在这个位置读取到了之前随便输入的注册码“1234567890”
继续往下走,到这一步时读取了机器码
这一步把机器码里“-”去除了
到这里出现了一个转折点,如果跳转出去的话就到不了验证成功这一步,所以在这里把Z的值改0,让程序不跳转
又到了一个转折点,还是修改Z的值为0,不让程序跳转
在修改了上面两个跳转点的指令后,随便输入一个注册码,出现注册成功的提示,要求重启软件,但是重启后还是显示未注册。
搞得头大!
|