TM2008 preview4 / QQ2009 preview 聊天记录保存位置修改
本來 QQ 的聊天記錄都放在安裝目錄下的,可是 TM2008,以及近日 tx 拿來炒作的 QQ2009,都把聊天記錄
放在“我的文檔”下了。前幾天正式?jīng)Q定從 TM2007 轉(zhuǎn)2008,當(dāng)時暫時把“我的文檔”移到別的盤下了。不過
心里總是不爽。今天自習(xí)得很煩,又回來搞它,終于搞定了~
首先是猜測它取得我的文檔路徑的方法。
網(wǎng)上查了下,較多的是說 SHGetSpecialFolderPath。
(一開始引起我注意的是 SHGetSpecialFolderLocation,不過這個函數(shù)好像只能在 9x 系統(tǒng)里的)
SHGetSpecialFolderPath 的原型如下:
Syntax
BOOL SHGetSpecialFolderPath(?????
?? HWND hwndOwner,
?? LPTSTR lpszPath,
?? int nFolder,
?? BOOL fCreate
);
Parameters
hwndOwner
?? Handle to the owner window the client should specify
?? if it displays a dialog box or message box.
lpszPath
?? Pointer to a null-terminated string that receives the
? ?drive and path of the specified folder.
?? This buffer must be at least MAX_PATH characters in size.
nFolder
?? A CSIDL that identifies the folder of interest.
? ?If a virtual folder is specified, this function will fail.
fCreate
?? Indicates if the folder should be created if it does not already exist.
?? If this value is nonzero,?the folder will be created.
?? If this value is zero, the folder will not be created.
Return Value
Returns TRUE if successful, or FALSE otherwise.
其中第二個參數(shù)應(yīng)該是返回的路徑,第三個參數(shù)是用來確定要找哪一個特殊目錄的,
“我的文檔”對應(yīng)的這個參數(shù)值是 5。
好了,開始調(diào)試,載入 TM.exe:
設(shè)斷點。然后直接 F9 運行。
第一次斷的時候,看堆棧:
那個參數(shù)是 1A,所以不是所要找的。
繼續(xù) F9。期間有幾次異常,全部 Shift+F9 跳過(好像有八九次)。
這八九次過后的第一次斷點,就是要找的:
圖中可以看到那個參數(shù)為 5
執(zhí)行到返回,回到調(diào)用處:
可以看到,我的文檔路徑存會被放在 SS:[EBP-3A8],調(diào)用函數(shù)后,他又被復(fù)制到 ECX。
ECX 再繼續(xù)影響下面的程序。
中間那個 JE 是取“我的文檔”目錄失敗后的處理
為了簡單起見,考慮這樣做:在文件空白處存放我自己所需要的路徑,然后直接把這個地址給 ECX。
做這樣的修改:
其中 0046BE00 附近狀況:
接下來動手修改了。原來那個 00442A60 的地方對應(yīng) KernelUtil.dll 的 00022A60 處。
對照 OllyDbg 里面的樣子,一共改 8 個字節(jié)。
然后 0046BE00 對應(yīng)文件中 0004BE00,在這里寫入我要的路徑(注意是 Unicode):
本以為好了的。
感謝 BlackWhite 指出:
不過有一點你可能沒有想到,就是對于DLL來講,它引用的變量地址是有可能會變化的。
這一點有別于EXE程序,因為EXE程序的加載到內(nèi)存中的起始地址必定=0x400000。對于
DLL來講,它每次載入內(nèi)存的時候,載入的起始地址一旦發(fā)生變化,則它里面所有要引用
到的變量地址就全部會變。因為DLL首地址變化而對變量地址進行相應(yīng)調(diào)整的過程叫做重
定位(relocation)。
要處理DLL內(nèi)這種有可能變化的變量地址,通常的做法是寫一段如下的程序來獲得運行時的地址:
401000 call 401005
401005 pop eax??? ; EAX=401005就是運行時本條指令的地址
401006 sub eax, 5 ; EAX=401000就是運行時本段程序的首地址
?????????????????? ; 其中5是call指令的長度
然后假如在402000h有一個變量要訪問,則可以這樣寫:
mov edx, [eax+1000h]; 這里的1000h就是該變量離本段程序首地址的相對距離
以上這段程序的好處就是:如果本段程序的首地址發(fā)生變化,例如變成
801000,則call 801005; pop eax; sub eax,5后,EAX=801000,
從而eax+1000h必定可以精確地指向那個變量。
所以最后我改成了這樣子:
00442A60??? E8 00000000???? CALL KernelUt.00442A65
00442A65??? 59????????????? POP ECX
00442A66??? 81C1 9B930200?? ADD ECX,2939B
00442A6C??? EB 1D?????????? JMP SHORT KernelUt.00442A8B
然后寫了個補丁,以上 2008-01-18。
2008-01-25:
發(fā)現(xiàn) QQ2009 preview 的這個 dll 和 TM2008 preview4 的是不一樣的。更新補丁。
按此直接下載
如果不行請到我網(wǎng)盤下載:http://streamlet.ys168.com/
總結(jié)
以上是生活随笔為你收集整理的TM2008 preview4 / QQ2009 preview 聊天记录保存位置修改的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 王者荣耀角色信息在哪个服务器,怎么查询王
- 下一篇: 解决页面报错 500-内部服务器错误