Xusually 发表于 2007-12-2 15:14:15

菜鸟的《半仙算命》手动脱壳,追注册码,算法注册机全系列.大侠莫笑我~~

    昨天刚刚注册的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.嘿嘿.
http://xusually.a.orn.jp/shell.jpg
    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.
http://xusually.a.orn.jp/unpacked.jpg
    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桌面和任务栏还停止响应.郁闷.至今不知为什么.各位大大经过的话指点一下,小弟先谢谢了.
http://xusually.a.orn.jp/memokeygen.jpg
    5,算法注册机:
      正在我为内存注册机的事情郁闷的时候,看到那个帖子里面flying2000大大贴出了这个软件的算法分析,如下(开始的时候他的分析有误,后来更正):
【文章标题】: 半仙算命算法简析
【文章作者】: Flying2000
【软件名称】: 半仙算命
【加壳方式】: Aspack
【编写语言】: Delphi
【使用工具】: OllyDbg
【操作平台】: Vista
【软件介绍】: 算命软件
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
如LZ所述,找到关键点:
0055BC54|> \B8 84BE5500MOV EAX,unpacked.0055BE84                ;注册信息没有填写齐全
0055BC59|.E8 0E50EEFFCALL unpacked.00440C6C
0055BC5E|.E9 5E010000JMP unpacked.0055BDC1
0055BC63|>8D95 5CFFFFFF LEA EDX,DWORD PTR SS://经过了简单的有效性验证的注册码
0055BC69|.8B83 04030000 MOV EAX,DWORD PTR DS:
继续往下看:
0055BC6F|.E8 6CC2EEFFCALL unpacked.00447EE0                  ;获得输入的注册码
0055BC74|.8B85 5CFFFFFF MOV EAX,DWORD PTR SS:
0055BC7A|.50            PUSH EAX
0055BC7B|.8D95 54FFFFFF LEA EDX,DWORD PTR SS:
0055BC81|.8B83 FC020000 MOV EAX,DWORD PTR DS:
0055BC87|.E8 54C2EEFFCALL unpacked.00447EE0
0055BC8C|.8B85 54FFFFFF MOV EAX,DWORD PTR SS:            ;获得输入的确认码
0055BC92|.E8 E9D9EAFFCALL unpacked.00409680                  ;确认码StrToInt转成整形Code1
0055BC97|.B9 FC200000MOV 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:            
0055BCA7|.E8 B0FDFFFFCALL unpacked.0055BA5C//关键算法call,跟入
0055BCAC|.8B95 58FFFFFF MOV EDX,DWORD PTR SS:
0055BCB2|.58            POP EAX
0055BCB3|.E8 C890EAFFCALL unpacked.00404D80//明码比较,做内存注册机就看这里了:D
0055BCB8|.0F85 E9000000 JNZ unpacked.0055BDA7
0055BCBE|.A1 807D5700MOV EAX,DWORD PTR DS:
0055BCC3|.8B00          MOV EAX,DWORD PTR DS:
0055BCC5|.8B80 2C040000 MOV EAX,DWORD PTR DS:
0055BCCB|.BA A4BE5500MOV EDX,unpacked.0055BEA4                ;本软件已注册
0055BCD0|.E8 3BC2EEFFCALL unpacked.00447F10
0055BCD5|.8D95 50FFFFFF LEA EDX,DWORD PTR SS:
0055BCDB|.8B83 FC020000 MOV EAX,DWORD PTR DS:
0055BCE1|.E8 FAC1EEFFCALL unpacked.00447EE0
0055BCE6|.8B8D 50FFFFFF MOV ECX,DWORD PTR SS:
0055BCEC|.BA BCBE5500MOV EDX,unpacked.0055BEBC                ;ssbxr
0055BCF1|.8BC6          MOV EAX,ESI
0055BCF3|.E8 BCDEF4FFCALL 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 2CBB5500PUSH unpacked.0055BB2C
0055BA73|.64:FF30      PUSH DWORD PTR FS:
0055BA76|.64:8920      MOV DWORD PTR FS:,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:            ; |
0055BA88|.E8 BFDBEAFFCALL unpacked.0040964C                  ; \unpacked.0040964C 该call将计算完的整形转为string
0055BA8D|.8B45 FC      MOV EAX,DWORD PTR SS:            ;
0055BA90|.0FB600      MOVZX EAX,BYTE PTR DS:            ;第一位的ASCII
0055BA93|.8B55 FC      MOV EDX,DWORD PTR SS:            ;
0055BA96|.0FB652 01    MOVZX EDX,BYTE PTR DS:            ;第二位的ASCII
0055BA9A|.03C2          ADD EAX,EDX                              ;相加
0055BA9C|.B9 05000000MOV ECX,5
0055BAA1|.99            CDQ
0055BAA2|.F7F9          IDIV ECX
0055BAA4|.80C2 34      ADD DL,34                              ;除5的余数+0x34
0055BAA7|.8855 F8      MOV BYTE PTR SS:,DL
0055BAAA|.8B45 FC      MOV EAX,DWORD PTR SS:
0055BAAD|.0FB640 02    MOVZX EAX,BYTE PTR DS:            ;第三位ASCII
0055BAB1|.8B55 FC      MOV EDX,DWORD PTR SS:
0055BAB4|.0FB652 03    MOVZX EDX,BYTE PTR DS:            ;第四位ASCII
0055BAB8|.03C2          ADD EAX,EDX
0055BABA|.B9 05000000MOV 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:,BL
0055BACA|.8D45 F4      LEA EAX,DWORD PTR SS:
0055BACD|.8A55 F8      MOV DL,BYTE PTR SS:
0055BAD0|.E8 8F90EAFFCALL unpacked.00404B64
0055BAD5|.8B45 F4      MOV EAX,DWORD PTR SS:
0055BAD8|.8D55 FC      LEA EDX,DWORD PTR SS:
0055BADB|.B9 1B000000MOV ECX,1B
0055BAE0|.E8 3794EAFFCALL unpacked.00404F1C//连接字符串1
0055BAE5|.8D45 F0      LEA EAX,DWORD PTR SS:
0055BAE8|.8BD3          MOV EDX,EBX
0055BAEA|.E8 7590EAFFCALL unpacked.00404B64
0055BAEF|.8B45 F0      MOV EAX,DWORD PTR SS:
0055BAF2|.8D55 FC      LEA EDX,DWORD PTR SS:
0055BAF5|.B9 19000000MOV ECX,19
0055BAFA|.E8 1D94EAFFCALL unpacked.00404F1C//连接字符串2
0055BAFF|.8BC6          MOV EAX,ESI
0055BB01|.8B55 FC      MOV EDX,DWORD PTR SS:
0055BB04|.E8 CF8EEAFFCALL 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:,EDX
0055BB11|.68 33BB5500PUSH unpacked.0055BB33
0055BB16|>8D45 F0      LEA EAX,DWORD PTR SS:
0055BB19|.BA 02000000MOV EDX,2
0055BB1E|.E8 858EEAFFCALL unpacked.004049A8
0055BB23|.8D45 FC      LEA EAX,DWORD PTR SS:
0055BB26|.E8 598EEAFFCALL 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))+ord(copy(inttostr(varA),2,1)); //varA的第一位的ascii码+varA的第二位的ascii码的和
varC:=ord(copy(inttostr(varA),3,1))+ord(copy(inttostr(varA),4,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.

效果如下图:
http://xusually.a.orn.jp/keygen.jpg

偶写好的注册机下载地址:半仙算命V2007 Build0415注册机
注册效果:
http://xusually.a.orn.jp/reg.jpg

    终于发完了,这是我在PYG的第二贴,有什么不对的大虾们一定要斧正哦~~~thx adv.

[ 本帖最后由 Xusually 于 2007-12-2 15:22 编辑 ]

xunhua 发表于 2007-12-2 15:50:42

不错..比我强了很多..看来是高手云集啊...

Xusually 发表于 2007-12-2 16:02:21

ls的,偶真的菜鸟一个。呵呵。大家共同进步。

柳韵荷风 发表于 2007-12-2 16:18:52

说的很详细,学习一下。

yuwenfeng 发表于 2007-12-2 17:02:21

终于注册到了,呵呵,第一次发帖
顶你!!呵呵/

azsx1987 发表于 2007-12-2 21:49:18

学习。。。。。。。。。。。。

Xusually 发表于 2007-12-3 20:39:14

本帖最近评分记录
tianxj 飘云币 +5 感谢您发布的原创作品! 2007-12-2 21:16


谢谢tianxj!!!大家共同进步!

liuyun213 发表于 2007-12-3 20:46:22

看过这个软件
不过不懂算法啊

Rusher_Z 发表于 2007-12-4 10:59:49

真是强,学习中……
页: [1]
查看完整版本: 菜鸟的《半仙算命》手动脱壳,追注册码,算法注册机全系列.大侠莫笑我~~