能力值:
(RANK:280 )
|
-
-
2 楼
把lpReturnedString = str改成
strcpy_s(lpReturnedString, nSize, str);
retn = strlen(lpReturnedString);
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
mstwugui大侠~~ vc6 没有strcpy_s
只有strcpy 还是溢出。。。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | DWORD WINAPI myGetPrivateProfileString(
LPCTSTR lpAppName, // section name
LPCTSTR lpKeyName, // key name
LPCTSTR lpDefault, // default string
LPTSTR lpReturnedString, // destination buffer
DWORD nSize, // size of destination buffer
LPCTSTR lpFileName // initialization file name
)
{
DWORD retn=GetPrivateProfileString(lpAppName,lpKeyName,lpDefault,lpReturnedString,nSize,lpFileName);
if (!strcmp(lpKeyName,str1))
{
strcpy(lpReturnedString,str);
retn=strlen(lpReturnedString);
}
return retn;
}
|
memcpy也不行。。。
1 | memcpy(lpReturnedString,str,sizeof(lpReturnedString));
| 好像这样都不行。。。直接返回都溢出。。。 怎么样才可以正常HOOK它呢?
|
能力值:
(RANK:280 )
|
-
-
4 楼
首先你应该确信lpReturnString的空间足够存放整个str字符串,如果分配空间不够但给了错误的缓冲长度就有可能导致堆栈溢出
其次hook GetPrivateProfileString多半是用户层实现的不太可能涉及到到SSDT或其他技术,你通过IAT hook还是code patching? 如果是后者,在调用原始GetPrivateProfileString之前必须先回复原始代码
例如原始api起始地址hook后的代码如下
push MyPrivateProfileString
retn
这时候会用到6个字节,因此在你调用原始API前必须先恢复修改过的这6个字节,否则你调用原始API会错误的被无限递归调用导致堆栈溢出
另外如果我没有理解错你的应用,当lpKeyName指向的值和str1一致时,没有必要调用原始GetPrivateProfileString
最后sizeof(LPTSTR)=4,而不是字符串长度,先打好C++基础再学习hook会容易理解一些
|
能力值:
(RANK:280 )
|
-
-
5 楼
补充一句, 如果是IAT hook, 虽然不用恢复原始代码但同样必须确定在MyGetPrivateProfileString函数中调用的GetPrivateProfileString是指向正确的系统函数,这一点可以通过动态加载这个函数来实现
|
能力值:
( LV2,RANK:10 )
|
-
-
6 楼
谢谢 mstwugui 大大的热心帮助!~ 。。。向您致谢~
|
能力值:
( LV2,RANK:10 )
|
-
-
7 楼
在 mstwugui 大大的指点下顺利通过。。。 膜拜大大~
|
|
|