书名:super红客

vb 从零开始(十)

海棠书屋备用网站
    前天晚上我跟封包玩了一晚上,因才开始(第一次跟封包)说一下我一晚上的发现吧

    我是直接用pe截取的,因为金山游戏本身都有截取封包的保护措施(就像mm所说),直接用pe截取我是截取不到的,后来用ollydbg调试的时候才截取的到。

    经过前面的准备,封报的明文准备已经ok,准备进行加密,加密方式是取一个4字节的数字,对封包进行xor运算,运算完毕后就直接发送出去,我核对过用pe截取封包的数据,和我看到的运算结果完全一致,这说明只要用那个4字节的数字对封包进行反xor运算就可以得到明文的封包。

    其实说白了那个4字节的数字就是每次加密的密匙,也就是服务器认可的,这个4字节怎么得出的我就没跟了,暂时只发现只要不更换场景,4字节密匙不会更变。

    相同道理,服务返回的信息也是经过4字节xor运算处理了的,客户端解密时候取服务端4字节密匙对封包进行解密就可以得到明文封包。

    大体说下封神封包加密解密流程

    send:

    1,制造明文封包

    2,取4字节send密匙

    3,用4字节密匙对封包进行xor运算(保留前2位),最后不足4字节进行单字节运算。

    4,发送。

    revc:

    1,收到封包

    2,取4字节revc密匙

    3,用4字节密匙对封包进行xor运算(保留前2位),最后不足4字节进行单字节运算。

    4,对明文封包进行分析

    --------------------------------------------------------------------------------------------------------------------------------------------------------

    以上的方法比较累人!下面说说本地制作吧(既是用大家熟悉的fpe等软件)

    制作辅助外挂(自动加血,自动加蓝,免负重等等)

    hp的地址是不固定的,我使用金山游侠先找出当前的那个地址,

    然后使用softice对该地址设置断点,softice应该会立刻断住,

    你会看见movdordptrds:[eax+ecx*8+eb4],edi,

    在客户端中,位置是0x4b2c74,

    你可以修改游戏的进程,

    把movdordptrds:[eax+ecx*8+eb4],

    edi改成一个e9xxxx90,

    和.data之间的空余地址,

    把(xxxxxx)+0x4b2c74+5处的代码修改成movy,edi,

    下一条做原来的movdordptrds:[eax+ecx*8+eb4],edi,

    再来个e9zzzz,

    设置好zzzzzz使其再跳到原来dordptrds:[eax+ecx*8+eb4],

    edi的下一句,就是0x4b2c7b处,

    这样hp的地址就固定下来了,只要看y就知道hp了。

    --------------------------------------------------------------------------------------------------------------------------------------------------------

    下面说说客服端的破解(小试牛刀!)有兴趣的朋友可以制作一个dll

    来实现加血锁定血量!

    .text:004e8ef0sub_4e8ef0pro::004e8ef_0=dordptr4

    .text:004e8ef_4=dordptr8

    .text:004e8ef_8=dordpt::004e8ef0movecx,[esp+arg_0];可能是长度len地址

    .text:004e8ef4pus:004e8ef5moveax,[esp+4+arg_4];缓存地址

    .text:004e8ef9pus:004e8efamovesi,ecx

    .text:004e8efcpus:004e8efdmovedi,[esp+0ch+arg_8];加密key地址

    .text:004e8f01andesi,3;相当于缓存长度除以4的余数

    .text:004e8f04shrecx,2;相当于缓存长度除以4的商

    .text:004e8f07movedx,[edi];把加密key值放进edx

    .text:004e8f09movebx,ecx;

    .text:004e8f0bdececx;

    .text:004e8f0ctestebx,ebx;

    .text:004e8f0ejbeshortloc_4e8f1e;判断跳转

    .text:004e8f10incecx;

    .text::004e8f11loc_4e8f11:

    .text:004e8f11movebx,[eax]

    .text:004e8f13addeax,4

    .text:004e8f16xorebx,edx;异或运算,edx=key的值,核心运算

    .text:004e8f18de:004e8f19mov[eax-4],ebx

    .text:004e8f1zshortloc_4e8f11;相当于for循环运算

    .text::004e8f1eloc_4e8f1e:

    .text:004e8f1emovecx,esi

    .text:004e8f20de:004e8f21testecx,ecx

    .text:004e8f23jbeshortloc_:004e8f25leaecx,[esi+1]

    .text::004e8f28loc_4e8f28:

    .text:004e8f28movbl,[eax]

    .text:004e8f2axorbl,;异或运算

    .text:004e8f2cmov[eax],

    .text:004e8f2ein:004e8f2fshredx,8

    .text:004e8f32de:004e8f33jnzshortloc_4e8f28;相当于for循环运算

    .text::004e8f35loc_4e8f35:key付值运算;

    .text:004e8f35moveax,[edi]

    .text:004e8f37movedx,eax

    .text:004e8f39shledx,5

    .text:004e8f3csubedx,eax

    .text:004e8f3emoveax,1

    .text:004e8f43addedx,:004e8f49mov[edi],edxkey付值

    .text:004e8f4bpo:004e8f4cpo:004e8f4dpo:004e8f4:004e8f4esub_4e8ef0endp

    --------------------------------------------------------------------------------------------------------------------------------------------------------

    </p>