Crazy迷恋. 发表于 2013-7-18 08:42:26

一个栈损坏的问题~~

本帖最后由 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:41

果然又回到了这里

Crazy迷恋. 发表于 2013-7-18 09:17:01

smile, 发表于 2013-7-18 09:07 static/image/common/back.gif
果然又回到了这里

?啥回到了这里?????

编程难 发表于 2013-7-18 09:43:33

本帖最后由 编程难 于 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;
}


Crazy迷恋. 发表于 2013-7-18 10:30:08

编程难 发表于 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的资源下载到和自身相同的一个目录下来~~~仅此而已。谢谢朋友~~~

Crazy迷恋. 发表于 2013-7-18 10:31:56

编程难 发表于 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:}

编程难 发表于 2013-7-18 10:44:00

Crazy迷恋. 发表于 2013-7-18 10:31 static/image/common/back.gif
鱼币评分 不24小时评太多了~~~今天只能上1个了 sorry哥们

不要紧,解决问题是关键!

Crazy迷恋. 发表于 2013-7-18 10:46:26

编程难 发表于 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:12

我想知道下载的是什么东西

Crazy迷恋. 发表于 2013-7-18 11:14:52

竹林小溪 发表于 2013-7-18 11:11 static/image/common/back.gif
我想知道下载的是什么东西

就是在论坛里随便找的一个rar 一哥们发的源代码~~~我刚刚看过他帖子我也木有看懂~~~就拿他那个文件来做测试了。如果我指定一个木马程序再隐藏启动~~~~360就该工作了~~~~

竹林小溪 发表于 2013-7-18 11:24:51

本帖最后由 竹林小溪 于 2013-7-18 11:37 编辑

Crazy迷恋. 发表于 2013-7-18 11:14 static/image/common/back.gif
就是在论坛里随便找的一个rar 一哥们发的源代码~~~我刚刚看过他帖子我也木有看懂~~~就拿他那个文件来做测 ...
VC6.0表示不认识strcpy_s。编译失败
没办法就直接换了strcpy。url改成了百度网盘,呵呵,真是好用啊。

Crazy迷恋. 发表于 2013-7-18 11:38:22

竹林小溪 发表于 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++里边要用转义字符~~~~让我头疼)

拈花小仙 发表于 2014-7-6 09:40:44

http://bbs.fishc.com/group-264-1.html

xiaver 发表于 2014-7-6 21:07:21

学习了!!!
页: [1]
查看完整版本: 一个栈损坏的问题~~