鱼C论坛

 找回密码
 立即注册
查看: 3290|回复: 13

一个栈损坏的问题~~

[复制链接]
发表于 2013-7-18 08:42:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Crazy迷恋. 于 2013-7-18 10:58 编辑

昨天看到一个叫下载者的东西~~~一下手痒就自己也写了一个非常没脑子的(这里只做技术上的研究,不是拿这东西去搞破坏,就这玩意也没什么破坏的~~~),在写的过程中出现了一些比较严重的问题。
开发环境: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[MAX_PATH]="d:\\muma.rar";
char cSelfPath[MAX_PATH]={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下的资源~~~~就是到最后最后,哐当一下就给我弹出一个提示框框~~~真是讨厌~
提示我栈损坏~~~前前后后木有溢出啊~~~数组木有越界啊~~~怎么就溢出了呢~~怎么栈就损坏了呢~~~~@竹林小溪 ,@小甲鱼,@怡静 ,@黑夜,@Dardy ,@鱼c的兄弟姐妹~~~~救命啊~~~~
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[idx] == '\\' )
{
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[MAX_PATH]={0};
printf("%s",getSelfPathName(cSelfPath,MAX_PATH));
if(URLDownloadToFile(NULL, pszUrl, getSelfPathName(cSelfPath,MAX_PATH), NULL, NULL)==S_OK)
{
printf("下载成功!~~~");
}
getchar();
return 0;
}
VS2010下编译通过没有警告没有错误。。。。发帖完毕我就去面壁了~~~~我要去面壁~~~要去面壁~~~~去面壁~面壁~壁~


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-7-18 09:07:41 | 显示全部楼层
果然又回到了这里
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-18 09:17:01 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[idx] == '\\' )
                {
                        break;
                }
        }

        strcpy_s(szBuff+idx+1,len-idx-1, "mma.rar");
        return szBuff;
}

评分

参与人数 1鱼币 +1 收起 理由
Crazy迷恋. + 1 谢谢啦~~~

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-18 10:30:08 | 显示全部楼层
编程难 发表于 2013-7-18 09:43
39行-53行的处理 有问题!!!内层循环的 *(cSelfPath+j)=*(cSelfPath+j-1); 有问题。
for (j=MAX_PATH;j> ...

哥们高手~~~~这个程序主要我是想找出它哪栈损坏了。找了好久~~这个程序后面的功能部分被我调试的时候注释掉了。我是想把指定URL的资源下载到和自身相同的一个目录下来~~~仅此而已。谢谢朋友~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-18 10:31:56 | 显示全部楼层
编程难 发表于 2013-7-18 09:43
39行-53行的处理 有问题!!!内层循环的 *(cSelfPath+j)=*(cSelfPath+j-1); 有问题。
for (j=MAX_PATH;j> ...

鱼币评分 不24小时评太多了~~~今天只能上1个了 sorry  哥们
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-18 10:44:00 | 显示全部楼层
Crazy迷恋. 发表于 2013-7-18 10:31
鱼币评分 不24小时评太多了~~~今天只能上1个了 sorry  哥们

不要紧,解决问题是关键!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-18 10:46:26 | 显示全部楼层
编程难 发表于 2013-7-18 09:43
39行-53行的处理 有问题!!!内层循环的 *(cSelfPath+j)=*(cSelfPath+j-1); 有问题。
for (j=MAX_PATH;j> ...

哎~~~int a【10】;里根本就没有 a【10】这个单元~~~只有a【9】这也能犯错~~~~~我去面壁去~~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-18 11:11:12 | 显示全部楼层
我想知道下载的是什么东西
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-18 11:14:52 | 显示全部楼层
竹林小溪 发表于 2013-7-18 11:11
我想知道下载的是什么东西

就是在论坛里随便找的一个rar 一哥们发的源代码~~~我刚刚看过他帖子我也木有看懂~~~就拿他那个文件来做测试了。如果我指定一个木马程序再隐藏启动~~~~360就该工作了~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2013-7-18 11:24:51 | 显示全部楼层
本帖最后由 竹林小溪 于 2013-7-18 11:37 编辑
Crazy迷恋. 发表于 2013-7-18 11:14
就是在论坛里随便找的一个rar 一哥们发的源代码~~~我刚刚看过他帖子我也木有看懂~~~就拿他那个文件来做测 ...

VC6.0表示不认识strcpy_s。编译失败
没办法就直接换了strcpy。url改成了百度网盘,呵呵,真是好用啊。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2013-7-18 11:38:22 | 显示全部楼层
竹林小溪 发表于 2013-7-18 11:24
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++里边要用转义字符~~~~让我头疼)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-6 09:40:44 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-7-6 21:07:21 | 显示全部楼层
学习了!!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-24 14:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表