xxxx(三)“黑吃黑”: 破解别人外挂
1、所謂掛外,本質(zhì)上是改變原有軟件的執(zhí)行流程。方式有兩種:
通過改函數(shù)的參數(shù)來函數(shù)的執(zhí)行流程
直接改代碼,尤其是JCC、 call等跳轉(zhuǎn)指令。
外掛的形式大致也有兩種:
dll注入
直接改原軟件的exe、dll等PE文件
shellcode
破解別人的外掛,本質(zhì)上就是找到這個外掛更改了原軟件的哪些點,比如改了哪些函數(shù)的參數(shù)? 改了哪些關(guān)鍵的指令? 今天分享一些破解別人外掛的經(jīng)歷。
2、還是以xxxx這種軟件為例:有dll/shellcode注入的外掛,也有直接替換關(guān)鍵dll的外掛,這兩種外掛的破解方式原理一樣,不過表現(xiàn)形式稍微有點不同:
dll/shellcode注入:代碼注入后,肯定會改變原有代碼或數(shù)據(jù),怎么找到哪些地方被改變了? 用PChunter!再應(yīng)用層鉤子->進(jìn)程鉤子這里能看到exe或dll的哪些地方被掛鉤(更改前是什么、更改后又是什么);這種方法適合動態(tài)查看掛鉤的地方;
直接替換關(guān)鍵dll:由于exe加載執(zhí)行時已經(jīng)用了替換后的dll,PChunter沒法比對,所以是檢測不到掛鉤點的,這時只能先靜態(tài)分析了
3、(1)在網(wǎng)上找了一個能多開和防止消息撤回功能的外掛,只有一個dll,名字和官方版本的相同,直接替換就行。為了區(qū)分,我把掛外的dll名字后面加上了patch,官方原版dll的名字不變;
(2)010Editor在tools->compare files功能,可以對比兩個二進(jìn)制文件的異同,如下:一共找到8個diffrence,下面挨個看看這8個地方都改了啥
(3)先看看改動最多的一個,地址在0x986D20這里,一共改了5個字節(jié);從IDA來看,直接NOP掉了一個call??吹搅诉@里大家一定很好奇,這個call到底是干什么,為啥會被直接干掉了?
進(jìn)入被NOP掉的函數(shù):從字符串看,貌似是和登陸界面相關(guān)的函數(shù),猜測應(yīng)該是初始化登陸界面的。正常函數(shù)一開始應(yīng)該是push ebp, mov ebp,esp, sub esp,xxxx等。但是這個函數(shù)一進(jìn)來就是call跳轉(zhuǎn),此處反常必有妖,繼續(xù)跟進(jìn)這個call函數(shù);
看到這里相比大家都明白了:這是防止多開的函數(shù),通過mutex防止被多開,所以這個被NOP掉的函數(shù)邏輯就清晰了:第一次運行時先建立mutex,再初始化登陸界面;第二次運行時發(fā)現(xiàn)已經(jīng)有這個mutext,程序直接退出!
(4)再從頭看看其他被改動的代碼都是啥了,如下:
第一個:把JZ改成JMP,也就是無條件跳轉(zhuǎn)(原本是bl等于0才跳轉(zhuǎn))
第二個:test eax,eax改成xor eax,eax,導(dǎo)致后面的JZ無條件執(zhí)行
第三個:原本eax大于9才執(zhí)行的ja語句,這里也改成無條件執(zhí)行jmp了:
第四個:test被改成xor,ecx被清零,jz語句被改成必須執(zhí)行;
第五個:同上,原本al等于0才跳轉(zhuǎn),這里改成jmp無條件跳轉(zhuǎn)
第六、七同上:test改成xor,把ZF置1,讓JNZ肯定執(zhí)行;
上面各種被強制跳轉(zhuǎn)/不跳轉(zhuǎn)的代碼到底是做什么的了?有啥業(yè)務(wù)意義了?下面繼續(xù)通過OD動態(tài)調(diào)試查看。
(5)先看看效果:外掛dll放在虛擬機,另一個賬號在物理機;物理機的賬號給虛擬機發(fā)消息“測試‘,然后撤回,物理機會顯示“你撤回了一條消息”;此時虛擬機賬號也會顯示一條消息是“xxx撤回了一條消息”,但虛擬機賬號任然能看到”測試“這條消息,說明撤回功能是ok的!
站在正向開發(fā)的角度考慮撤回消息的流程:
發(fā)送方選擇撤回,此時在消息窗口不再顯示這條消息,同時給接收方發(fā)送消息撤回的指令
接收方收到撤回的指令后,立即從消息框中抹掉剛才展示的消息,然后展示”xxx測繪了一條消息“; 整個撤回最關(guān)鍵的地方就在這里了:接收方收到撤回指令后拒絕,或走另一個不撤回的分支,這也是上面所有防撤回功能都更改JCC指令的原因
現(xiàn)在挨個分析更改地方都做了啥:
第一個明顯是防止多開的,這個不用調(diào)試了,其他都是改變JCC指令來改變原有的執(zhí)行流程,挨個下斷點看看都干了啥(實現(xiàn)啥功能);
下斷點的時候注意:這個關(guān)鍵dll的基址是66B00000,上面靜態(tài)分析找到偏移,調(diào)試時斷點的位置都是通過基址+偏移方式找到的!
這里打個岔: 下面看到了VMP0段,終于開始加殼保護(hù)了!后續(xù)有時間會單獨分析這個vmp0段到底干了啥(肯定是很重要的代碼,否則沒必要加殼了)!
經(jīng)過幾次重復(fù)實際測試:上面下了7個斷點,只有這一個斷下來了!其他6個都沒用,也不知道外掛作者是怎么想的,為啥要改那么多沒用的地方............
繼續(xù)跟蹤,進(jìn)入je這個跳轉(zhuǎn)看看都走了啥:這里push了一個session會話,猜測可能和聊天對象(也就是消息的接收人)相關(guān):
繼續(xù)單步調(diào)試進(jìn)入call:這里就非常清晰了,從字面意思都能看出來是解析撤回內(nèi)容的!
突然想到有個IM軟件叫”電報“,是不是也能通過這種方式防止別人撤回了(我還沒試過........)?
xxxx軟件的版本:3.1.0.41
總結(jié)
以上是生活随笔為你收集整理的xxxx(三)“黑吃黑”: 破解别人外挂的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 草莓怎么保存才新鲜
- 下一篇: 怎么创建具有真实纹理的CG场景岩石?