xxxx(三)“黑吃黑”: 破解別人外掛


     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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM