飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 5555|回复: 8

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

[复制链接]

该用户从未签到

发表于 2007-12-2 15:14:15 | 显示全部楼层 |阅读模式
    昨天刚刚注册的PYG,一直很想进来,看到开放注册了马上就注册了,大礼包里面有Delphi的培训班,正好我可以借着发这个帖子来个原创,呵呵,两个月前在FF写的东西,大侠莫笑我哦 o(∩_∩)o...呵呵。
【破文标题】《半仙算命》手动脱壳,追注册码,算法注册机全系列.大侠莫笑我~~
【破文作者】Xusually
【作者邮箱】xusually@yahoo.com.cn
【作者主页】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 编辑 ]

评分

参与人数 1飘云币 +20 收起 理由
tianxj + 20 感谢您发布的原创作品!

查看全部评分

PYG19周年生日快乐!

该用户从未签到

发表于 2007-12-2 15:50:42 | 显示全部楼层
不错..比我强了很多..看来是高手云集啊...
PYG19周年生日快乐!

该用户从未签到

 楼主| 发表于 2007-12-2 16:02:21 | 显示全部楼层
ls的,偶真的菜鸟一个。呵呵。大家共同进步。
PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-11-7 21:14
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2007-12-2 16:18:52 | 显示全部楼层
    说的很详细,学习一下。
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-2 17:02:21 | 显示全部楼层
    终于注册到了,呵呵,第一次发帖
    顶你!!呵呵/
    PYG19周年生日快乐!
  • TA的每日心情

    2018-8-25 09:56
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 2007-12-2 21:49:18 | 显示全部楼层
    学习。。。。。。。。。。。。
    PYG19周年生日快乐!

    该用户从未签到

     楼主| 发表于 2007-12-3 20:39:14 | 显示全部楼层
    本帖最近评分记录
    tianxj 飘云币 +5 感谢您发布的原创作品! 2007-12-2 21:16


    谢谢tianxj!!!大家共同进步!
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-2-6 23:35
  • 签到天数: 1 天

    [LV.1]初来乍到

    发表于 2007-12-3 20:46:22 | 显示全部楼层
    看过这个软件
    不过不懂算法啊
    PYG19周年生日快乐!

    该用户从未签到

    发表于 2007-12-4 10:59:49 | 显示全部楼层
    真是强,学习中……
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表