- UID
- 38600
注册时间2007-12-1
阅读权限8
最后登录1970-1-1
初入江湖
该用户从未签到
|
昨天刚刚注册的PYG,一直很想进来,看到开放注册了马上就注册了,大礼包里面有Delphi的培训班,正好我可以借着发这个帖子来个原创,呵呵,两个月前在FF写的东西,大侠莫笑我哦 o(∩_∩)o...呵呵。
【破文标题】《半仙算命》手动脱壳,追注册码,算法注册机全系列.大侠莫笑我~~
【破文作者】Xusually
【作者邮箱】[email protected]
【作者主页】http://blog.csdn.net/xusually/
【破解工具】PEID OD KeyMaker
【破解平台】WindowsXP
【软件名称】半仙算命 V2007 Build0415
【软件大小】2.04M
【原版下载】http://www.fuzi.cn/rj/ssbx070415.exe
【保护方式】
【软件简介】
〖半仙算命〗软件是目前网上功能最为强大,内容最为丰富的算命工具。软件集成了多种测算选项,测算内容、测算项目极其丰富,包括姓名吉凶测算、命运推算、科学起名向导、生男生女查询以及万年历、农历、中国黄历、皇历等等实用查询等。软件功能强大,使用简单、绿色、环保,只要你正确选择好出生的日期,即可自动转换为农历、属相、星座等然后软件将依此进行命运推算、姓名推算等等,软件运算参考数十种古代命理、算命、运程、吉凶书籍,有根有据。
【破解声明】
个人兴趣,讨论技术....
【破解过程】
1,查壳:
ssbx.exe拖至PEiD.结果为: ASPack 2.12 -> Alexey Solodovnikov.是个压缩壳,我还可以handle.嘿嘿.
2,脱壳:
祭出OD,OD加载,停在00689001 > 60 pushad ; (initial cpu selection)
F8一次,ESP红色 0012FFA4.
使用ESP定律,在Command中输入 dd esp,回车.
在内存窗口中第一行上右键->断点->硬件访问->DWord
F9,程序开始执行,停在:006893B0 /75 08 jnz short 006893BA
3次F8,程序大跳跃,飞到00573998,这里就是OEP了,在反汇编窗口右键->Dump debugged process->Dump->保存为ssbx_unpack.exe
运行一下ssbx_unpack.exe,成功运行,脱壳成功.使用PEiD查壳,显示Borland Delphi 6.0 - 7.0.
3,追码:
运行ssbx_unpack.exe.点软件注册,什么都不要填写,点注册,弹出:注册信息没有填写齐全.
OK,OD加载ssbx_unpack.exe,停在00573998 >/$ 55 push ebp,
反汇编窗口上右键->UltraStringReference->Find ASCii->Ctrl+F->搜索"注册信息没有填写齐全",成功找到.
双击这一行,回到0055BC54 |> \B8 84BE5500 mov eax, 0055BE84 ; 注册信息没有填写齐全.
这里附近都是注册验证的代码,往上面找个合适的地方下断.我们在这段子程序入口的地方下0055BB50 /. 55 push ebp,
按F2下断.F9,开始运行,点软件注册,确认码填写11111111,注册码填写22222222.
点确认注册,程序停在我们下的断点.多次F8,遇到回跳的跳转在其下一行F4,一直往下跟,同时注意寄存器窗口,多次F8之后到达0055BCB3 |. E8 C890EAFF call 00404D80,
右边寄存器窗口出现真假注册码
EAX 0105B9F8 ASCII "22222222"----我们写的假的注册码
ECX 00000001
EDX 0105BA5C ASCII "73565055"----真码
好了,我们退出OD,运行ssbx.exe.
输入确认码和注册码.成功注册!追码成功!(追出的可用确认码:11111111,注册码:73565055)
4,制作内存注册机:
如下图,中断地址:55BCB3,中断次数1,第一字节E8,指令长度5.内存方式,寄存器EDX,地址指针一层.可是生成的注册机就是无法成功使用,进程管理器里面有注册机和ssbx_unpack.exe的进程,可是没有任何界面,强行结束后explorer.exe桌面和任务栏还停止响应.郁闷.至今不知为什么.各位大大经过的话指点一下,小弟先谢谢了.
5,算法注册机:
正在我为内存注册机的事情郁闷的时候,看到那个帖子里面flying2000大大贴出了这个软件的算法分析,如下(开始的时候他的分析有误,后来更正):
【文章标题】: 半仙算命算法简析
【文章作者】: Flying2000
【软件名称】: 半仙算命
【加壳方式】: Aspack
【编写语言】: Delphi
【使用工具】: OllyDbg
【操作平台】: Vista
【软件介绍】: 算命软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
如LZ所述,找到关键点:
0055BC54 |> \B8 84BE5500 MOV EAX,unpacked.0055BE84 ; 注册信息没有填写齐全
0055BC59 |. E8 0E50EEFF CALL unpacked.00440C6C
0055BC5E |. E9 5E010000 JMP unpacked.0055BDC1
0055BC63 |> 8D95 5CFFFFFF LEA EDX,DWORD PTR SS:[EBP-A4] //经过了简单的有效性验证的注册码
0055BC69 |. 8B83 04030000 MOV EAX,DWORD PTR DS:[EBX+304]
继续往下看:
0055BC6F |. E8 6CC2EEFF CALL unpacked.00447EE0 ; 获得输入的注册码
0055BC74 |. 8B85 5CFFFFFF MOV EAX,DWORD PTR SS:[EBP-A4]
0055BC7A |. 50 PUSH EAX
0055BC7B |. 8D95 54FFFFFF LEA EDX,DWORD PTR SS:[EBP-AC]
0055BC81 |. 8B83 FC020000 MOV EAX,DWORD PTR DS:[EBX+2FC]
0055BC87 |. E8 54C2EEFF CALL unpacked.00447EE0
0055BC8C |. 8B85 54FFFFFF MOV EAX,DWORD PTR SS:[EBP-AC] ; 获得输入的确认码
0055BC92 |. E8 E9D9EAFF CALL unpacked.00409680 ; 确认码StrToInt转成整形Code1
0055BC97 |. B9 FC200000 MOV ECX,20FC
0055BC9C |. 99 CDQ
0055BC9D |. F7F9 IDIV ECX
0055BC9F |. 8BC2 MOV EAX,EDX ; eax=Code1 除 0x20FC的余数
0055BCA1 |. 8D95 58FFFFFF LEA EDX,DWORD PTR SS:[EBP-A8]
0055BCA7 |. E8 B0FDFFFF CALL unpacked.0055BA5C //关键算法call,跟入
0055BCAC |. 8B95 58FFFFFF MOV EDX,DWORD PTR SS:[EBP-A8]
0055BCB2 |. 58 POP EAX
0055BCB3 |. E8 C890EAFF CALL unpacked.00404D80 //明码比较,做内存注册机就看这里了:D
0055BCB8 |. 0F85 E9000000 JNZ unpacked.0055BDA7
0055BCBE |. A1 807D5700 MOV EAX,DWORD PTR DS:[577D80]
0055BCC3 |. 8B00 MOV EAX,DWORD PTR DS:[EAX]
0055BCC5 |. 8B80 2C040000 MOV EAX,DWORD PTR DS:[EAX+42C]
0055BCCB |. BA A4BE5500 MOV EDX,unpacked.0055BEA4 ; 本软件已注册
0055BCD0 |. E8 3BC2EEFF CALL unpacked.00447F10
0055BCD5 |. 8D95 50FFFFFF LEA EDX,DWORD PTR SS:[EBP-B0]
0055BCDB |. 8B83 FC020000 MOV EAX,DWORD PTR DS:[EBX+2FC]
0055BCE1 |. E8 FAC1EEFF CALL unpacked.00447EE0
0055BCE6 |. 8B8D 50FFFFFF MOV ECX,DWORD PTR SS:[EBP-B0]
0055BCEC |. BA BCBE5500 MOV EDX,unpacked.0055BEBC ; ssbxr
0055BCF1 |. 8BC6 MOV EAX,ESI
0055BCF3 |. E8 BCDEF4FF CALL unpacked.004A9BB4
跟入算法call,来到:
0055BA5C /$ 55 PUSH EBP
0055BA5D |. 8BEC MOV EBP,ESP
0055BA5F |. 33C9 XOR ECX,ECX
0055BA61 |. 51 PUSH ECX
0055BA62 |. 51 PUSH ECX
0055BA63 |. 51 PUSH ECX
0055BA64 |. 51 PUSH ECX
0055BA65 |. 53 PUSH EBX
0055BA66 |. 56 PUSH ESI
0055BA67 |. 8BF2 MOV ESI,EDX
0055BA69 |. 8BD8 MOV EBX,EAX
0055BA6B |. 33C0 XOR EAX,EAX
0055BA6D |. 55 PUSH EBP
0055BA6E |. 68 2CBB5500 PUSH unpacked.0055BB2C
0055BA73 |. 64:FF30 PUSH DWORD PTR FS:[EAX]
0055BA76 |. 64:8920 MOV DWORD PTR FS:[EAX],ESP
0055BA79 |. 81F3 F1250B00 XOR EBX,0B25F1 ; Code1 = Code1 xor 0x0B25F1
0055BA7F |. 8BC3 MOV EAX,EBX
0055BA81 |. 33D2 XOR EDX,EDX
0055BA83 |. 52 PUSH EDX ; /Arg2 => 00000000
0055BA84 |. 50 PUSH EAX ; |Arg1
0055BA85 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4] ; |
0055BA88 |. E8 BFDBEAFF CALL unpacked.0040964C ; \unpacked.0040964C 该call将计算完的整形转为string
0055BA8D |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] ;
0055BA90 |. 0FB600 MOVZX EAX,BYTE PTR DS:[EAX] ; 第一位的ASCII
0055BA93 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] ;
0055BA96 |. 0FB652 01 MOVZX EDX,BYTE PTR DS:[EDX+1] ; 第二位的ASCII
0055BA9A |. 03C2 ADD EAX,EDX ; 相加
0055BA9C |. B9 05000000 MOV ECX,5
0055BAA1 |. 99 CDQ
0055BAA2 |. F7F9 IDIV ECX
0055BAA4 |. 80C2 34 ADD DL,34 ; 除5的余数+0x34
0055BAA7 |. 8855 F8 MOV BYTE PTR SS:[EBP-8],DL
0055BAAA |. 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0055BAAD |. 0FB640 02 MOVZX EAX,BYTE PTR DS:[EAX+2] ; 第三位ASCII
0055BAB1 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0055BAB4 |. 0FB652 03 MOVZX EDX,BYTE PTR DS:[EDX+3] ; 第四位ASCII
0055BAB8 |. 03C2 ADD EAX,EDX
0055BABA |. B9 05000000 MOV ECX,5
0055BABF |. 99 CDQ
0055BAC0 |. F7F9 IDIV ECX
0055BAC2 |. 8BDA MOV EBX,EDX
0055BAC4 |. 80C3 33 ADD BL,33 ; 一样,+0x33
0055BAC7 |. 885D F9 MOV BYTE PTR SS:[EBP-7],BL
0055BACA |. 8D45 F4 LEA EAX,DWORD PTR SS:[EBP-C]
0055BACD |. 8A55 F8 MOV DL,BYTE PTR SS:[EBP-8]
0055BAD0 |. E8 8F90EAFF CALL unpacked.00404B64
0055BAD5 |. 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
0055BAD8 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
0055BADB |. B9 1B000000 MOV ECX,1B
0055BAE0 |. E8 3794EAFF CALL unpacked.00404F1C //连接字符串1
0055BAE5 |. 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
0055BAE8 |. 8BD3 MOV EDX,EBX
0055BAEA |. E8 7590EAFF CALL unpacked.00404B64
0055BAEF |. 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
0055BAF2 |. 8D55 FC LEA EDX,DWORD PTR SS:[EBP-4]
0055BAF5 |. B9 19000000 MOV ECX,19
0055BAFA |. E8 1D94EAFF CALL unpacked.00404F1C //连接字符串2
0055BAFF |. 8BC6 MOV EAX,ESI
0055BB01 |. 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4]
0055BB04 |. E8 CF8EEAFF CALL unpacked.004049D8
0055BB09 |. 33C0 XOR EAX,EAX
0055BB0B |. 5A POP EDX
0055BB0C |. 59 POP ECX
0055BB0D |. 59 POP ECX
0055BB0E |. 64:8910 MOV DWORD PTR FS:[EAX],EDX
0055BB11 |. 68 33BB5500 PUSH unpacked.0055BB33
0055BB16 |> 8D45 F0 LEA EAX,DWORD PTR SS:[EBP-10]
0055BB19 |. BA 02000000 MOV EDX,2
0055BB1E |. E8 858EEAFF CALL unpacked.004049A8
0055BB23 |. 8D45 FC LEA EAX,DWORD PTR SS:[EBP-4]
0055BB26 |. E8 598EEAFF CALL unpacked.00404984
0055BB2B \. C3 RETN
算法总结:
A=确认码除0x20FC的余数与0x0B25F1进行异或。
B=A的第一位ASCII+A的第二位ASCII
C=A的第三位ASCII+A的第四位ASCII
注册码=A的字符串形态+(B除5的余数+0x34)对应的字符+(C除5的余数+0x33)对应的字符
--------------------------------------------------------------------------------
【经验总结】
软件的算法很简单只是我说起来有点晕而已,呵呵。明码比较更是其中的重大破绽,总体来说,是个适合练手的软件^_^
--------------------------------------------------------------------------------
【版权声明】: 本文原创于霏凡论坛, 转载请注明作者并保持文章的完整, 谢谢!
2007年09月04日 16:06:15
看过算法后,正好初学Delphi,就用Delphi写的注册机,TForm1上用了三个TLabel,一个TButton,两个TEdit,源码如下:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Edit1: TEdit;
Edit2: TEdit;
Button1: TButton;
Edit3: TEdit;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
ron:integer;
varA:integer;
varB:integer;
varC:integer;
implementation
{$R *.dfm}
procedure TForm1.Button1Click(Sender: TObject);
begin
randomize;
ron:=random(90000000)+10000000; //产生10000000-99999999的随机数,作为确认码
form1.Edit1.Text:=inttostr(ron);
varA:=(ron mod 8444) xor 730609; //确认码除以0x20FC的余数和0x0B25F1异或
varB:=ord(copy(inttostr(varA),1,1)[1])+ord(copy(inttostr(varA),2,1)[1]); //varA的第一位的ascii码+varA的第二位的ascii码的和
varC:=ord(copy(inttostr(varA),3,1)[1])+ord(copy(inttostr(varA),4,1)[1]); //varA的第三位的ascii码+varA的第四位的ascii码的和
form1.Edit2.Text:=inttostr(varA)+inttostr(((varB mod 5)+34) mod 10)+inttostr(((varC mod 5)+33) mod 10);
//注册码
end;
end.
效果如下图:
偶写好的注册机下载地址:半仙算命V2007 Build0415注册机
注册效果:
终于发完了,这是我在PYG的第二贴,有什么不对的大虾们一定要斧正哦~~~thx adv.
[ 本帖最后由 Xusually 于 2007-12-2 15:22 编辑 ] |
评分
-
查看全部评分
|