呃,寒假闲来无事,本来安排好的目标也懒得看了,百般无聊之下于是玩起了网游(偶第一次玩网游)~~。。

那啥,发现这个游戏的玩家的等级都是挂上去的,放假前我们班的同学都玩这个游戏,并且好多都买了外挂,看我淘宝的消费记录:



那啥,好不容易收的压岁钱不能买外挂呀,于是,破解之。。

外挂使用:
1:要求外挂账号与你的游戏账号必须是一样的,否则无法登陆,密码无所谓。




2:新用户有两天的免费使用期



ok,对外挂抓包,发现与服务器交流使用的chunked 协议:

 11  0.0.0.0:3753  222.73.225.182:80  151  Send  
 20000  47 45 54 20 2F 6C 6F 67 69 6E 2E 70 68 70 3F 6D    GET /login.php?m
 30010  3D 31 26 75 3D 63 64 63 64 63 64 26 70 3D 63 64    =1&u=cdcdcd&p=cd
 40020  63 64 63 64 26 6B 3D 37 38 38 39 35 37 34 34 20    cdcd&k=78895744 
 50030  48 54 54 50 2F 31 2E 31 0D 0A 55 73 65 72 2D 41    HTTP/1.1..User-A
 60040  67 65 6E 74 3A 20 4D 69 63 72 6F 73 6F 66 74 20    gent: Microsoft 
 70050  49 6E 74 65 72 6E 65 74 20 45 78 70 6C 6F 72 65    Internet Explore
 80060  72 0D 0A 48 6F 73 74 3A 20 6C 6F 67 69 6E 2E 77    r..Host: login.w
 90070  6C 71 78 32 77 67 2E 63 6F 6D 0D 0A 43 61 63 68    lqx2wg.com..Cach
100080  65 2D 43 6F 6E 74 72 6F 6C 3A 20 6E 6F 2D 63 61    e-Control: no-ca
110090  63 68 65 0D 0A 0D 0A                               che.
12
132  222.73.225.182:80  0.0.0.0:3753  293  Recv  
140000  48 54 54 50 2F 31 2E 31 20 32 30 30 20 4F 4B 0D    HTTP/1.1 200 OK.
150010  0A 44 61 74 65 3A 20 57 65 64 2C 20 31 31 20 46    .Date: Wed, 11 F
160020  65 62 20 32 30 30 39 20 30 38 3A 34 35 3A 33 30    eb 2009 08:45:30
170030  20 47 4D 54 0D 0A 53 65 72 76 65 72 3A 20 41 70     GMT..Server: Ap
180040  61 63 68 65 2F 32 0D 0A 58 2D 50 6F 77 65 72 65    ache/2..X-Powere
190050  64 2D 42 79 3A 20 50 48 50 2F 35 2E 32 2E 36 0D    d-By: PHP/5.2.6.
200060  0A 63 61 63 68 65 2D 63 6F 6E 74 72 6F 6C 3A 20    .cache-control: 
210070  6E 6F 2D 63 61 63 68 65 0D 0A 56 61 72 79 3A 20    no-cache..Vary: 
220080  41 63 63 65 70 74 2D 45 6E 63 6F 64 69 6E 67 2C    Accept-Encoding,
230090  55 73 65 72 2D 41 67 65 6E 74 0D 0A 54 72 61 6E    User-Agent..Tran
2400A0  73 66 65 72 2D 45 6E 63 6F 64 69 6E 67 3A 20 63    sfer-Encoding: c
2500B0  68 75 6E 6B 65 64 0D 0A 43 6F 6E 74 65 6E 74 2D    hunked..Content-
2600C0  54 79 70 65 3A 20 74 65 78 74 2F 68 74 6D 6C 0D    Type: text/html.
2700D0  0A 0D 0A 34 63 0D 0A 41 53 69 31 78 38 4B 38 73    4c..ASi1x8K8s
2800E0  38 6D 35 70 69 34 67 43 72 57 39 78 74 72 4B 73    8m5pi4gCrW9xtrKs
2900F0  62 7A 6B 4F 69 41 79 4D 44 41 35 4C 54 41 79 4C    bzkOiAyMDA5LTAyL
300100  54 45 7A 49 44 45 32 4F 6A 51 30 4F 6A 4D 30 30    TEzIDE2OjQ0OjM00
310110  39 6A 47 39 4B 41 44 4C 46 67 6D 42 65 47 47 78    9jG9KADLFgmBeGGx
320120  6D 6A 37 0D 0A                                     mj7..
33


没错,加过密的...迷糊...

PEiD 一下 ,加壳了:



偶非得不反汇编,不解密,不破坏原程序破解它。

既然外挂不解密,不反汇编是行不了,那么破解游戏吧。。

正常启动游戏,登陆,并抓包:



没错,加密了,咋法? 咱也不费脑子解密了,拿来主义吧。

ok,拿来C++,写代码:
static char PACKET[] = {

    
0x300x800xD30xC50xC50xC20xAD0xAA0xB70xAB0xB1
    
0xA80x000xC60xAD0xA50xA90xA60xA50xBD0xA10xAD0xAA
}
;

int WINAPI MySend( SOCKET  s , const char * buff , int len , int flags ){
//自定义函数,用来Hook 系统的send函数

    
const char * pbuff = buff;
    
char * tmp = NULL;
    
int rtn , length = len;

    printf(
"\n[DLL] Send:< %s >" , buff );

    
if( len >= 2 && ( buff[0== (char)0x30 && buff[1== (char)0x80 ) ){
        printf(
"\n[DLL] INFO: filter expired , take place of it ");

        
if( packets == 0 ){
            pbuff 
= PACKET ;
            length 
= sizeof( PACKET);
            memcpy( data , buff , 
15 );
        }
else if( memcmp( buff , data , 15 ) == 0 ){
            pbuff 
= PACKET ;
            length 
= sizeof( PACKET );
            packets 
= 0;
        }


    
/*}else if( buff[0] == 0x06 && buff[1] == 0xB2 ){
        pbuff = PACKET2;
        length = sizeof( PACKET2 );
*/

    }
else{
        
if( buff[0== 0x80 ){
            length 
= len + 1;
        }
else{
            length 
= len + 2;
        }


        tmp 
= new char[ length ];
        tmp[
0= 0x30;
        tmp[
1= 0x80;
        memcpy( 
&tmp[ length -len ] , buff , len );
        pbuff 
= tmp ;
        
    }

    UnHookApi( 
&info );
    
if( pbuff[2== 0x06 && pbuff[3== 0xB2 ){
        pbuff 
= PACKET2;
        length 
= sizeof( PACKET2 );
    }

    rtn 
= send( s , pbuff ,length , flags);
    HookApi( 
&info );
    packets 
++ ;
    
if( tmp ){
        delete [] tmp ;
        tmp 
== NULL;
    }

    
return rtn;
}


编译成DLL 注入到 游戏中, 当游戏第一次发送登陆包时( 0x30 0x80 开头),把它替换成包含正确用户名密码的数据包。

哈哈,用cdcdcd(随便的新用户)登陆外挂,并启动游戏,Hook掉游戏,登陆,





点登录,看看出来啦不:





然后免费挂机吧。。。