[PYG官方教程]开悟之门-跟飘云学算法-3
【破文标题】跑的快 V1.2 算法分析【破文作者】飘云
【作者主页】https://www.chinapyg.com
【破解平台】WinXp
【破解工具】PEiD0.94、OllyDbg
【作者邮箱】[email protected]
【软件名称】跑的快 V1.2
【软件大小】1722 K
【原版下载】http://download.enet.com.cn/html/080592004040601.html
【软件简介】易于上手的类似于争上游的一款扑克游戏,有非常强的娱乐性,强烈推荐下载试用。
【破解过程】
PEID0.94探测-->无壳-->Microsoft Visual Basic 5.0 / 6.0
运行程序,输入注册信息,没有反映,,界面上说明要重新运行程序才能有效~~~
典型的重启验证,,我们用断点__vbaStrCopy 看看程序把注册信息保存在哪?~
OD 载入,bp __vbaStrCopy
堆栈:
0012EC7C 00616A49返回到 跑的快1_.00616A49 来自 MSVBVM60.__vbaStrCopy
现在ALT + F9 返回~
我们看到寄存器窗口如下:
EAX 00161EEC UNICODE "C:\WINDOWS\system32\mibs.bin"
ECX 00000000
EDX 00161EEC UNICODE "C:\WINDOWS\system32\mibs.bin"
有上面信息足够了,,利用插件搜索 UNICODE码 找到如下关键:
004CDB00push ebp
004CDB01mov ebp, esp
004CDB03sub esp, 18
004CDB06push <jmp.&MSVBVM60.__vbaExceptHandler> ;SE 处理程序安装
004CDB0Bmov eax, dword ptr fs:
004CDB11push eax
004CDB12mov dword ptr fs:, esp
004CDB19mov eax, 294
004CDB1Ecall <jmp.&MSVBVM60.__vbaChkstk>
004CDB23push ebx
004CDB24push esi
004CDB25push edi
004CDB26mov dword ptr , esp
004CDB29mov dword ptr , 00401210
004CDB30mov eax, dword ptr
004CDB33and eax, 1
004CDB36mov dword ptr , eax
004CDB39mov ecx, dword ptr
004CDB3Cand ecx, FFFFFFFE
004CDB3Fmov dword ptr , ecx
004CDB42mov dword ptr , 0
004CDB49mov edx, dword ptr
004CDB4Cmov eax, dword ptr
004CDB4Emov ecx, dword ptr
004CDB51push ecx
004CDB52call dword ptr
.
.
.省略一大堆~~~
004CDE97call dword ptr [<&MSVBVM60.__vbaSetSystemErr>;MSVBVM60.__vbaSetSystemError
004CDE9Dmov dword ptr , 0B
004CDEA4mov edx, dword ptr
004CDEA7mov word ptr , 0
004CDEB0mov dword ptr , 0C
004CDEB7mov edx, 0046D0D4 ;c:\windows\system32\mibs.bin//★定位到这里开始分析~~~
004CDEBClea ecx, dword ptr
004CDEBFcall dword ptr [<&MSVBVM60.__vbaStrCopy>] ;MSVBVM60.__vbaStrCopy
004CDEC5mov dword ptr , 0D
004CDECCmov edx, 0046D114 ;set.bin
004CDED1lea ecx, dword ptr
004CDED4call dword ptr [<&MSVBVM60.__vbaStrCopy>] ;MSVBVM60.__vbaStrCopy
004CDEDAmov dword ptr , 0E
004CDEE1mov eax, dword ptr
004CDEE4push eax
004CDEE5push 2
004CDEE7push 0E
004CDEE9push 4
004CDEEBcall dword ptr [<&MSVBVM60.__vbaFileOpen>] ;MSVBVM60.__vbaFileOpen
004CDEF1mov dword ptr , 0F
004CDEF8push 2
004CDEFApush 1
004CDEFCpush 0061C020
004CDF01push 0046D128
004CDF06call dword ptr [<&MSVBVM60.__vbaGetOwner4>];MSVBVM60.__vbaGetOwner4
004CDF0Cmov dword ptr , 10
004CDF13mov ecx, dword ptr
004CDF16mov dx, word ptr
004CDF1Dmov word ptr , dx
004CDF21mov dword ptr , 11
004CDF28mov eax, dword ptr
004CDF2Bmov cx, word ptr
004CDF32mov word ptr , cx
004CDF36mov dword ptr , 12
004CDF3Dmov edx, dword ptr
004CDF40mov eax, dword ptr
004CDF45mov dword ptr , eax
004CDF48mov dword ptr , 13
004CDF4Fmov ecx, dword ptr
004CDF52mov dx, word ptr
004CDF59mov word ptr , dx
004CDF5Dmov dword ptr , 14
004CDF64mov eax, dword ptr
004CDF67mov cx, word ptr
004CDF6Emov word ptr , cx
004CDF72mov dword ptr , 15
004CDF79mov edx, dword ptr
004CDF7Cmov ax, word ptr
004CDF82mov word ptr , ax
004CDF86mov dword ptr , 16
004CDF8Dmov ecx, dword ptr
004CDF90cmp dword ptr , 0 ;★★★★★指向机器码~~比较机器码是否为 0是0则没有取到,采用下面的随机数生成方案
004CDF94jnz 004CE10B
004CDF9Amov dword ptr , 17
004CDFA1mov dword ptr , 80020004
004CDFABmov dword ptr , 0A
004CDFB5lea edx, dword ptr
004CDFBBpush edx ; /RNDNumber08
004CDFBCcall dword ptr [<&MSVBVM60.#594>] ; \rtcRandomize
004CDFC2lea ecx, dword ptr
004CDFC8call dword ptr [<&MSVBVM60.__vbaFreeVar>] ;MSVBVM60.__vbaFreeVar
004CDFCEmov dword ptr , 18
004CDFD5mov dword ptr , 80020004
004CDFDFmov dword ptr , 0A
004CDFE9lea eax, dword ptr
004CDFEFpush eax ; /arg
004CDFF0call dword ptr [<&MSVBVM60.#593>] ; \rtcRandomNext
004CDFF6fmul qword ptr
004CDFFCfstsw ax
004CDFFEtest al, 0D
004CE000jnz 004D0C8C
004CE006call dword ptr [<&MSVBVM60.__vbaFPInt>] ;MSVBVM60.__vbaFPInt
004CE00Cfadd qword ptr
004CE012fstsw ax
004CE014test al, 0D
004CE016jnz 004D0C8C
004CE01Ccall dword ptr [<&MSVBVM60.__vbaFpI4>] ;MSVBVM60.__vbaFpI4
004CE022mov ecx, dword ptr
004CE025mov dword ptr , eax
004CE028lea ecx, dword ptr
004CE02Ecall dword ptr [<&MSVBVM60.__vbaFreeVar>] ;MSVBVM60.__vbaFreeVar
004CE034mov dword ptr , 19
004CE03Bmov edx, dword ptr
004CE03Emov ax, word ptr
004CE042mov word ptr , ax
004CE048mov dword ptr , 1A
004CE04Fmov ecx, dword ptr
004CE052mov dx, word ptr
004CE056mov word ptr , dx
004CE05Dmov dword ptr , 1B
004CE064mov eax, dword ptr
004CE067mov ecx, dword ptr
004CE06Amov dword ptr , ecx
004CE070mov dword ptr , 1C
004CE077mov edx, dword ptr
004CE07Amov ax, word ptr
004CE07Emov word ptr , ax
004CE084mov dword ptr , 1D
004CE08Bmov ecx, dword ptr
004CE08Emov dx, word ptr
004CE092mov word ptr , dx
004CE099mov dword ptr , 1E
004CE0A0mov eax, dword ptr
004CE0A3mov cx, word ptr
004CE0A7mov word ptr , cx
004CE0AEmov dword ptr , 1F
004CE0B5push 2
004CE0B7push 1
004CE0B9push 0061C020
004CE0BEpush 0046D128
004CE0C3call dword ptr [<&MSVBVM60.__vbaPutOwner4>];MSVBVM60.__vbaPutOwner4
004CE0C9mov dword ptr , 20
004CE0D0mov edx, dword ptr
004CE0D3push edx
004CE0D4push 3
004CE0D6push -1
004CE0D8push 2
004CE0DAcall dword ptr [<&MSVBVM60.__vbaFileOpen>] ;MSVBVM60.__vbaFileOpen
004CE0E0mov dword ptr , 21
004CE0E7push 0046D144 ;0
004CE0ECpush 3
004CE0EEpush 0046D14C
004CE0F3call dword ptr [<&MSVBVM60.__vbaWriteFile>];MSVBVM60.__vbaWriteFile
004CE0F9add esp, 0C
004CE0FCmov dword ptr , 22
004CE103push 3
004CE105call dword ptr [<&MSVBVM60.__vbaFileClose>];MSVBVM60.__vbaFileClose
004CE10Bmov dword ptr , 24
004CE112mov eax, dword ptr
004CE115push eax
004CE116push 3
004CE118push -1
004CE11Apush 1
004CE11Ccall dword ptr [<&MSVBVM60.__vbaFileOpen>] ;MSVBVM60.__vbaFileOpen
004CE122mov dword ptr , 25
004CE129lea ecx, dword ptr
004CE12Cpush ecx
004CE12Dpush 3
004CE12Fpush 0046D154
004CE134call dword ptr [<&MSVBVM60.__vbaInputFile>];MSVBVM60.__vbaInputFile
004CE13Aadd esp, 0C
004CE13Dmov dword ptr , 26
004CE144push 3
004CE146call dword ptr [<&MSVBVM60.__vbaFileClose>];MSVBVM60.__vbaFileClose
004CE14Cmov dword ptr , 27
004CE153lea edx, dword ptr
004CE156push edx
004CE157call dword ptr [<&MSVBVM60.__vbaI4ErrVar>] ;MSVBVM60.__vbaI4ErrVar
004CE15Dmov ecx, dword ptr
004CE160mov edx, dword ptr ;机器码送edx
004CE163imul edx, edx, 2 ;edx * 2
004CE166jo 004D0C91
004CE16Cadd edx, 4BFD3 ;edx + 0x4BFD3
004CE172jo 004D0C91
004CE178cmp eax, edx ;和假码对比(16进制)
004CE17Aje 004CE5EB
004CE180mov dword ptr , 28
004CE187mov edx, 0046CC0C ;jl.bin
004CE18Clea ecx, dword ptr
004CE18Fcall dword ptr [<&MSVBVM60.__vbaStrCopy>] ;MSVBVM60.__vbaStrCopy
004CE195mov dword ptr , 29
004CE19Cmov eax, dword ptr
004CE19Fpush eax
004CE1A0push 4
004CE1A2push -1
004CE1A4push 1
004CE1A6call dword ptr [<&MSVBVM60.__vbaFileOpen>] ;打开 jl.bin 准备读取使用次数
004CE1ACmov dword ptr , 2A
004CE1B3lea ecx, dword ptr
004CE1B6push ecx
004CE1B7push 4
004CE1B9push 0046D154
004CE1BEcall dword ptr [<&MSVBVM60.__vbaInputFile>];MSVBVM60.__vbaInputFile
004CE1C4add esp, 0C
004CE1C7mov dword ptr , 2B
004CE1CEpush 4
004CE1D0call dword ptr [<&MSVBVM60.__vbaFileClose>];MSVBVM60.__vbaFileClose
004CE1D6mov dword ptr , 2C
004CE1DDlea edx, dword ptr
004CE1E0push edx
004CE1E1call dword ptr [<&MSVBVM60.__vbaI2Var>] ;MSVBVM60.__vbaI2Var
004CE1E7mov word ptr , ax
004CE1EBmov dword ptr , 2D
004CE1F2mov ax, word ptr
004CE1F6add ax, 1 ;记录数(使用次数)+1
.
.
.省略部分
004CE332add esp, 0C
004CE335mov dword ptr , 2F
004CE33Ccmp word ptr , 1E ;是否超过 0x1E(30)次
004CE341jnz 004CE58B
004CE347mov dword ptr , 30
004CE34Ecmp dword ptr , 0
004CE355jnz short 004CE373
004CE357push 0061C054
004CE35Cpush 00469F80
004CE361call dword ptr [<&MSVBVM60.__vbaNew2>] ;MSVBVM60.__vbaNew2
.
.
.
下面乱七八糟的代码就不看了~~
【算法总结】
0.看着VB的代码很晕吧?乱七八糟的东西很多~~~呵呵,搞了这么个简单确有代表的东西分析(重启验证)~~~~
1.Sn = 机器码 * 2 + 0x4BFD3
【算法注册机】
{-------------------------------------------------------------------------------
过程名: Key
作用: 注册码算法
作者: piaoyun
日期: 2008.10.20
参数: code:Integer
返回值: string
-------------------------------------------------------------------------------}
function Key(code:Integer):string;
var
sum:integer;
begin
sum := code * 2 + $4BFD3;
Result := IntToStr(sum);
end;
{-------------------------------------------------------------------------------
过程名: TForm1.btnOkClick
作用: 算号 按钮事件~~
作者: piaoyun
日期: 2008.10.20
参数: Sender: TObject
返回值: 无
-------------------------------------------------------------------------------}
procedure TForm1.btnOkClick(Sender: TObject);
begin
if edtCode.Text <> '' then
begin
edtSn.Text := Key(StrToInt(edtCode.Text));
end
else
ShowMessage('请输入申请码!');
end;
【版权声明】 本文原创于P.Y.G官方,纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢! 下载来学习下。/:good 跟着老大学习,真是荣幸啊!/:014 收藏了,有时间再看 好东西.明天早上实际操作一次!!! 老飘发飙了,今天大爆发了 学习了,谢谢分享/:018 学习了/:018 /:018 /:018 /:018 /:good /:good /:good
这么短的时间内连续出两篇算法分析!!!!!! 唉。。没学过汇编。。算法注册机那里的代码看不明白。。