【文章标题】: 通用网络考试系统V2.2 注册机
【文章作者】: hctfly
【软件名称】: 通用网络考试系统V2.2
【软件大小】: 4.42M
【下载地址】: 自己搜索下载
【加壳方式】: 无
【保护方式】: 无
【编写语言】: VB5
【使用工具】: SmartCheck PEiD OllyICE
【操作平台】: Windows
【软件介绍】: 局域网考试系统
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
因朋友发了这个软件给我叫我帮他破解。其实我也是个很菜很菜的菜鸟,既然朋友叫到试试。(请高手远离)
首先用Peid测一下,哎没加壳而且是用VB5.0写的。还好不用脱壳。(对壳的了解还在学习中)
拿出收藏的工具(其实是从看雪下载的。感谢看雪)SmartCheck 调试!按下注册键,然后在SmartCheck 的 Events 视窗
内找到 Command6_Click 按前面的[+] 下面就是按“注册”键后所发生的事件,分析这些事件后发现产品ID的生成。是通
过在当前用户的 TEMP 目录下生成一个随机的文件其实现为
(Shell "Command.com /C ipconfig /all >C:\Docume~1\Admini~1\Locals~1\Temp\随机数.TXT"),然后从产生的文件中
通过行读取的方式读取出MAC地址,然后去除MAC地址间的“-”得出一个不含"-"的字符串。(MAC:“00-E0-4C-3E-AB-10”
为“00E04C3EAB10”,然后最从这个字符串中从右边取出奇数位的字符转换成ASC码再转换成字符,得到的字符串为
“486669674848”再与这前的字符串连接生成产品ID号:“48666967484800E04C3EAB10”。(产品ID的产生知道,注册码
应该不远了吧!有点激动。)
继续往下分析发现出现的都是:
Mid ;不难看出这是从产品ID中取出一位
Asc returns Integer:48 ;把取出的转换成ASC
Double(443)-->String("443") ;这个Double数从哪来的呢???
我试着把所有 Double 转换成字符的数,组成字符串,输入注册码中,按注册。成功啦!
注册码是找到了可是这些DOUBLE字是从哪来的呢??? 看来用SmartCheck 分析不出算法了,只好拿出OllyICE 啦!
用OllyICE 载入程序然后在代码中找到下面这行按“F2”在此处下断。
经 SmartCheck 分析发现第六次调用VB中的“LEN”函数时就开始计算注码册码。所以在代码中找到以下代后按“F2”下断
00402098 $- FF25 BC724200 jmp dword ptr [<&MSVBVM50.__vbaLenBs>; MSVBVM50.__vbaLenBstr
按6次“F9”然使用“F8”跟进到 RET 返回到如下:
004222AB . E8 E8FDFDFF call <jmp.&MSVBVM50.__vbaLenBstr> ; \__vbaLenBstr
004222B0 . 8945 E8 mov dword ptr [ebp-18], eax
004222B3 . EB 0F jmp short 004222C4
004222B5 > 8B45 E8 mov eax, dword ptr [ebp-18]
004222B8 . 0345 90 add eax, dword ptr [ebp-70]
004222BB . 0F80 52010000 jo 00422413
004222C1 . 8945 E8 mov dword ptr [ebp-18], eax
004222C4 > 8B45 E8 mov eax, dword ptr [ebp-18]
004222C7 . 3B45 8C cmp eax, dword ptr [ebp-74]
004222CA . 0F8C E4000000 jl 004223B4
004222D0 . C745 D0 01000>mov dword ptr [ebp-30], 1
004222D7 . C745 C8 02000>mov dword ptr [ebp-38], 2
004222DE . 8D45 E0 lea eax, dword ptr [ebp-20]
004222E1 . 8945 B0 mov dword ptr [ebp-50], eax
004222E4 . C745 A8 08400>mov dword ptr [ebp-58], 4008
004222EB . 8D45 C8 lea eax, dword ptr [ebp-38]
004222EE . 50 push eax ; /Length8
004222EF . FF75 E8 push dword ptr [ebp-18] ; |Start
004222F2 . 8D45 A8 lea eax, dword ptr [ebp-58] ; |
004222F5 . 50 push eax ; |dString8
004222F6 . 8D45 B8 lea eax, dword ptr [ebp-48] ; |
004222F9 . 50 push eax ; |RetBUFFER
004222FA . E8 21FDFDFF call <jmp.&MSVBVM50.#632> ; \rtcMidCharVar
004222FF . FF75 E4 push dword ptr [ebp-1C]
00422302 . 8D45 B8 lea eax, dword ptr [ebp-48]
00422305 . 50 push eax ; /String8
00422306 . 8D45 DC lea eax, dword ptr [ebp-24] ; |
00422309 . 50 push eax ; |ARG2
0042230A . E8 17FDFDFF call <jmp.&MSVBVM50.__vbaStrVarVal> ; \__vbaStrVarVal
0042230F . 50 push eax ; /String
00422310 . E8 37FEFDFF call <jmp.&MSVBVM50.#516> ; \rtcAnsiValueBstr
00422315 . 0FBFC0 movsx eax, ax
00422318 . 0FAF45 E8 imul eax, dword ptr [ebp-18] ;把取出的字符转换成ASC码后乘以所在字符串中的位置。
0042231C . 0F80 F1000000 jo 00422413 ;溢出跳转
00422322 . 8945 80 mov dword ptr [ebp-80], eax
00422325 . DB45 80 fild dword ptr [ebp-80] ;把内存的数据载入双精度数据寄存器内ST0。其作用实现双精度转换
00422328 . DD9D 78FFFFFF fstp qword ptr [ebp-88] ;将ST0中的数据保存到指定的内存
0042232E . DD85 78FFFFFF fld qword ptr [ebp-88]
00422334 . 833D 00304200>cmp dword ptr [423000], 0
0042233B . 75 08 jnz short 00422345
0042233D . DC35 F01D4000 fdiv qword ptr [401DF0] ;双精度除法 即ST0/1.3 ds:[00401DF0]=1.300000000000000
00422343 . EB 11 jmp short 00422356
00422345 > FF35 F41D4000 push dword ptr [401DF4]
0042234B . FF35 F01D4000 push dword ptr [401DF0]
00422351 . E8 DEFAFDFF call <jmp.&MSVBVM50._adj_fdiv_m64>
00422356 > D9E1 fabs ;计算绝对值
00422358 . DFE0 fstsw ax ;读状态寄存器
0042235A . A8 0D test al, 0D ;测试是否异常
0042235C . 0F85 AC000000 jnz 0042240E
00422362 . E8 B1FBFDFF call <jmp.&MSVBVM50.__vbaFPInt> ;双精转整形
00422367 . 51 push ecx
00422368 . 51 push ecx
00422369 . DD1C24 fstp qword ptr [esp]
0042236C . E8 D9FCFDFF call <jmp.&MSVBVM50.__vbaStrR8> ;转成字符串
至此算法就完全出来了。
以下是把这此字符串连接起来最终成为注册码。
00422371 . 8BD0 mov edx, eax
00422373 . 8D4D D8 lea ecx, dword ptr [ebp-28]
00422376 . E8 4BFCFDFF call <jmp.&MSVBVM50.__vbaStrMove>
0042237B . 50 push eax ; /String
0042237C . E8 1BFCFDFF call <jmp.&MSVBVM50.__vbaStrCat> ; \__vbaStrCat
00422381 . 8BD0 mov edx, eax
00422383 . 8D4D E4 lea ecx, dword ptr [ebp-1C]
00422386 . E8 3BFCFDFF call <jmp.&MSVBVM50.__vbaStrMove>
0042238B . 8D45 D8 lea eax, dword ptr [ebp-28]
0042238E . 50 push eax
0042238F . 8D45 DC lea eax, dword ptr [ebp-24]
00422392 . 50 push eax
00422393 . 6A 02 push 2
00422395 . E8 0CFBFDFF call <jmp.&MSVBVM50.__vbaFreeStrList>
0042239A . 83C4 0C add esp, 0C
0042239D . 8D45 B8 lea eax, dword ptr [ebp-48]
004223A0 . 50 push eax
004223A1 . 8D45 C8 lea eax, dword ptr [ebp-38]
004223A4 . 50 push eax
004223A5 . 6A 02 push 2
004223A7 . E8 08FCFDFF call <jmp.&MSVBVM50.__vbaFreeVarList>
004223AC . 83C4 0C add esp, 0C
004223AF .^ E9 01FFFFFF jmp 004222B5
算法出来了,现在就用VB6来写其注册机。
要写此注册机大概分三步。
首先是要取网卡MAC地址。跟据其原理可写成如下:
Dim sID As String
Private Sub Form_Load()
Shell "command.com /c ipconfig /all >C:\AC.txt" ;通过ipconfig /all 把网卡信息保存到AC.txt文件中
End Sub
第二步读取MAC地址及转换成产品ID码:
Private Sub Command1_Click()
Dim nnID As Double, nnnID As Double
Dim nLen As Long, tstr As String
Open "C:\AC.txt" For Input As #1
Do While Not EOF(1) ' 循环至文件尾。
Line Input #1, TextLine ' 读入一行数据并将其赋予某变量。
TextLine = Trim(TextLine)
If Left(TextLine, 16) = "Physical Address" Then
sID = Right(TextLine, 17)
sID = Replace(sID, "-", "")
Exit Do
End If
Loop
Close #1
nLen = Len(sID)
Text1.Text = ""
For i = 0 To nLen - 1 Step 2
Text1.Text = Text1.Text & Asc(Mid(Text1.Text, nLen - i, 1))
Next
Text1.Text = Text1.Text & sID
第三步:生成注册码
Text2.Text = ""
nLen = Len(sID)
For i = 0 To nLen - 1
tstr = Mid(sID, nLen - i, 1)
nnID = Asc(tstr) * (nLen - i)
Text2.Text = Text2.Text & Fix(nnID / nnnID)
Next
End Sub
Private Sub Form_Unload(Cancel As Integer)
Kill "C:\AC.txt"
End Sub
此软件注册算法比较简单。请各位大虾不要笑话。这是我这个菜鸟第一次写破文,请各位大虾多多指教!
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!
2008年04月14日 20:39:52
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)