希望萬變不離其中,先分析如何得到keyfile的部分 (7千字)

看雪資料發表於2015-11-15

國華軟體(http://www.etextwizard.com)可能是比較看好的軟體,其代表做eTextWizard由pcode寫成,令人望而卻步,但是幾款反編譯eBook的是由Delphi+Upx而成,讓我想來嘗試一下。

  首先根據前輩的經歷,我們把相關的工具(OD、dede、ProcDump)偽裝一下,其中我的OD標題以及ClassName變動了,ProcDump透過ini也改變了,dede就放到同學機器上使用,準備就緒後,開始pj。

  這裡選擇的物件是(http://www.etextwizard.com/download/uneep/uneepsetup.exe)Ver1.51 Build660。

  用變態OD載入,很容易來到OEP處,此時用變態ProcDump來Dump Full,另存一個unpacked作為參考。用UE開啟unpacked和chinesegb2312.lng(這是程式的語言檔案,它是整個pj過程的突破口),其中的:

Form3.u3BT1.Hint=馬上校驗註冊資訊
Form3.u3BT1.Caption=確定

  告訴我們註冊視窗的確定按鈕名稱,根據它可以在unpacked中查詢字串u3BT1Click,也就是按鈕的響應事件,也就找到了程式碼位置=004D6668。在OD中斷這個位置,中斷以後發現大量的花指令,這裡就看基本功了:

004D668D  .  8B83 00030000 MOV EAX, DWORD PTR DS:[EBX+300]
004D6693  .  E8 0C2FF7FF  CALL unEbookE.004495A4
004D6698  .  837D FC 00    CMP DWORD PTR SS:[EBP-4], 0              ;獲得使用者名稱

004D66A7  .  8B83 04030000 MOV EAX, DWORD PTR DS:[EBX+304]
004D66AD  .  E8 F22EF7FF  CALL unEbookE.004495A4
004D66B2  .  837D F8 00    CMP DWORD PTR SS:[EBP-8], 0              ;獲得註冊碼

004D66DE  .  8B45 F0      MOV EAX, DWORD PTR SS:[EBP-10]          ;使用者名稱
004D66E1  .  5A            POP EDX                                  ;註冊碼
004D66E2  .  E8 B18B0000  CALL unEbookE.004DF298                  ;跟進去啊!

  進來了看:
004DF2D7  >  E8 6877FEFF  CALL unEbookE.004C6A44                  ;這裡的兩個函式會頻繁一起出現
004DF2DC  .  E8 A381FEFF  CALL unEbookE.004C7484                  ;就是Anti-Debug的

004DF322  >  E8 B977FEFF  CALL unEbookE.004C6AE0
004DF327  .  E8 A0BAFFFF  CALL unEbookE.004DADCC

004DF334  >  E8 E386FEFF  CALL unEbookE.004C7A1C
004DF339  .  E8 4681FEFF  CALL unEbookE.004C7484

004DF386  >  E8 D978FEFF  CALL unEbookE.004C6C64
004DF38B  .  E8 F480FEFF  CALL unEbookE.004C7484                  ;一樣討厭的程式碼

  在此軟體中經常出現上面的程式碼,習慣就好了,現在開始檢查註冊碼了:
004DF3AE  >  8B45 F8      MOV EAX, DWORD PTR SS:[EBP-8]
004DF3B1  .  E8 BA54F2FF  CALL unEbookE.00404870                  ;註冊碼長度
004DF3B6  .  83F8 0F      CMP EAX, 0F
004DF3B9  .  0F8C 8D010000 JL unEbookE.004DF54C                    ;長度大於等於15
004DF3C2  .  8B45 FC      MOV EAX, DWORD PTR SS:[EBP-4]
004DF3C5  .  E8 FA54FEFF  CALL unEbookE.004C48C4                  ;使用者名稱的ASCII拼接串
                                                                    ;例如upfeed -> 757066656564

004DF3E1  .  E8 FE5BFEFF  CALL unEbookE.004C4FE4                  ;這是個非常非常非常重要的函式,解密字串的
                                                                    ;可惜演算法極其簡單

  接下來的是把註冊資訊寫入unEbookEdit.ini檔案儲存,我的是這樣的:
[EOptions]
appfontcolor=645321(軟體的大小的上限)
EXEtype=757066656564(使用者名稱)
EXEfmt=37352D656570373837383132333435(註冊碼)

  往下走,又是很多的Anti程式碼,直到:
004DF5F4  .  8B45 F8      MOV EAX, DWORD PTR SS:[EBP-8]
004DF5F7  .  E8 7452F2FF  CALL unEbookE.00404870                  ;註冊碼長度要大於14
004DF5FC  .  83F8 0E      CMP EAX, 0E

004DF610  .  66:BA 0500    MOV DX, 5
004DF614  .  8B45 FC      MOV EAX, DWORD PTR SS:[EBP-4]            ;使用者名稱
004DF617  .  E8 6854FEFF  CALL unEbookE.004C4A84                  ;使用者名稱各位ASCII值 xor 5連線成字串
                                                                    ;例如upfeed -> 707563606061

  接下來的是把註冊資訊寫入win.ini檔案儲存,我的是這樣的:
[EOptions]
sysinfo=707563606061(使用者名稱 xor 5)
infosys=3E3C246C6C793E313E31383B3A3D3C(註冊碼 xor 9)
appfontcolor=645321(軟體的大小的上限)


  然後如何提示沒有就退出來了,不由得發呆一會,應該何去何從呢?還是看help把。原來未註冊的版本在處理的時候會有小動作,好吧去下一本Ebook來看,於是好不容易找到了(http://home.eshunet.com/a/a2300/2276.htm)莫泊桑的大作,處理完畢發現果然很多頁面是空白的,現在就來到“開始”按鈕處理的地方看,怎麼到這裡完全參考前面的方法:004D9B80就是的。

  在這裡中斷後,我們不得不讀很多無關程式碼,比如檢查Ebook的有效性等等,耐心的讀過去,一直到:

004E272B  .  8B45 FC      MOV EAX, DWORD PTR SS:[EBP-4]            ;就是Ebook的名字
004E272E  .  E8 9D6DF2FF  CALL unEbookE.004094D0                  ;可以敏感的覺察到這個就是FileExists函式

  在004094D0處斷,那麼檢查keyfile的時候肯定會經過這裡,果然就是,需要一個名為“eep27953735.dat”的檔案,我們看看怎麼得到的這個檔名:

004E135D  .  8B45 E8      MOV EAX, DWORD PTR SS:[EBP-18]
004E1360  .  8D4D F8      LEA ECX, DWORD PTR SS:[EBP-8]
004E1363  .  66:BA 0500    MOV DX, 5
004E1367  .  E8 1838FEFF  CALL unEbookE.004C4B84                  ;讀出ini解密得到使用者名稱

004E13D4  .  8B45 CC      MOV EAX, DWORD PTR SS:[EBP-34]
004E13D7  .  8D4D F4      LEA ECX, DWORD PTR SS:[EBP-C]
004E13DA  .  66:BA 0900    MOV DX, 9
004E13DE  .  E8 A137FEFF  CALL unEbookE.004C4B84                  ;讀出ini解密得到註冊碼

004E13E9  >  8B45 F4      MOV EAX, DWORD PTR SS:[EBP-C]
004E13EC  .  E8 7F34F2FF  CALL unEbookE.00404870                  ;看看處理第幾頁,是否需要判斷註冊成功否
004E13F1  .  83F8 0D      CMP EAX, 0D
004E13F4  .  7C 34        JL SHORT unEbookE.004E142A

004E140E  .  8B45 B0      MOV EAX, DWORD PTR SS:[EBP-50]          ;‘-eep’
004E1411  .  8B55 F4      MOV EDX, DWORD PTR SS:[EBP-C]            ;註冊碼
004E1414  .  E8 9337F2FF  CALL unEbookE.00404BAC                  ;是否包含子串

004E1473  .  B9 02000000  MOV ECX, 2
004E1478  .  BA 01000000  MOV EDX, 1
004E147D  .  8B45 F4      MOV EAX, DWORD PTR SS:[EBP-C]
004E1480  .  E8 9B17FBFF  CALL unEbookE.00492C20                  ;Copy(Code, 1, 2)註冊碼前2位

004E14B5  .  83EA 03      SUB EDX, 3
004E14B8  .  B9 04000000  MOV ECX, 4
004E14BD  .  8B45 F4      MOV EAX, DWORD PTR SS:[EBP-C]
004E14C0  .  E8 0336F2FF  CALL unEbookE.00404AC8                  ;Copy(Code, Length-3, 4)註冊碼後4位

  下面變幻使用者名稱的時候,作者可能出現了BUG,把Delphi中的字串從0開始計算,導致一些隱患:

004E14E3  >  8B4D F8      MOV ECX, DWORD PTR SS:[EBP-8]
004E14E6  .  8A4C11 FF    MOV CL, BYTE PTR DS:[ECX+EDX-1]
004E14EA  .  80F1 52      XOR CL, 52
004E14ED  .  81E1 FF000000 AND ECX, 0FF
004E14F3  .  03D9          ADD EBX, ECX
004E14F5  .  42            INC EDX
004E14F6  .  48            DEC EAX
004E14F7  .^ 75 E4        JNZ SHORT unEbookE.004E14DD

  上面的演算法描速如下:

for i:=0 to Length(Name)-1 do
begin
  sum := sum + Ord(Name[i]) xor $52;//Name[0]=0
end//結果存放在EBX中

004E1511  >  8B45 F4      MOV EAX, DWORD PTR SS:[EBP-C]
004E1514  .  E8 737DF2FF  CALL unEbookE.0040928C                  ;註冊碼後四位變成數值

004E1519  .  81F3 FF000000 XOR EBX, 0FF
004E151F  .  03C3          ADD EAX, EBX
004E1521  .  8D55 A0      LEA EDX, DWORD PTR SS:[EBP-60]
004E1524  .  E8 837CF2FF  CALL unEbookE.004091AC                  ;形成了檔名的一部分

  原來檔名是由 'eep' + 使用者名稱變幻的結果 + 註冊碼前兩位的ACSII值 + '.dat'而成。

相關文章