在論壇上看到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 ;直接返回
這樣就完完全全可以自定預設目錄了