首页
社区
课程
招聘
[求助]为什么会堆栈溢出?
发表于: 2008-9-1 01:17 4904

[求助]为什么会堆栈溢出?

2008-9-1 01:17
4904
   俺新手,好多好多好多不懂。大大们多多关照。

照网上的代码练习一下hookapi 出现堆栈溢出。无法解决。

想实现的是 改变 读取配置文件API这个函数 读取的数据。

比如:GetPrivateProfileString(不改变,不改变,不改变,(要改它)buffer,不改变,不改变);

这是myapi 偶想改变那个读取的buffer   可是出现堆栈溢出~
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)) //是不是需要改变的配置项
	{
      
		lpReturnedString=str;//str  想用str来改变读取的结果
	}
     return retn;
}


大大们~该怎么办啊~~?

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
2
把lpReturnedString = str改成
strcpy_s(lpReturnedString, nSize, str);
retn = strlen(lpReturnedString);
2008-9-1 06:25
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
mstwugui大侠~~  vc6 没有strcpy_s
只有strcpy 还是溢出。。。
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也不行。。。
memcpy(lpReturnedString,str,sizeof(lpReturnedString)); 


好像这样都不行。。。直接返回都溢出。。。 怎么样才可以正常HOOK它呢?
2008-9-1 09:01
0
雪    币: 503
活跃值: (80)
能力值: (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会容易理解一些
2008-9-1 09:25
0
雪    币: 503
活跃值: (80)
能力值: (RANK:280 )
在线值:
发帖
回帖
粉丝
5
补充一句, 如果是IAT hook, 虽然不用恢复原始代码但同样必须确定在MyGetPrivateProfileString函数中调用的GetPrivateProfileString是指向正确的系统函数,这一点可以通过动态加载这个函数来实现
2008-9-1 09:28
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
谢谢 mstwugui  大大的热心帮助!~ 。。。向您致谢~
2008-9-1 09:32
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
在  mstwugui  大大的指点下顺利通过。。。 膜拜大大~
2008-9-1 09:49
0
游客
登录 | 注册 方可回帖
返回
//