TM2008 preview4 / QQ2009 preview 聊天记录保存位置修改

本来 QQ 的聊天记录都放在安装目录下的,可是 TM2008,以及近日 tx 拿来炒作的 QQ2009,都把聊天记录
放在“我的文档”下了。前几天正式决定从 TM2007 转2008,当时暂时把“我的文档”移到别的盘下了。不过
心里总是不爽。今天自习得很烦,又回来搞它,终于搞定了~

首先是猜测它取得我的文档路径的方法。

网上查了下,较多的是说 SHGetSpecialFolderPath。
(一开始引起我注意的是 SHGetSpecialFolderLocation,不过这个函数好像只能在 9x 系统里的)
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.


其中第二个参数应该是返回的路径,第三个参数是用来确定要找哪一个特殊目录的,
“我的文档”对应的这个参数值是 5。

好了,开始调试,载入 TM.exe:


设断点。然后直接 F9 运行。

第一次断的时候,看堆栈:


那个参数是 1A,所以不是所要找的。

继续 F9。期间有几次异常,全部 Shift+F9 跳过(好像有八九次)。
这八九次过后的第一次断点,就是要找的:

图中可以看到那个参数为 5

执行到返回,回到调用处:

可以看到,我的文档路径存会被放在 SS:[EBP-3A8],调用函数后,他又被复制到 ECX。
ECX 再继续影响下面的程序。
中间那个 JE 是取“我的文档”目录失败后的处理

为了简单起见,考虑这样做:在文件空白处存放我自己所需要的路径,然后直接把这个地址给 ECX。

做这样的修改:


其中 0046BE00 附近状况:


接下来动手修改了。原来那个 00442A60 的地方对应 KernelUtil.dll 的 00022A60 处。
对照 OllyDbg 里面的样子,一共改 8 个字节。


然后 0046BE00 对应文件中 0004BE00,在这里写入我要的路径(注意是 Unicode):


本以为好了的。

感谢 BlackWhite 指出:

不过有一点你可能没有想到,就是对于DLL来讲,它引用的变量地址是有可能会变化的。
这一点有别于EXE程序,因为EXE程序的加载到内存中的起始地址必定=0x400000。对于
DLL来讲,它每次载入内存的时候,载入的起始地址一旦发生变化,则它里面所有要引用
到的变量地址就全部会变。因为DLL首地址变化而对变量地址进行相应调整的过程叫做重
定位(relocation)。


要处理DLL内这种有可能变化的变量地址,通常的做法是写一段如下的程序来获得运行时的地址:
401000 call 401005
401005 pop eax    ; EAX=401005就是运行时本条指令的地址
401006 sub eax, 5 ; EAX=401000就是运行时本段程序的首地址
                   ; 其中5是call指令的长度

然后假如在402000h有一个变量要访问,则可以这样写:
mov edx, [eax+1000h]; 这里的1000h就是该变量离本段程序首地址的相对距离

以上这段程序的好处就是:如果本段程序的首地址发生变化,例如变成
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:
发现 QQ2009 preview 的这个 dll 和 TM2008 preview4 的是不一样的。更新补丁。


按此直接下载

如果不行请到我网盘下载:http://streamlet.ys168.com/

展开阅读全文

没有更多推荐了,返回首页