首页
社区
课程
招聘
Delphi内联汇编做注册机
发表于: 2011-10-6 20:03 4908

Delphi内联汇编做注册机

2011-10-6 20:03
4908
目标程序是Delphi写的,没有加壳方便分析了。
    OD加载目标程序,F9运行来到软件注册界面,输入假注册码,根据提示很容易定位到关键的算法。

    注册算法如下,就是先取机器码的奇数位ASCII码并相加得“和一”,再取机器码的偶数位ASCII码并相加得“和二”,“和一”乘“和二”得到注册码。算法很简单用高级语言写出注册机不是难事。

00474B99  |> /8B45 FC       /mov eax,dword ptr ss:[ebp-4]       //[ebp-4]中是机器码   
00474B9C  |. |0FB64418 FF   |movzx eax,byte ptr ds:[eax+ebx-1]  
00474BA1  |. |03F8          |add edi,eax
00474BA3  |. |83C3 02       |add ebx,2
00474BA6  |> |8B45 FC       |mov eax,dword ptr ss:[ebp-4]
00474BA9  |. |E8 72FCF8FF   |call 00404820
00474BAE  |. |3BD8          |cmp ebx,eax
00474BB0  |.^\7E E7         \jle short 00474B99                 //此循环取机器码的奇数位ASCII码并相加
00474BB2  |.  EB 0E         jmp short 00474BC2
00474BB4  |>  8B45 FC       /mov eax,dword ptr ss:[ebp-4]       //[ebp-4]中是机器码
00474BB7  |.  0FB64430 FF   |movzx eax,byte ptr ds:[eax+esi-1]
00474BBC  |.  0145 F8       |add dword ptr ss:[ebp-8],eax
00474BBF  |.  83C6 02       |add esi,2
00474BC2  |>  8B45 FC       |mov eax,dword ptr ss:[ebp-4]
00474BC5  |.  E8 56FCF8FF   |call 00404820
00474BCA  |.  3BF0          |cmp esi,eax
00474BCC  |.^ 7E E6         \jle short 00474BB4                 //此循环取机器码的偶数位ASCII码并相加
00474BCE  |.  8BDF          mov ebx,edi
00474BD0  |.  0FAF5D F8     imul ebx,dword ptr ss:[ebp-8]       //两数相乘,结果在ebx中,转为十进制后即是注册码

     有的朋友说,我的分析能力不行,也想写注册机,那么怎么办呢?
     听说Delphi容易上手,于是就下载了个DelphiXE2,它有很多令人惊叹的新功能,还支持64位,现在就用它的内联汇编功能写个注册机玩玩,这对分析
能力暂时不行,又想写注册机的朋友也许会有所帮助。
===============================================================================================================
选中00474B99到0047BD0之间部分,右键,如图。这步要用到DataChage.dll这个OD插件。



L00474B99:
        mov eax,dword ptr ss:[ebp-04h]
        movzx eax,byte ptr ds:[eax+ebx-01h]
        add edi,eax
        add ebx,02h
        mov eax,dword ptr ss:[ebp-04h]
        call L00404820
        cmp ebx,eax
        jle short L00474B99
        jmp short L00474BC2
L00474BB4:
        mov eax,dword ptr ss:[ebp-04h]
        movzx eax,byte ptr ds:[eax+esi-01h]
        add dword ptr ss:[ebp-08h],eax
        add esi,02h
L00474BC2:
        mov eax,dword ptr ss:[ebp-04h]
        call L00404820
        cmp esi,eax
        jle short L00474BB4
        mov ebx,edi
        imul ebx,dword ptr ss:[ebp-08h]
L00404820 Proc
        test eax,eax
        je short L00404827
        mov eax,dword ptr ds:[eax-04h]
        ret
L00404820 Endp

      复制下来的数据是上面这样的,为了能在delphi中使用,我们要稍做修改,修改量很小,基本上是原汁原味,修改后的数据(也即delphi源码)如下:

procedure L00404820;
begin
  asm
    test eax,eax
    je @L00404827
    mov eax,dword ptr ds:[eax-04h]
  @L00404827:
    ret
  end;
end;

procedure TForm1.cmdGenClick(Sender: TObject);
var
  HDID: AnsiString;
  SN, len: Integer;
begin

  HDID := txtID.Text;
  len := Length(HDID);

  if (len = 0) then
  begin
    ShowMessage('用户名或机器码长度必须大于0,请检查!');
    Exit;
  end;
  asm
    pushad
    xor eax,eax
    xor esi,esi
    xor edi,edi
    xor ebx,ebx
    mov ebx,1
  @L00474B99:
    mov eax,dword ptr [HDID]
    movzx eax,byte ptr ds:[eax+ebx-01h]
    add edi,eax
    add ebx,02h
    mov eax,dword ptr ss:[HDID]
    call L00404820
    cmp ebx,eax
    jle  @L00474B99
    jmp @L00474BC2
  @L00474BB4:
    mov eax,dword ptr ss:[HDID]
    movzx eax,byte ptr ds:[eax+esi-01h]
    add dword ptr ss:[ebp-08h],eax
    add esi,02h
  @L00474BC2:
    mov eax,dword ptr [HDID]
    call L00404820
    cmp esi,eax
    jle @L00474BB4
    mov ebx,edi
    imul ebx,dword ptr ss:[ebp-08h]
    mov SN,ebx
    popad
  end;

  txtSN.Text := IntToStr(SN);
end;

以上代码在XP3,DelphiXE2中测试通过,附件中是目标软件。

目标软件.rar

[课程]Android-CTF解题方法汇总!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 244
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
请分享一下插件[DataChage.dll]
谢谢
2011-10-6 22:03
0
游客
登录 | 注册 方可回帖
返回
//