本帖最后由 船到桥头自然沉 于 2026-10-13 23:09 编辑
这是多年前写的:https://www.52pojie.cn/thread-166587-1-1.html
后来一直想写注册机,但是能力和精力有限就放弃了,随着AI的发展,现在真的是太简单了!
下面内容全部是AI完成!
pdf2word.exe — CDK / 注册码机制反编译报告
目标: https://pan.baidu.com/share/link?shareid=61612&uk=2953959824&_at_=1791898812856(2.78MB)
形态: Inno Setup 5.2.3 安装包(外层 Delphi 引导 + LZMA 覆盖层)
真正主程序: app\pdf2word.exe(520KB,VB6 原生编译)
产品: PDFTiger「PDF转WORD工具」/ PDF2Word,约 2009
1. 包结构
| 层 |
内容 |
外层 pdf2word.exe |
Inno Setup 5.2.3 自解压(Inno Setup Setup Data (5.2.3)) |
覆盖层 zlb\x1a + LZMA |
解出约 6.5MB,内含安装数据 |
app\pdf2word.exe |
VB6 主程序(VB5! 工程,MSVBVM60) |
app\pdftox.dll |
PDF 引擎(CxImage / PDFtoX) |
app\skinh_vb6.dll + skinh.she |
皮肤 |
userappdata\YcanPDF\... |
PDF CID/字体映射资源 |
2. 注册码校验(frmReg → cmdOK)
字节码重建(VA 0x45F800–0x45FF5C):
' frmReg.cmdOK_Click(重建)
code = txtReg.Text
fW = False: fD = False: f8 = False: f6 = False
For i = 1 To 15 ' __vbaVarForInit 1..15
ch = Mid$(code, i, 1) ' 逐字符
If ch = "W" Then fW = True ' VA 0x436CAC
If ch = "D" Then fD = True ' VA 0x436CB4
If ch = "8" Then f8 = True ' VA 0x436CBC
If ch = "6" Then f6 = True ' VA 0x436CC4
Next
If fW And fD And f8 And f6 Then
' 写出标记文件
Open App.Path & "\sound.dll" For Output As #1
Print #1, code & "asdfasdfasdfasw" & "kk" ' 0x436CCC + 0x430498
Close #1
MsgBox "注册成功! 请重新启动程序.", vbOKOnly, "成功"
End ' __vbaEnd,要求重启
Else
MsgBox "注册码错.", vbOKOnly, "错误"
End
End If
3. 启动时的授权检查(frmConverter)
字节码重建(VA 0x43FA80–0x43FC5D):
' 启动 / Form_Load(重建)
Open App.Path & "\sound.dll" For Input As #1
Do While Not EOF(1)
Input #1, s
If Right$(s, 2) = "kk" Then ' 只看末两字符
gRegistered = True ' [0x461044] = -1
Me.Caption = "PDF转WORD工具" ' 去掉「- 未注册版」
Exit Do
End If
Loop
Close #1
4. 试用限制
未注册时:
- 窗口标题:
PDF转WORD工具 - 未注册版
- 提示:
试用版只能50%的内容.
- 追问:
是否现在注册获得正式版? / 按钮 注册
- 另有
lblBuy 控件
5. 证据分层
| 结论 |
类型 |
依据 |
| 外层是 Inno Setup 5.2.3 |
观察 |
Inno Setup Setup Data (5.2.3)、InnoSetupLdrWindow |
| 主程序 VB6 原生 |
观察 |
VB5!、MSVBVM60.DLL、__vbaStrCmp 等 IAT |
| 校验=含 W/D/8/6 |
观察 |
__vbaVarForInit(1..15) + 四次 __vbaVarTstEq |
成功写 code+asdf...+kk |
观察 |
__vbaStrCat ×2 + __vbaPrintFile |
启动只看 Right$==kk |
观察 |
__vbaInputFile + ord_619(Right/截取) + __vbaStrCmp("kk") |
| 无在线激活 |
观察 |
注册函数无 HTTP 调用 |
伪造 kk 文件即可激活 |
推断 |
判定条件仅 Right$(s,2)=="kk",未实测运行 |
| wininet 是否用于别的功能 |
未知 |
导入存在但注册路径未引用 |
|