1、所謂掛外,本質上是改變原有軟件的執行流程。方式有兩種:
- 通過改函數的參數來函數的執行流程
- 直接改代碼,尤其是JCC、 call等跳轉指令。
外掛的形式大致也有兩種:
- dll注入
- 直接改原軟件的exe、dll等PE文件
- shellcode
破解別人的外掛,本質上就是找到這個外掛更改了原軟件的哪些點,比如改了哪些函數的參數? 改了哪些關鍵的指令? 今天分享一些破解別人外掛的經歷。
2、還是以xxxx這種軟件為例:有dll/shellcode注入的外掛,也有直接替換關鍵dll的外掛,這兩種外掛的破解方式原理一樣,不過表現形式稍微有點不同:
- dll/shellcode注入:代碼注入后,肯定會改變原有代碼或數據,怎么找到哪些地方被改變了? 用PChunter!再應用層鈎子->進程鈎子這里能看到exe或dll的哪些地方被掛鈎(更改前是什么、更改后又是什么);這種方法適合動態查看掛鈎的地方;

- 直接替換關鍵dll:由於exe加載執行時已經用了替換后的dll,PChunter沒法比對,所以是檢測不到掛鈎點的,這時只能先靜態分析了
3、(1)在網上找了一個能多開和防止消息撤回功能的外掛,只有一個dll,名字和官方版本的相同,直接替換就行。為了區分,我把掛外的dll名字后面加上了patch,官方原版dll的名字不變;
(2)010Editor在tools->compare files功能,可以對比兩個二進制文件的異同,如下:一共找到8個diffrence,下面挨個看看這8個地方都改了啥

(3)先看看改動最多的一個,地址在0x986D20這里,一共改了5個字節;從IDA來看,直接NOP掉了一個call。看到了這里大家一定很好奇,這個call到底是干什么,為啥會被直接干掉了?

進入被NOP掉的函數:從字符串看,貌似是和登陸界面相關的函數,猜測應該是初始化登陸界面的。正常函數一開始應該是push ebp, mov ebp,esp, sub esp,xxxx等。但是這個函數一進來就是call跳轉,此處反常必有妖,繼續跟進這個call函數;

看到這里相比大家都明白了:這是防止多開的函數,通過mutex防止被多開,所以這個被NOP掉的函數邏輯就清晰了:第一次運行時先建立mutex,再初始化登陸界面;第二次運行時發現已經有這個mutext,程序直接退出!

(4)再從頭看看其他被改動的代碼都是啥了,如下:
第一個:把JZ改成JMP,也就是無條件跳轉(原本是bl等於0才跳轉)

第二個:test eax,eax改成xor eax,eax,導致后面的JZ無條件執行

第三個:原本eax大於9才執行的ja語句,這里也改成無條件執行jmp了:

第四個:test被改成xor,ecx被清零,jz語句被改成必須執行;

第五個:同上,原本al等於0才跳轉,這里改成jmp無條件跳轉

第六、七同上:test改成xor,把ZF置1,讓JNZ肯定執行;


上面各種被強制跳轉/不跳轉的代碼到底是做什么的了?有啥業務意義了?下面繼續通過OD動態調試查看。
(5)先看看效果:外掛dll放在虛擬機,另一個賬號在物理機;物理機的賬號給虛擬機發消息“測試‘,然后撤回,物理機會顯示“你撤回了一條消息”;此時虛擬機賬號也會顯示一條消息是“xxx撤回了一條消息”,但虛擬機賬號任然能看到”測試“這條消息,說明撤回功能是ok的!

站在正向開發的角度考慮撤回消息的流程:
- 發送方選擇撤回,此時在消息窗口不再顯示這條消息,同時給接收方發送消息撤回的指令
- 接收方收到撤回的指令后,立即從消息框中抹掉剛才展示的消息,然后展示”xxx測繪了一條消息“; 整個撤回最關鍵的地方就在這里了:接收方收到撤回指令后拒絕,或走另一個不撤回的分支,這也是上面所有防撤回功能都更改JCC指令的原因
現在挨個分析更改地方都做了啥:
- 第一個明顯是防止多開的,這個不用調試了,其他都是改變JCC指令來改變原有的執行流程,挨個下斷點看看都干了啥(實現啥功能);





下斷點的時候注意:這個關鍵dll的基址是66B00000,上面靜態分析找到偏移,調試時斷點的位置都是通過基址+偏移方式找到的!
這里打個岔: 下面看到了VMP0段,終於開始加殼保護了!后續有時間會單獨分析這個vmp0段到底干了啥(肯定是很重要的代碼,否則沒必要加殼了)!

經過幾次重復實際測試:上面下了7個斷點,只有這一個斷下來了!其他6個都沒用,也不知道外掛作者是怎么想的,為啥要改那么多沒用的地方............

繼續跟蹤,進入je這個跳轉看看都走了啥:這里push了一個session會話,猜測可能和聊天對象(也就是消息的接收人)相關:

繼續單步調試進入call:這里就非常清晰了,從字面意思都能看出來是解析撤回內容的!

突然想到有個IM軟件叫”電報“,是不是也能通過這種方式防止別人撤回了(我還沒試過........)?
xxxx軟件的版本:3.1.0.41
