• 标 题:破解XFtpSvr =====> 请进 (5千字)
  • 作 者:Edea[BCG]
  • 时 间:2001-7-1 12:49:53
  • 链 接:http://bbs.pediy.com

软件名称:XNETECH FTP Server 0.1.1.616
软件简介:基于Windows95/98/NT/2000的FTP服务器;支持RFC-959标准中所有基本的FTP命令;支持多线程、断点续传等功能;不限制用户数,允许不同用户使用不同的路径;不同用户可以赋予不同的的权限;对用户的目录进行容量的限制;自动识别IP地址,并对不同的IP地址赋予不同的的权限;扩展FTP命令集,使用FTP客户端软件能管理FTP服务器;远程查看FTP服务器的当前状态;远程增加或删除用户的帐户;远程断开任何用户或IP地址的FTP连接;远程启动或停止FTP服务器的运行;远程查看用户的帐户; 允许匿名访问;简单而强大的图形介面,操作十分简单;无须进行安装设置即可运行;
下载地址(软件主页):http://xnetech.363.net/
破解难度:very easy
破解人:Edea[BCG]    (QQ:3849036)

首先,用FI检查,发现该软件用UPX加壳,用UPX -d脱之。
用Wdasm反汇编,在反汇编的同时,打开软件(嘿嘿,为了节约时间)。点Help/Register Info,填入:
UserName=Edea
Company=BCG
RegisterNO=9876543210
点OK,对话框消失,没任何反映(我晕~~~),经过N(N<=1)分钟的努力,我发现该软件把我填的注册信息放到了软件目录中得xftpsvr.ini里。
反汇编完成,又经过N(N<=2)分钟的努力,在反汇编出来的代码中,找到这么一段:
* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00499218(C)
|
:00499226 8B9324040000            mov edx, dword ptr [ebx+00000424]
:0049922C 8BC3                    mov eax, ebx
:0049922E E8557CF9FF              call 00430E88
:00499233 8B9328040000            mov edx, dword ptr [ebx+00000428]
:00499239 8BC3                    mov eax, ebx
:0049923B E8287CF9FF              call 00430E68
:00499240 8B932C040000            mov edx, dword ptr [ebx+0000042C]
:00499246 8BC3                    mov eax, ebx
:00499248 E85F7CF9FF              call 00430EAC
:0049924D 8B9330040000            mov edx, dword ptr [ebx+00000430]
:00499253 8BC3                    mov eax, ebx
:00499255 E8727CF9FF              call 00430ECC
:0049925A E825F3FDFF              call 00478584                    ----->关键CALL
:0049925F 84C0                    test al, al
:00499261 7519                    jne 0049927C                    ----->嘿嘿,关键跳转点
:00499263 A1C4624A00              mov eax, dword ptr [004A62C4]
:00499268 C70001000000            mov dword ptr [eax], 00000001

* Possible StringData Ref from Code Obj ->"XNETECH FTP SERVER - http://xnetech.363.net/ "
                                        ->"[UnRegister]"
                                  |
:0049926E BAC0924900              mov edx, 004992C0
:00499273 8BC3                    mov eax, ebx
:00499275 E82A84F9FF              call 004316A4
:0049927A EB0C                    jmp 00499288

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00499261(C)
|

* Possible StringData Ref from Code Obj ->"XNETECH FTP Server - http://xnetech.363.net/"
                                  |
:0049927C BA04934900              mov edx, 00499304
:00499281 8BC3                    mov eax, ebx
:00499283 E81C84F9FF              call 004316A4

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0049927A(U)
|
:00499288 8BC3                    mov eax, ebx
:0049928A 8B10                    mov edx, dword ptr [eax]
:0049928C FF9280000000            call dword ptr [edx+00000080]
:00499292 8BC3                    mov eax, ebx
:00499294 E82B040000              call 004996C4
:00499299 8BC3                    mov eax, ebx
:0049929B E8C8020000              call 00499568
:004992A0 33C0                    xor eax, eax
:004992A2 5A                      pop edx
:004992A3 59                      pop ecx
:004992A4 59                      pop ecx
:004992A5 648910                  mov dword ptr fs:[eax], edx
:004992A8 68B5924900              push 004992B5

***********************************************************************************************

该软件在启动的时候会检查储存在xftpsvr.ini里的注册码,判断注册与否。
退出程序,打开TRW2000(我的最爱),下断点bpx 0049924D,然后再运行程序,被拦下:

************************************************************************************************

0177:0049924D  MOV      EDX,[EBX+0430]
0177:00499253  MOV      EAX,EBX
0177:00499255  CALL    00430ECC
0177:0049925A  CALL    00478584              ------>F8跟入
0177:0049925F  TEST    AL,AL
0177:00499261  JNZ      0049927C
0177:00499263  MOV      EAX,[004A62C4]
0177:00499268  MOV      DWORD [EAX],01
0177:0049926E  MOV      EDX,004992C0
0177:00499273  MOV      EAX,EBX
0177:00499275  CALL    004316A4
0177:0049927A  JMP      SHORT 00499288
0177:0049927C  MOV      EDX,00499304
0177:00499281  MOV      EAX,EBX


Call from 0049925A:
0177:00478584  PUSH    EBP
0177:00478585  MOV      EBP,ESP
0177:00478587  PUSH    BYTE +00
0177:00478589  PUSH    EBX
0177:0047858A  XOR      EAX,EAX
0177:0047858C  PUSH    EBP
0177:0047858D  PUSH    DWORD 004785DC
0177:00478592  PUSH    DWORD [FS:EAX]
0177:00478595  MOV      [FS:EAX],ESP
0177:00478598  LEA      EAX,[EBP-04]
0177:0047859B  PUSH    EAX
0177:0047859C  MOV      CX,2710
0177:004785A0  MOV      EDX,[004A7AFC]          ----->"BCG"==>EDX
0177:004785A6  MOV      EAX,[004A7AF8]          ----->"Edea"==>EAX
0177:004785AB  CALL    004785EC                ----->算注册码的Call,如果要写注册机就跟入
0177:004785B0  MOV      EAX,[EBP-04]            ----->真注册码==>EAX
0177:004785B3  MOV      EDX,[004A7B00]          ----->假注册码==>EDX
0177:004785B9  CALL    00403FC8                ----->比较真假注册码
0177:004785BE  JNZ      004785C4                ----->不相等吗?去死吧!
0177:004785C0  MOV      BL,01
0177:004785C2  JMP      SHORT 004785C6
0177:004785C4  XOR      EBX,EBX
0177:004785C6  XOR      EAX,EAX
0177:004785C8  POP      EDX


我的注册码:
UserName=Edea   
Company=BCG
RegisterNO=C86428289719A64C3ADEC11B45C91EEA


这个软件破解很简单,我的本意是想写一下这个软件的注册机,可惜功力不够,在程序中转晕了头。希望各位兄弟(特别是伪哥)能帮忙写出注册机,让小弟学习学习。

  • 标 题:贴这个的注册机~~~~ (1千字)
  • 作 者:伪装者[CCG]
  • 时 间:2001-7-1 19:08:04

#include "stdio.h"
main()
{
unsigned char string[81],comp[81];
int i,a;
unsigned c,esi=10000,d;
static unsigned char tb1[32]={'#','$','H','&',')','&','H','&','%','H','|','+','_','%','B','R','$','B','*','!','2','%','G','&','%','G','@','%','G','@','g','2'};
static unsigned char tb2[32]={'%','$','^','F','&','G','F','V','(','(','Y','B','%','F','J','H','G','L','0','k','+','|','+','_',')','+','N','K','J','G','J','^'};
printf("*********Xftpsvr 0.1.2.620*********\nThis keygen is maked by Pretender\nPlease input your name    : ");
gets(string);
printf("Please input your Company : ");
gets(comp);
a=strlen(string);
printf("Your Register code is    : ");
for(i=0;(c=string[i])!='\0';i++)
  {d=esi;d/=256;c^=d;esi+=c;esi*=0xce6d;esi+=0x58bf;
  if(i!=a-1) tb1[i]=c;}
  a=strlen(comp);
for(i=0;(c=comp[i])!='\0';i++)
  {d=esi;d/=256;c^=d;esi+=c;esi*=0xce6d;esi+=0x58bf;
  if(i!=a-1) tb2[i]=c;}
for(i=0;i<32;i++)
  /*printf("%x,,,",tb1[i]);*/
  {if(i!=31) c=tb2[30-i]^tb1[i];
  else c=0^tb1[i];
  c&=0xff;
  d=esi;d/=256;c^=d;esi+=tb1[i];esi*=0xce6d;esi+=0x58bf;
  if(c>0xf) {c/=16;printf("%X",c);}
  else printf("%X",c);
  }
printf("\n *****************************      ---    ---    ---\n *Welcome to WWW.CRACKNOW.COM*      /      /      / --\n *****************************      ---    ---    --/\n");}