修改flashget的另類方法(已修正)

看雪資料發表於2004-07-25

在論壇上看到RoBa修改flashget如此有意思,我也忍不住用自己的方法試了一下.

                             修改flashget 的另類方法(1.60a)
   我的思路是這樣的:在flashget的新增下載任務的視窗裡,有許多文字框,下載目錄就顯示在其中的一個文字框裡,預設是:c:\downloads  ,我想,它總要呼叫SetWindowTextA函式來顯示,那好,我就在它掉用那個函式的時候做手腳,讓它以日期作為目錄名來顯示.
    先是給 flashget 加入kernel32.dll裡的 GetDateFormatA函式,我們親自動手,用Winhex開啟flashget.exe ,在檔案偏移3c處看到:18 01 00 00 ,倒過頭就是 pe header的偏移地址:
  00000118 ,那麼匯入表的指標地址就是: 118+80=198 ,看到偏移198 處,是: 18 64 12 00 ,倒過來就是: 00126418 ,呵呵,這就是匯入表的RVA了,在檔案中的實際偏移剛好也是: 126418 .
    從126418處往下搜尋 kernel32.dll 找到在 127b38 ,rva 也是這個,好,再往上查詢16進位制值:387b1200 ,找到在0012644c ,這裡就是對應著kernel32.dll的IID的 Name項,看到它後面的雙字項麼,那就是 First Thunk ,指向對應著kernel32.dll的IAT部分,它也是個RVA,這裡的值是:7cf10f00,倒過來就是:FF17C ,找到FF17C,從FF17C向下找00000000 ,把從FF17c到找到地址的區塊複製到一塊空白的地方,好了,再在另一塊空白的地方寫入GetDateFormat 的子竄,假設其地址是12a000,然後我們就在剛才複製的資料後面加上00a01200,假設加入這個地址的所在地為12b000 ,這個12b000是最有用的地方了,我們在程式中呼叫GetDateFormat的方法是:call dword ptr [image base+0012b000] ,好了,函式表修好了.

  
  在flashget正常執行後,bpx setwindowtexta ,然後點選"新增"按鈕,程式被中斷,如下:
004D60A9    8B41 38         MOV EAX,DWORD PTR DS:[ECX+38]
004D60AC    85C0            TEST EAX,EAX
004D60AE    75 0F           JNZ SHORT flashget.004D60BF
004D60B0    FF7424 04       PUSH DWORD PTR SS:[ESP+4]
004D60B4    FF71 1C         PUSH DWORD PTR DS:[ECX+1C]
004D60B7    FF15 8CF64F00   CALL DWORD PTR DS:[<&USER32.SetWindowTex>; USER32.SetWindowTextA
004D60BD    EB 0E           JMP SHORT flashget.004D60CD

setwindowtexta函式有兩個引數,原型是:BOOL SetWindowText(HWND hwnd,LPCTSTR lpStrjng)
     壓棧時是"first in last out" ,所以, 4d60b0 處是文字的地址,下面的是物件的控制程式碼地址,看看它所指向的地址處,並非"c:\downloads" ,最後發現這裡是關鍵:
00529780    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
00529783    FF75 08         PUSH DWORD PTR SS:[EBP+8]
00529786    FF15 8CF64F00   CALL DWORD PTR DS:[<&USER32.SetWindowTex>; USER32.SetWindowTextA
0052978C    5E              POP ESI
0052978D    C9              LEAVE
0052978E    C2 0800         RETN 8

而其它文字的顯示都在這個地方,關鍵是ebp的值不同,但這裡用ebp的值作為判斷是不行的,自己試試就知道為什麼了.我把程式碼寫在529700處,所以改為:
004DCB15    74 0C           JE SHORT flashget.004DCB23
004DCB17    E9 E4CB0400     JMP flashget.00529700
004DCB1C    90              NOP
004DCB1D    FF15 8CF64F00   CALL DWORD PTR DS:[<&USER32.SetWindowTex>; USER32.SetWindowTextA
004DCB23    5E              POP ESI
004DCB24    C9              LEAVE
004DCB25    C2 0800         RETN 8
自己寫入的程式碼如下:
00529700    81FD C0E51200   CMP EBP,12E5C0
00529706    75 78           JNZ SHORT flashget.00529780
00529708    83FB 02         CMP EBX,2
0052970B    75 73           JNZ SHORT flashget.00529780;判斷控制元件
0052970D    8B75 0C         MOV ESI,DWORD PTR SS:[EBP+C]
00529710    BF 90985200     MOV EDI,flashget.00529890     
00529715    A5              MOVS DWORD PTR ES:[EDI],DWORD PTR DS:[ES];複製預設目錄
00529716    B8 90985200     MOV EAX,flashget.00529890 
0052971B    8A18            MOV BL,BYTE PTR DS:[EAX]
0052971D    83C0 01         ADD EAX,1
00529720    80FB 00         CMP BL,0
00529723  ^ 75 F6           JNZ SHORT flashget.0052971B;獲得地址,為合併作準備
00529725    83E8 01         SUB EAX,1;減1才是正確的地址
00529728    8BD8            MOV EBX,EAX
0052972A    50              PUSH EAX
0052972B    6A 0A           PUSH 0A
0052972D    50              PUSH EAX
0052972E    6A 00           PUSH 0
00529730    6A 00           PUSH 0
00529732    6A 01           PUSH 1
00529734    6A 00           PUSH 0
00529736    FF15 1E605B00   CALL DWORD PTR DS:[<&kernel32.GetDateFor>; KERNEL32.GetDateFormatA 獲得日期
0052973C    68 90985200     PUSH flashget.00529890                   ; ASCII "c:\downloads\"
00529741    FF75 08         PUSH DWORD PTR SS:[EBP+8]
00529744    FF15 8CF64F00   CALL DWORD PTR DS:[<&USER32.SetWindowTex>; USER32.SetWindowTextA 顯示目錄
0052974A    B8 00000000     MOV EAX,0
0052974F    8903            MOV DWORD PTR DS:[EBX],EAX;清除手尾,否則目錄會越變越長
00529751    5E              POP ESI
00529752    C9              LEAVE
00529753    C2 0800         RETN 8 ;直接返回

下面的是視窗中其它文字的顯示處理:
00529780    FF75 0C         PUSH DWORD PTR SS:[EBP+C]
00529783    FF75 08         PUSH DWORD PTR SS:[EBP+8]
00529786    FF15 8CF64F00   CALL DWORD PTR DS:[<&USER32.SetWindowTex>; USER32.SetWindowTextA
0052978C    5E              POP ESI
0052978D    C9              LEAVE
0052978E    C2 0800         RETN 8 ;直接返回


這樣就完完全全可以自定預設目錄了

相關文章