一个栈损坏的问题~~
本帖最后由 Crazy迷恋. 于 2013-7-18 10:58 编辑昨天看到一个叫下载者的东西~~~一下手痒就自己也写了一个非常没脑子的(这里只做技术上的研究,不是拿这东西去搞破坏,就这玩意也没什么破坏的~~~{:5_104:}),在写的过程中出现了一些比较严重的问题。
开发环境:VS2010
代码如下:
#include <conio.h>
#include <stdio.h>
#include <Windows.h>
#include <Urlmon.h>
#pragma comment (lib, "Urlmon")
int main()
{
char *pszUrl = "http://bbs.fishc.com/forum.php?mod=attachment&aid=NDU1M3xjNGI3YmQ0OHwxMzc0MDcxNDkzfDIxMzg3NnwxNzg1NQ%3D%3D";
//char cSelfPath="d:\\muma.rar";
char cSelfPath={0};
int i,j;
GetModuleFileName(NULL,cSelfPath,MAX_PATH);//取得程序自身的全路径
printf("0=%s\n",cSelfPath);
//处理掉最后的一个\后面的内容
for (i=MAX_PATH;i!=0;i--)
{
if (*(cSelfPath+i)=='\\')
{
*(cSelfPath+i)='\\';
*(cSelfPath+i+1)='m';
*(cSelfPath+i+2)='m';
*(cSelfPath+i+3)='a';
*(cSelfPath+i+4)='.';
*(cSelfPath+i+5)='r';
*(cSelfPath+i+6)='a';
*(cSelfPath+i+7)='r';
*(cSelfPath+i+8)='\0';
break;
}
/*else
{
*(cSelfPath+i)='\0';
break;
}*/
}
//给每个\后在加以个'\'
//printf("1=%s\n",cSelfPath);
for (i=0;i<MAX_PATH;i++)
{
if (*(cSelfPath+i)=='\\')
{
for (j=MAX_PATH;j>=i;j--)
{
*(cSelfPath+j)=*(cSelfPath+j-1);
}
*(cSelfPath+i)='\\';
i++;
printf("1.5=%s\n",cSelfPath);
}
}
//printf("2=%s\n",cSelfPath);
//if(URLDownloadToFile(NULL, pszUrl, cSelfPath, NULL, NULL)==S_OK)
//{
// printf("下载成功!~~~");
//}
//WinExec(cSelfPath, SW_HIDE);//运行下载之后的东西~
printf("3=%s\n",cSelfPath);
getch();
return 0;
}
这里我拿了论坛的一个rar做为一个测试~~~如果我指定一个路径下载成功~~~但不能放在C盘关键目录下,可能是我的操作系统时win7 64位的 那个在c盘下可能要权限的。(不知道是不是这个原因,没到xp中测试)。
后来我改要求我要下载到和本程序同一目录下,因此就用一个API,取得全路径~~存入一个数组内。然后再对该数组进行处理。让它符合函数的路径参数要求,但是到了最后却出现
Run-Time Check Failure #2 - Stack around the variable 'cSelfPath' was corrupted. 这样的提示(在程序结束的时候。)程序能够成功下载指定URL下的资源~~~~就是到最后最后,哐当一下就给我弹出一个提示框框~~~真是讨厌~{:5_107:}。
提示我栈损坏~~~前前后后木有溢出啊~~~数组木有越界啊~~~怎么就溢出了呢~~怎么栈就损坏了呢{:5_96:}~~~~@竹林小溪 ,@小甲鱼,@怡静 ,@黑夜,@Dardy ,@鱼c的兄弟姐妹~~~~救命啊~~~~{:5_100:}
PS:如果高手来解答可否帮我把上面那段处理路径的算法给优化下~~~~我的算法真的很烂~~~很烂~~狠烂~~~最后我就整成一篇技术类的日志给写起来(菜菜鸟只能写写这东西~~~高深的东西真的不会)
============******续*********================
成功的解决问题~~~~谢谢编程难 这位朋友~~~·
下面帖出整个程序的代码~~~
#include <stdio.h>
#include <Windows.h>
#include <Urlmon.h>
#pragma comment (lib, "Urlmon")
char* getSelfPathName(char szBuff[], int len)
{
int i,j;
ZeroMemory(szBuff, len);
GetModuleFileNameA(NULL, szBuff, len);//取得程序自身的全路径
// 从后向前找到第一个'\'
int idx;
for ( idx = len-1; idx >= 0; --idx)
{
if ( szBuff == '\\' )
{
break;
}
}
strcpy_s(szBuff+idx+1,len-idx-1, "mma.rar");
for (i=0;i<MAX_PATH-1;i++)
{
if (*(szBuff+i)=='\\')
{
for (j=MAX_PATH-1;j>=i;j--)
{
*(szBuff+j)=*(szBuff+j-1);
}
*(szBuff+i)='\\';
i++;
}
}
return szBuff;
}
int main()
{
char *pszUrl = "http://bbs.fishc.com/forum.php?mod=attachment&aid=NDU1M3xjNGI3YmQ0OHwxMzc0MDcxNDkzfDIxMzg3NnwxNzg1NQ%3D%3D";
char cSelfPath={0};
printf("%s",getSelfPathName(cSelfPath,MAX_PATH));
if(URLDownloadToFile(NULL, pszUrl, getSelfPathName(cSelfPath,MAX_PATH), NULL, NULL)==S_OK)
{
printf("下载成功!~~~");
}
getchar();
return 0;
}
VS2010下编译通过没有警告没有错误。。。。发帖完毕我就去面壁了~~~~我要去面壁~~~要去面壁~~~~去面壁~面壁~壁~
果然又回到了这里 smile, 发表于 2013-7-18 09:07 static/image/common/back.gif
果然又回到了这里
?啥回到了这里????? 本帖最后由 编程难 于 2013-7-18 10:07 编辑
39行-53行的处理 有问题!!!内层循环的 *(cSelfPath+j)=*(cSelfPath+j-1); 有问题。
for (j=MAX_PATH;j>=i;j--)
{
*(cSelfPath+j)=*(cSelfPath+j-1);
}
当j = MAX_PATH时执行*(cSelfPath+j)=*(cSelfPath+j-1); 导致了 栈破坏。
因为你最多只能写到cSelfPath+ MAX_PATH-1的位置。
ps:实在看不懂楼主想干嘛!!!!以下代码可以构造一个本地地址
char* getSelfPathName(char szBuff[], int len)
{
ZeroMemory(szBuff, len);
GetModuleFileNameA(NULL, szBuff, len);//取得程序自身的全路径
// 从后向前找到第一个'\'
int idx;
for ( idx = len-1; idx >= 0; --idx)
{
if ( szBuff == '\\' )
{
break;
}
}
strcpy_s(szBuff+idx+1,len-idx-1, "mma.rar");
return szBuff;
}
编程难 发表于 2013-7-18 09:43 static/image/common/back.gif
39行-53行的处理 有问题!!!内层循环的 *(cSelfPath+j)=*(cSelfPath+j-1); 有问题。
for (j=MAX_PATH;j> ...
{:5_95:}哥们高手~~~~这个程序主要我是想找出它哪栈损坏了。找了好久~~这个程序后面的功能部分被我调试的时候注释掉了。我是想把指定URL的资源下载到和自身相同的一个目录下来~~~仅此而已。谢谢朋友~~~ 编程难 发表于 2013-7-18 09:43 static/image/common/back.gif
39行-53行的处理 有问题!!!内层循环的 *(cSelfPath+j)=*(cSelfPath+j-1); 有问题。
for (j=MAX_PATH;j> ...
鱼币评分 不24小时评太多了~~~今天只能上1个了 sorry哥们{:5_92:} Crazy迷恋. 发表于 2013-7-18 10:31 static/image/common/back.gif
鱼币评分 不24小时评太多了~~~今天只能上1个了 sorry哥们
不要紧,解决问题是关键! 编程难 发表于 2013-7-18 09:43 static/image/common/back.gif
39行-53行的处理 有问题!!!内层循环的 *(cSelfPath+j)=*(cSelfPath+j-1); 有问题。
for (j=MAX_PATH;j> ...
哎~~~int a【10】;里根本就没有 a【10】这个单元~~~只有a【9】{:5_100:}这也能犯错~~~~~我去面壁去~~~~~ 我想知道下载的是什么东西 竹林小溪 发表于 2013-7-18 11:11 static/image/common/back.gif
我想知道下载的是什么东西
就是在论坛里随便找的一个rar 一哥们发的源代码~~~我刚刚看过他帖子我也木有看懂~~~就拿他那个文件来做测试了。如果我指定一个木马程序再隐藏启动~~~~360就该工作了~~~~ 本帖最后由 竹林小溪 于 2013-7-18 11:37 编辑
Crazy迷恋. 发表于 2013-7-18 11:14 static/image/common/back.gif
就是在论坛里随便找的一个rar 一哥们发的源代码~~~我刚刚看过他帖子我也木有看懂~~~就拿他那个文件来做测 ...
VC6.0表示不认识strcpy_s。编译失败
没办法就直接换了strcpy。url改成了百度网盘,呵呵,真是好用啊。
竹林小溪 发表于 2013-7-18 11:24 static/image/common/back.gif
VC6.0表示不认识strcpy_s。编译失败
哥们可以自己实现以下啦~~~我发的第一个源代码~~第一个for就实现了这么一个功能。获取的是本程序的路径比如说C:\debug\1.exe 只要把它后面的 1.exe改改弄成1.rar或者整个给它改成C:\debug\xxx.rar我下面一个for循环就是 把C:\debug\xxx.rar给它改成C:\\debug\\xxx.rar这样(这c/c++里边要用转义字符~~~~让我头疼) http://bbs.fishc.com/group-264-1.html 学习了!!!
页:
[1]