- UID
- 2
注册时间2004-12-1
阅读权限255
最后登录1970-1-1
总坛主
TA的每日心情 | 开心 2024-12-1 11:04 |
---|
签到天数: 12 天 [LV.3]偶尔看看II
|
【破文标题】梁龙凭证打印 1.1.203 算法分析+ASM注册函数
【破文作者】飘云/P.Y.G
【官方主页】https://www.chinapyg.com
【作者博客】http://blog.piaoyunsoft.com
【破解平台】WinXp SP3
【破解工具】PEiD0.94、OD
【作者邮箱】[email protected]
【软件名称】梁龙凭证打印 1.1.203
【软件大小】2.66 MB
【原版下载】http://www.llwsoft.cn/xzzx.htm
【破解过程】
看到软件仓库
https://www.chinapyg.com/viewthr ... &extra=page%3D1
lzq1973兄弟发布了 这个系列的破解,那么就没有秘密了~~ 拿来做教程了~~
注意:上面提供的注册机是有少许问题的(原因在八进制转换上,不在本文范围,读者自行分析)
OD载入程序:
点击【软件注册】输入注册信息,找到关键处,发现只是对比注册码的过程了~~ 说明注册码在 窗体加载的时候 就已经生成了,那我们找到FormLoad事件开始分析:
输入注册信息:123456789 断下,来到这里:
006D70D0 push ebp ; FormLoad事件
006D70D1 mov ebp, esp
006D70D3 sub esp, 0C
006D70D6 push <jmp.&MSVBVM60.__vbaExceptHandle>; SE 处理程序安装
006D70DB mov eax, dword ptr fs:[0]
006D70E1 push eax
006D70E2 mov dword ptr fs:[0], esp
006D70E9 sub esp, 134
006D70EF push ebx
006D70F0 push esi
006D70F1 push edi
006D70F2 mov dword ptr [ebp-C], esp
006D70F5 mov dword ptr [ebp-8], 00401790
006D70FC mov esi, dword ptr [ebp+8]
006D70FF mov eax, esi
006D7101 and eax, 1
006D7104 mov dword ptr [ebp-4], eax
006D7107 and esi, FFFFFFFE
006D710A push esi
006D710B mov dword ptr [ebp+8], esi
006D710E mov ecx, dword ptr [esi]
006D7110 call dword ptr [ecx+4]
006D7113 mov eax, dword ptr [7A9CCC]
006D7118 xor edi, edi
006D711A cmp eax, edi
.
.
.无关代码--省略
.
.
006D7CEB mov eax, dword ptr [ebp-74] ; 机器码
006D7CEE lea edx, dword ptr [ebp-A4]
006D7CF4 lea ecx, dword ptr [ebp-54]
006D7CF7 mov dword ptr [ebp-74], 0
006D7CFE mov dword ptr [ebp-9C], eax
006D7D04 mov dword ptr [ebp-A4], 8
006D7D0E call dword ptr [<&MSVBVM60.__vbaVarMo>; MSVBVM60.__vbaVarMove
006D7D14 lea ecx, dword ptr [ebp-8C]
006D7D1A call dword ptr [<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
006D7D20 mov ecx, dword ptr [esi]
006D7D22 push esi
006D7D23 call dword ptr [ecx+328]
006D7D29 lea edx, dword ptr [ebp-8C]
006D7D2F push eax
006D7D30 push edx
006D7D31 call edi
006D7D33 mov dword ptr [ebp-9C], 4 ; 参数
006D7D3D mov dword ptr [ebp-A4], 2
006D7D47 mov ebx, dword ptr [eax]
006D7D49 mov dword ptr [ebp-F4], eax
006D7D4F lea eax, dword ptr [ebp-A4]
006D7D55 lea ecx, dword ptr [ebp-54]
006D7D58 push eax
006D7D59 push 1 ; 参数
006D7D5B lea edx, dword ptr [ebp-74]
006D7D5E push ecx ; /String8
006D7D5F push edx ; |ARG2
006D7D60 call dword ptr [<&MSVBVM60.__vbaStrVa>; \__vbaStrVarVal
006D7D66 push eax
006D7D67 call dword ptr [<&MSVBVM60.#631>] ; 截取前4位 设为 A
006D7D6D mov edx, eax
006D7D6F lea ecx, dword ptr [ebp-78]
006D7D72 call dword ptr [<&MSVBVM60.__vbaStrMo>; MSVBVM60.__vbaStrMove
006D7D78 mov dword ptr [ebp-138], ebx
006D7D7E mov ebx, dword ptr [ebp-F4]
006D7D84 push eax
006D7D85 mov eax, dword ptr [ebp-138]
006D7D8B push ebx
006D7D8C call dword ptr [eax+A4]
006D7D92 test eax, eax
006D7D94 fclex
006D7D96 jge short 006D7DAA
006D7D98 push 0A4
006D7D9D push 00662290
006D7DA2 push ebx
006D7DA3 push eax
006D7DA4 call dword ptr [<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
006D7DAA lea ecx, dword ptr [ebp-78]
006D7DAD lea edx, dword ptr [ebp-74]
006D7DB0 push ecx
006D7DB1 push edx
006D7DB2 push 2
006D7DB4 call dword ptr [<&MSVBVM60.__vbaFreeS>; MSVBVM60.__vbaFreeStrList
006D7DBA add esp, 0C
006D7DBD lea ecx, dword ptr [ebp-8C]
006D7DC3 call dword ptr [<&MSVBVM60.__vbaFreeO>; MSVBVM60.__vbaFreeObj
006D7DC9 lea ecx, dword ptr [ebp-A4]
006D7DCF call dword ptr [<&MSVBVM60.__vbaFreeV>; MSVBVM60.__vbaFreeVar
006D7DD5 mov eax, dword ptr [esi]
006D7DD7 push esi
006D7DD8 call dword ptr [eax+318]
006D7DDE lea ecx, dword ptr [ebp-8C]
006D7DE4 push eax
006D7DE5 push ecx
006D7DE6 call edi
006D7DE8 mov ebx, dword ptr [eax]
006D7DEA mov dword ptr [ebp-F4], eax
006D7DF0 lea edx, dword ptr [ebp-54]
006D7DF3 push 4 ; 参数
006D7DF5 lea eax, dword ptr [ebp-74]
006D7DF8 push edx ; /String8
006D7DF9 push eax ; |ARG2
006D7DFA call dword ptr [<&MSVBVM60.__vbaStrVa>; \__vbaStrVarVal
006D7E00 push eax
006D7E01 call dword ptr [<&MSVBVM60.#618>] ; 截取右边4位 设为B
006D7E07 mov edx, eax
006D7E09 lea ecx, dword ptr [ebp-78]
006D7E0C call dword ptr [<&MSVBVM60.__vbaStrMo>; MSVBVM60.__vbaStrMove
.
.
.无关代码--省略
.
.
006D7EF3 mov ebx, dword ptr [edx]
006D7EF5 push ecx ; /String
006D7EF6 call dword ptr [<&MSVBVM60.__vbaStrCa>; \连接 A、B
006D7EFC mov edx, eax ; 连接后的字符串设为C
006D7EFE lea ecx, dword ptr [ebp-7C]
006D7F01 call dword ptr [<&MSVBVM60.__vbaStrMo>; MSVBVM60.__vbaStrMove
006D7F07 mov edx, ebx
.
.
.无关代码--省略
.
.
006D7FBF push ecx
006D7FC0 mov ebx, dword ptr [eax]
006D7FC2 call dword ptr [<&MSVBVM60.#581>] ; 把字符串C转换成浮点数值 = D
006D7FC8 fadd qword ptr [401780] ; D + 10871006(常量) = E
006D7FCE sub esp, 8
006D7FD1 fstsw ax
006D7FD3 test al, 0D
006D7FD5 jnz 006D8398
006D7FDB fstp qword ptr [esp]
006D7FDE call dword ptr [<&MSVBVM60.__vbaStrR8>; 把E转换成字符串
006D7FE4 mov edx, eax
006D7FE6 lea ecx, dword ptr [ebp-78]
006D7FE9 call dword ptr [<&MSVBVM60.__vbaStrMo>; MSVBVM60.__vbaStrMove
006D7FEF mov edx, ebx
.
.
.无关代码--省略
.
.
006D8081 push 0A0
006D8086 push 00662290
006D808B push ebx
006D808C push eax
006D808D call dword ptr [<&MSVBVM60.__vbaHresu>; MSVBVM60.__vbaHresultCheckObj
006D8093 mov ecx, dword ptr [ebp-74] ; 字符串E
006D8096 push ecx
006D8097 call dword ptr [<&MSVBVM60.#581>] ; 字符串E转换成浮点数值 = F
006D809D fstp qword ptr [ebp-9C]
006D80A3 lea edx, dword ptr [ebp-A4]
006D80A9 lea eax, dword ptr [ebp-B4]
006D80AF push edx
006D80B0 push eax
006D80B1 mov dword ptr [ebp-A4], 5
006D80BB call dword ptr [<&MSVBVM60.#575>] ; 将F转换成八进制 G
006D80C1 mov ecx, dword ptr [ebp-FC]
006D80C7 lea edx, dword ptr [ebp-B4]
006D80CD lea eax, dword ptr [ebp-78]
006D80D0 push edx ; /String8
006D80D1 mov ebx, dword ptr [ecx] ; |
006D80D3 push eax ; |ARG2
006D80D4 call dword ptr [<&MSVBVM60.__vbaStrVa>; \将G转换成字符串即为注册码 SN
006D80DA mov ecx, ebx
006D80DC mov ebx, dword ptr [ebp-FC]
006D80E2 push eax
006D80E3 push ebx
006D80E4 call dword ptr [ecx+A4]
【算法总结】
这里我省略了很多无关代码(VB的代码就是冗长,没必要都贴出来),方便读者参考~~
所以这里很清楚了理清了算法流程:
1.截取机器码左边4位注册码设为A
2.截取机器码右边4位注册码设为B
3.连接A、B设为C
4.把C转换成浮点数值设为D
5.D + 10871006(常量)并转换成字符设为E
7.将E转换成浮点数值设为F
8.将F转换成八进制设为G
9.将G转换成字符串即为正确注册码SN
【算法函数】
;说明下,由于wsprintf 函数不能处理 %o 八进制~~ 所以导致这个代码有点长~ 不过那段进制转换函数还是值得收藏~
;参考自看雪论坛小虾版主的代码,感谢!
dwCount db ?
.code
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;函数功能:将字符串转换成数值
;Code By PiaoYun/P.Y.G
;http://blog.piaoyunsoft.com
;说明:仅做转换用,没有判断传入字符串的合法性~~ 如 "1111" --> 1111
;
;函数参数:
; lpszStr:指针,传入字符串的地址
;返回值:16进制数值
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
_ProcStrToDword proc lpszStr:dword
mov esi,lpszStr
xor eax, eax
xor ebx, ebx
@@:
mov bl, byte ptr [esi]
test bl, bl
je @F
sub bl, 30h
lea eax, dword ptr [eax+eax*4]
add eax, eax
add eax, ebx
inc esi
jmp @B
@@:
ret
_ProcStrToDword endp
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
;函数功能:进制转换
;函数参数:
; lpOutBuff:输出缓冲区
; dwValue:为要转换的整数值
; nType:转换类型,分别可以是2、8、10、16进制 都可以转换。
;此段代码参考自看雪论坛小虾版主,在此表示感谢!
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
dwtos proc uses ebx esi lpOutBuff:DWORD,dwValue:DWORD,nType:DWORD
LOCAL @szBuffer[512]:BYTE
;LOCAL dwCount:DWORD
xor eax,eax
.if !(lpOutBuff)
ret
.endif
xor esi,esi
lea esi,@szBuffer
mov ebx,lpOutBuff
mov ecx,nType
mov eax,dwValue
.while eax > ecx || eax
xor edx,edx
div ecx
.if dl > 9
add dl,'A' - 10
.else
add dl,'0'
.endif
mov byte ptr [esi],dl
inc esi
inc dwCount
.endw
.while dwCount
mov cl,[esi-1]
mov [ebx],cl
dec esi
dec dwCount
inc ebx
.endw
ret
dwtos endp
;=================================================
;注册算法:
;1.截取机器码左边4位注册码设为A
;2.截取机器码右边4位注册码设为B
;3.连接A、B设为C
;4.把C转换成浮点数值设为D
;5.D + 10871006(常量)并转换成字符设为E
;7.将E转换成浮点数值设为F
;8.将F转换成八进制设为G
;9.将G转换成字符串即为正确注册码SN
;=================================================
KeyGen proc uses ecx edx lpID:DWORD
LOCAL @szTemp[9]:BYTE
LOCAL @dwTemp:DWORD
LOCAL @szOctBuffer[256]:BYTE
invoke RtlZeroMemory,addr @szTemp,sizeof @szTemp
invoke RtlZeroMemory,addr @szOctBuffer,sizeof @szOctBuffer
xor ecx,ecx
xor edx,edx
xor esi,esi
;截取左边4位
mov eax,lpID
mov ecx,4
xor esi,esi
@@:
movzx ebx,byte ptr[eax+esi]
mov byte ptr[@szTemp+esi],bl
inc esi
loop @B
invoke lstrlen,lpID
;移动到倒数第四位
sub eax,4
mov esi,eax
;截取右边四位
mov eax,lpID
mov ecx,4
mov edx,4
@@:
movzx ebx,byte ptr[eax+esi]
mov byte ptr[@szTemp+edx],bl
inc esi
inc edx
loop @B
;上面@szTemp里面已经是连接好的字符串了
;字符串转换成数值
invoke _ProcStrToDword,addr @szTemp
;加10871006
add eax,10871006
;转换成八进制
invoke dwtos,addr @szOctBuffer,eax,8
;输出最终注册码
lea eax,@szOctBuffer
ret
KeyGen endp
【版权声明】 本文纯属技术交流, 原创于PYG官方论坛, 转载请注明作者并保持文章的完整, 谢谢! |
评分
-
查看全部评分
|