?前天晚上我跟封包玩了一晚上,因才開始(第一次跟封包)說一下我一晚上的發(fā)現(xiàn)吧
我是直接用pe截取的,因?yàn)榻鹕接螒虮旧矶加薪厝》獍谋Wo(hù)措施(就像mm所說),直接用pe截取我是截取不到的,后來用ollydbg調(diào)試的時(shí)候才截取的到。
經(jīng)過前面的準(zhǔn)備,封報(bào)的明文準(zhǔn)備已經(jīng)ok,準(zhǔn)備進(jìn)行加密,加密方式是取一個(gè)4字節(jié)的數(shù)字,對封包進(jìn)行xor運(yùn)算,運(yùn)算完畢后就直接發(fā)送出去,我核對過用pe截取封包的數(shù)據(jù),和我看到的運(yùn)算結(jié)果完全一致,這說明只要用那個(gè)4字節(jié)的數(shù)字對封包進(jìn)行反xor運(yùn)算就可以得到明文的封包。
其實(shí)說白了那個(gè)4字節(jié)的數(shù)字就是每次加密的密匙,也就是服務(wù)器認(rèn)可的,這個(gè)4字節(jié)怎么得出的我就沒跟了,暫時(shí)只發(fā)現(xiàn)只要不更換場景,4字節(jié)密匙不會(huì)更變。
相同道理,服務(wù)返回的信息也是經(jīng)過4字節(jié)xor運(yùn)算處理了的,客戶端解密時(shí)候取服務(wù)端4字節(jié)密匙對封包進(jìn)行解密就可以得到明文封包。
大體說下封神封包加密解密流程
send:
1,制造明文封包
2,取4字節(jié)send密匙
3,用4字節(jié)密匙對封包進(jìn)行xor運(yùn)算(保留前2位),最后不足4字節(jié)進(jìn)行單字節(jié)運(yùn)算。
4,發(fā)送。
revc:
1,收到封包
2,取4字節(jié)revc密匙
3,用4字節(jié)密匙對封包進(jìn)行xor運(yùn)算(保留前2位),最后不足4字節(jié)進(jìn)行單字節(jié)運(yùn)算。
4,對明文封包進(jìn)行分析
--------------------------------------------------------------------------------------------------------------------------------------------------------
以上的方法比較累人!下面說說本地制作吧(既是用大家熟悉的fpe等軟件)
制作輔助外掛(自動(dòng)加血,自動(dòng)加藍(lán),免負(fù)重等等)
hp的地址是不固定的,我使用金山游俠先找出當(dāng)前的那個(gè)地址,
然后使用softice對該地址設(shè)置斷點(diǎn),softice應(yīng)該會(huì)立刻斷住,
你會(huì)看見movdordptrds:[eax+ecx*8+eb4],edi,
在客戶端中,位置是0x4b2c74,
你可以修改游戲的進(jìn)程,
把movdordptrds:[eax+ecx*8+eb4],
edi改成一個(gè)e9xxxx90,
和.data之間的空余地址,
把(xxxxxx)+0x4b2c74+5處的代碼修改成movy,edi,
下一條做原來的movdordptrds:[eax+ecx*8+eb4],edi,
再來個(gè)e9zzzz,
設(shè)置好zzzzzz使其再跳到原來dordptrds:[eax+ecx*8+eb4],
edi的下一句,就是0x4b2c7b處,
這樣hp的地址就固定下來了,只要看y就知道hp了。
--------------------------------------------------------------------------------------------------------------------------------------------------------
下面說說客服端的破解(小試牛刀?。┯信d趣的朋友可以制作一個(gè)dll
來實(shí)現(xiàn)加血鎖定血量!
.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;相當(dāng)于緩存長度除以4的余數(shù)
.text:004e8f04shrecx,2;相當(dāng)于緩存長度除以4的商
.text:004e8f07movedx,[edi];把加密key值放進(jìn)edx
.text:004e8f09movebx,ecx;
.text:004e8f0bdececx;
.text:004e8f0ctestebx,ebx;
.text:004e8f0ejbeshortloc_4e8f1e;判斷跳轉(zhuǎn)
.text:004e8f10incecx;
.text::004e8f11loc_4e8f11:
.text:004e8f11movebx,[eax]
.text:004e8f13addeax,4
.text:004e8f16xorebx,edx;異或運(yùn)算,edx=key的值,核心運(yùn)算
.text:004e8f18de:004e8f19mov[eax-4],ebx
.text:004e8f1zshortloc_4e8f11;相當(dāng)于for循環(huán)運(yùn)算
.text::004e8f1eloc_4e8f1e:
.text:004e8f1emovecx,esi
.text:004e8f20de:004e8f21testecx,ecx
.text:004e8f23jbeshortloc_:004e8f25leaecx,[esi+1]
.text::004e8f28loc_4e8f28:
.text:004e8f28movbl,[eax]
.text:004e8f2axorbl,;異或運(yùn)算
.text:004e8f2cmov[eax],
.text:004e8f2ein:004e8f2fshredx,8
.text:004e8f32de:004e8f33jnzshortloc_4e8f28;相當(dāng)于for循環(huán)運(yùn)算
.text::004e8f35loc_4e8f35:key付值運(yùn)算;
.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
--------------------------------------------------------------------------------------------------------------------------------------------------------