- UID
- 73705
注册时间2014-1-28
阅读权限50
最后登录1970-1-1
感悟天道
TA的每日心情 | 开心 前天 09:50 |
---|
签到天数: 2310 天 [LV.Master]伴坛终老
|
发表于 2014-2-16 08:16:54
|
显示全部楼层
这个下载不了,请楼主解决。
【破解过程】 一朋友花8000买的一软件因为重装系统导致改软件机器码变了,再去找软件开发商,算次号竟然还要2000元。汗,这世道.听朋友说这个软件在双色球缩水方面还是不错的,虽然是2005版.但目前售价还是几千.且无试用版本人技术比较菜,花了2天还只破解他的一些限制.但改软件有自校验之类的东东吧.被修改后所得出的缩水结果为随机的最后才在北极狐狸的帮助下结合这几天的分析终于有点头绪.现记下此文和大家分享.
废话不说下查壳,Borland Delphi 4.0 - 5.0 无壳。看了下 重启验证+注册表验证
输入错误验证码后提示:重新打开程序后既可生效
CMD运行REGEDIT 注册码保存注册表HKEY_LOCAL_MACHINE\SOFTWARE\华彩网\英豪双色球中奖大师下
试了几种重启验证破解的方法,但是都无结果 可能是我太菜
软件默认只能输入注册码 机器码栏是灰色的 可以通过ResScope修改 但没什么用
废话不多说
OD载入
bp GetVolumeInformationA 下断 F9运行
断在7C821BA5 > 6A 44 PUSH 44 /////看堆栈
0012FCEC 0048A683 /CALL 到 GetVolumeInformationA 来自 YingSsq.0048A67E //反汇编窗口跟随
0012FCF0 0048A830 |RootPathName = "c:\"
0012FCF4 0012FE58 |VolumeNameBuffer = 0012FE58
0012FCF8 00000100 |MaxVolumeNameSize = 100 (256.)
0012FCFC 0012FF60 |pVolumeSerialNumber = 0012FF60
0012FD00 0012FF5C |pMaxFilenameLength = 0012FF5C
0012FD04 0012FF58 |pFileSystemFlags = 0012FF58
来到了
0048A678 . 50 PUSH EAX ; |VolumeNameBuffer
0048A679 . 68 30A84800 PUSH YingSsq.0048A830 ; |c:\
0048A67E . E8 05C6F7FF CALL <JMP.&kernel32.GetVolumeInformation>; \GetVolumeInformationA
0048A683 . 85C0 TEST EAX,EAX //F2下断 F9运行
0048A685 . 74 39 JE SHORT YingSsq.0048A6C0
0048A687 . 8D95 E4FEFFFF LEA EDX,DWORD PTR SS:[EBP-11C]
0048A68D . 0FB745 F2 MOVZX EAX,WORD PTR SS:[EBP-E]
0048A691 . E8 46E5F7FF CALL YingSsq.00408BDC
0048A696 . 8B85 E4FEFFFF MOV EAX,DWORD PTR SS:[EBP-11C]
0048A69C . 50 PUSH EAX ASCII "33943
0048A69D . 8D95 E0FEFFFF LEA EDX,DWORD PTR SS:[EBP-120]
0048A6A3 . 0FB745 F0 MOVZX EAX,WORD PTR SS:[EBP-10]
0048A6A7 . E8 30E5F7FF CALL YingSsq.00408BDC
0048A6AC . 8B95 E0FEFFFF MOV EDX,DWORD PTR SS:[EBP-120] ASCII "41808"
走到
0048A6D5 . 8378 2C 00 CMP DWORD PTR DS:[EAX+2C],0 ASCII "4180833943"
0048A6D9 . 74 27 JE SHORT YingSsq.0048A702
0048A6DB . 8D8D CCFEFFFF LEA ECX,DWORD PTR SS:[EBP-134]
0048A6E1 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0048A6E4 . 8B50 2C MOV EDX,DWORD PTR DS:[EAX+2C]
0048A6E7 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0048A6EA . E8 BD040000 CALL YingSsq.0048ABAC
0048A6EF . 8D95 CCFEFFFF LEA EDX,DWORD PTR SS:[EBP-134]
0048A6F5 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0048A6D9 . /74 27 JE SHORT YingSsq.0048A702
0048A6DB . |8D8D CCFEFFFF LEA ECX,DWORD PTR SS:[EBP-134]
0048A6E1 . |8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0048A6E4 . |8B50 2C MOV EDX,DWORD PTR DS:[EAX+2C]
0048A6E7 . |8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0048A6EA . |E8 BD040000 CALL YingSsq.0048ABAC
0048A6EF . |8D95 CCFEFFFF LEA EDX,DWORD PTR SS:[EBP-134] 注意这里 看注释窗口
堆栈地址=0012FE3C, (ASCII 10,"7538632721381535") 计算后的机器码,在这里右健 在数据窗口中跟随地址
EDX=00EE1B54, (ASCII "4180833943")
此时再到数据窗口 右健 选择 文本→ASCII64 或者32 显示 这时出现了
0012FE3C 7538632721381535?@?,?........(|M....旫.4囇w?2...
选中7538632721381535按回车就可以修改机器码 这里随便输入个的机器码 1111111111111111
修改机器,到这就结束了
还没完下面直接
Ctrl+G 在 00402895
00402895 |> /01D6 ADD ESI,EDX //断点 F9运行两次
00402897 |. |880F MOV BYTE PTR DS:[EDI],CL
00402899 |. |47 INC EDI
0040289A |. |F3:A4 REP MOVS BYTE PTR ES:[EDI],BYTE PTR DS:[>
查看 ESI 为注册码
EDX=00000001
ESI=0012FEFC, (ASCII 10,"7813891865996037")
Jumps from 004028A7, 004028AB
OK 程序就是这样自己成为注册机的
算法的主要内容!
0048AF2D |> /8B4D EC /mov ecx, dword ptr [ebp-14] ;计数器 0~15 (注册号是16位的)
0048AF30 |. |BA 09000000 |mov edx, 9 ;这个数字是用来计算的(在下面我称它为a).. 下面雷同
0048AF35 |. |8B45 F4 |mov eax, dword ptr [ebp-C] ;这是个也是用于计算的(在下面我称它为b)...{二进制16}
0048AF38 |. |E8 73F6FFFF |call 0048A5B0 ;这里应该跟进的....
0048AF3D |. |8A4405 D2 |mov al, byte ptr [ebp+eax-2E] ;这里用到机器码,安计算出的数字选泽相对应得数
;比如:
;call 中计算出是2 选择机器码中第2个为计算结果
;以下前三个call计算雷同!
0048AF41 |. |8845 E7 |mov byte ptr [ebp-19], al
0048AF44 |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AF47 |. |BA 05000000 |mov edx, 5
0048AF4C |. |8B45 F4 |mov eax, dword ptr [ebp-C]
0048AF4F |. |E8 5CF6FFFF |call 0048A5B0
0048AF54 |. |8A4405 D2 |mov al, byte ptr [ebp+eax-2E]
0048AF58 |. |8845 E6 |mov byte ptr [ebp-1A], al
0048AF5B |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AF5E |. |BA 02000000 |mov edx, 2
0048AF63 |. |8B45 F4 |mov eax, dword ptr [ebp-C]
0048AF66 |. |E8 45F6FFFF |call 0048A5B0
0048AF6B |. |8A4405 D2 |mov al, byte ptr [ebp+eax-2E]
0048AF6F |. |8845 E5 |mov byte ptr [ebp-1B], al
0048AF72 |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AF75 |. |BA 08000000 |mov edx, 8
0048AF7A |. |8B45 F0 |mov eax, dword ptr [ebp-10] ;此值为19(二进制)
0048AF7D |. |E8 2EF6FFFF |call 0048A5B0 ;以下两call的计算结果是在密码表中选对应的结果
0048AF82 |. |BA 50B04800 |mov edx, 0048B050 密码表地址 0048B050~0048B063
0048AF87 |. |8A4402 FF |mov al, byte ptr [edx+eax-1]
0048AF8B |. |8845 E4 |mov byte ptr [ebp-1C], al
0048AF8E |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AF91 |. |BA 01000000 |mov edx, 1
0048AF96 |. |8B45 F0 |mov eax, dword ptr [ebp-10]
0048AF99 |. |E8 12F6FFFF |call 0048A5B0
0048AF9E |. |BA 50B04800 |mov edx, 0048B050
0048AFA3 |. |8A4402 FF |mov al, byte ptr [edx+eax-1]
0048AFA7 |. |8845 E3 |mov byte ptr [ebp-1D], al --------------
0048AFAA |. |33C0 |xor eax, eax |
0048AFAC |. |8A45 E4 |mov al, byte ptr [ebp-1C] |
0048AFAF |. |33D2 |xor edx, edx |
0048AFB1 |. |8A55 E7 |mov dl, byte ptr [ebp-19]
0048AFB4 |. |F7EA |imul edx
0048AFB6 |. |33D2 |xor edx, edx
0048AFB8 |. |8A55 E6 |mov dl, byte ptr [ebp-1A]
0048AFBB |. |33C9 |xor ecx, ecx ; 这之间的计算是{[ebp-1C]*[ebp-19]+[ebp-1A]*[ebp-1D]+[ebp-1B]}/10的余数
0048AFBD |. |8A4D E3 |mov cl, byte ptr [ebp-1D]
0048AFC0 |. |0FAFD1 |imul edx, ecx ; 这边的计算时把机器码的字符换成ASCII码!
0048AFC3 |. |03C2 |add eax, edx
0048AFC5 |. |33D2 |xor edx, edx
0048AFC7 |. |8A55 E5 |mov dl, byte ptr [ebp-1B]
0048AFCA |. |03C2 |add eax, edx
0048AFCC |. |B9 0A000000 |mov ecx, 0A
0048AFD1 |. |33D2 |xor edx, edx
0048AFD3 |. |F7F1 |div ecx
0048AFD5 |. |8955 E8 |mov dword ptr [ebp-18], edx
0048AFD8 |. |8B45 E8 |mov eax, dword ptr [ebp-18]
0048AFDB |. |E8 00F6FFFF |call 0048A5E0
0048AFE0 |. |8B55 F8 |mov edx, dword ptr [ebp-8]
0048AFE3 |. |8B4D EC |mov ecx, dword ptr [ebp-14]
0048AFE6 |. |88440A 01 |mov byte ptr [edx+ecx+1], al
0048AFEA |. |FF45 EC |inc dword ptr [ebp-14]
0048AFED |. |837D EC 10 |cmp dword ptr [ebp-14], 10
0048AFF1 |.^\0F85 36FFFFFF \jnz 0048AF2D
-----------------------------------------------------------------------
下面是跟进的内容
0048A5B0 /$ 55 push ebp
0048A5B1 |. 8BEC mov ebp, esp
0048A5B3 |. 83C4 F0 add esp, -10
0048A5B6 |. 894D F4 mov dword ptr [ebp-C], ecx
0048A5B9 |. 8955 F8 mov dword ptr [ebp-8], edx
0048A5BC |. 8945 FC mov dword ptr [ebp-4], eax
0048A5BF |. 8B45 F8 mov eax, dword ptr [ebp-8]
0048A5C2 |. 0345 F4 add eax, dword ptr [ebp-C]
0048A5C5 |. 99 cdq
0048A5C6 |. F77D FC idiv dword ptr [ebp-4]
0048A5C9 |. 8955 F0 mov dword ptr [ebp-10], edx
0048A5CC |. 837D F0 00 cmp dword ptr [ebp-10], 0
0048A5D0 |. 75 06 jnz short 0048A5D8
0048A5D2 |. 8B45 FC mov eax, dword ptr [ebp-4]
0048A5D5 |. 8945 F0 mov dword ptr [ebp-10], eax
0048A5D8 |> 8B45 F0 mov eax, dword ptr [ebp-10]
0048A5DB |. 8BE5 mov esp, ebp
0048A5DD |. 5D pop ebp
0048A5DE \. C3 retn
这个计算没有什么大用处!
主要是把 (a+计数器值)/b的余数作为结果返回
附上狐狸的VBS注册机
db=array(211,162,186,192,203,171,201,171,199,242,214,208,189,177,180,243,202,166,32,0)
dim strar(16)
dim temp(16)
str1=inputbox("输入机器码"," 中奖 ------计算器")
for i = 0 to 15
strar(i)=left(str1,1)
str1=right(str1,len(str1)-1)
next
for i = 0 to 15
a=(9+i) mod 16
if a=0 then
a=16
end if
b=(5+i) mod 16
if b=0 then
b=16
end if
c=(2+i) mod 16
if c=0 then
c=16
end if
d=(8+i) mod 19
if d=0 then
d=19
end if
e=(1+i) mod 19
if e=0 then
e=19
end if
an= p(strar(a-1))
bn= p(strar(b-1))
cn= p(strar(c-1))
dn=db(d-1)
en=db(e-1)
temp(i)=(dn*an+bn*en+cn) mod 10
temps=temps & temp(i)
next
i=inputbox("注册码"," 中奖 ------计算器", temps)
Public function p(s)
select case s
case 0
p=asc("0")
case 1
p=asc("1")
case 2
p=asc("2")
case 3
p=asc("3")
case 4
p=asc("4")
case 5
p=asc("5")
case 6
p=asc("6")
case 7
p=asc("7")
case 8
p=asc("8")
case 9
p=asc("9")
end select
end function
保存为VBS就可以
|
|