在已破坏了程序内部状态的xxx.exe中发生了缓冲区溢出。。。

jiayuxue 2013-05-31 07:29:06
long byteVal[4];
long byteValmove[4];

long strlen=0;
long bytelen=0;

// long outByte[500];
//memset(&outByte,0,sizeof(outByte));

unsigned char StringBuf[3000];
CString strid;
char idbuf[100];

HMODULE hDll; //DLL句柄
lpAddFun addFun;//函数指针

lpdisplayFun displayFun;


for(int i=0;i<seleNumber;i++)
{
// memset(&outByte,0,sizeof(outByte));

strlen=infor[i].zw.GetLength()+1;

bytelen=strlen/12-1;

memset(&StringBuf,0,sizeof(StringBuf));

CStringA strBuf(infor[i].zw);

strcpy((char*)StringBuf,strBuf);

HexToChar(StringBuf);



for(int k=0;k<bytelen;k++)
{

memset(&byteVal,0,sizeof(byteVal));
memset(&byteValmove,0,sizeof(byteValmove));

byteVal[0]=StringBuf[k*12]*16+StringBuf[k*12+1];
byteVal[1]=StringBuf[k*12+3]*16+StringBuf[k*12+4];
byteVal[2]=StringBuf[k*12+6]*16+StringBuf[k*12+7];
byteVal[3]=StringBuf[k*12+9]*16+StringBuf[k*12+10];

//infor[i].zwByte[k]=byteVal[3]*256+byteVal[2]*256+byteVal[1]*256+byteVal[0];
byteValmove[0]=byteVal[0];
byteValmove[1]=byteVal[1]*256;
byteValmove[2]=byteVal[2]*256*256;
byteValmove[3]=byteVal[3]*256*256*256;
infor[i].zwByte[k]=byteValmove[3]+byteValmove[2]+byteValmove[1]+byteVal[0];
}

//调用动态链接库中的函数


strid=infor[i].zcm;


CStringA strcS(strid);

strcpy(idbuf,strcS);
////////////////////////////FKCnvchk2310

hDll=LoadLibrary(_T("FKCnvchk2310.dll"));
//hDll=LoadLibrary(_T("dllToUsedll.dll"));
if(hDll!=NULL)
{
addFun=(lpAddFun)GetProcAddress(hDll,"FKConvPIS4ToXXX");//???????FKConvPIS4ToXXX
//displayFun=(lpdisplayFun)GetProcAddress(hDll,"display");

if(addFun!=NULL)
{
long result=addFun(idbuf,infor[i].zwByte,infor[i].outByte);

//infor[i].zwByte=outByte;

//memcpy(infor[i].zwByte,outByte,bytelen);

//MessageBox(_T("调用函数成功!"));
}
else
{
MessageBox(_T("调用函数失败!"));
}
//MessageBox(_T("调用成功!"));
FreeLibrary(hDll);
}
else
{
int error=GetLastError();
char err;
err=error;
CString strerr;
strerr=_T("调用失败,错误代码为:");
strerr+=err;
AfxMessageBox(strerr);
continue;

}
}


不知道什么原因,每次一运行到一个函数的时候,程序就会跳转到一个_Crt_DefaultAllocHook函数的地方,弹出对话框,提示“在已损坏了程序内部状态的 xxx.exe 中发生了缓冲区溢出。按“中断”以调试程序,或按“继续”以终止程序。”
大家遇到过这样的问题吗?是什么原因导致的呢?
...全文
3206 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
WZY306313994 2014-07-08
  • 打赏
  • 举报
回复
这个事缓冲区溢出导致栈内存异常。
sunStd 2013-10-22
  • 打赏
  • 举报
回复
我说下我遇到的情况, 我实在release模式下调用了 debug 部分的dll出现这个问题.
jiayuxue 2013-06-18
  • 打赏
  • 举报
回复
引用 14 楼 Aizz 的回复:
那就是还没找到问题点咯? 先用减法,由大到小逐级注释掉,一定要先定位到出异常的代码,再想办法探寻出问题原因;换句话说,大胆假设小心求证... 如果没思路的话,换个交流方式?
其实我找到出问题的那句话了long result=addFun(idbuf,infor[i].zwByte,infor[i].outByte);这个动态链接库函数别人用的时候都是vb版,这是我首次用到vc中,vb声明是这样的: pubic Declare Function FKConvPIS4ToXXX Lib"FKCnvchk2310" (ByVal apstrlDNumber As String,ByRef aplnBuf As Long,ByRef apOutBuf As Long) As long 我解析的vc版:long 函数名 (char *,long *,long *) 帮忙看一下是不是这里解析错了.......
Aizz 2013-06-18
  • 打赏
  • 举报
回复
那就是还没找到问题点咯? 先用减法,由大到小逐级注释掉,一定要先定位到出异常的代码,再想办法探寻出问题原因;换句话说,大胆假设小心求证... 如果没思路的话,换个交流方式?
Aizz 2013-06-18
  • 打赏
  • 举报
回复
呃...没刷新,sorry,忽略我的回复吧,哈哈 祝顺利!
Aizz 2013-06-18
  • 打赏
  • 举报
回复
如果能调用,就说明原型没错。 检查下出错时的参数,和正确时有啥不同。如果DLL内部实现没问题,那通常是输入有偏差导致的。
jiayuxue 2013-06-18
  • 打赏
  • 举报
回复
引用 14 楼 Aizz 的回复:
那就是还没找到问题点咯? 先用减法,由大到小逐级注释掉,一定要先定位到出异常的代码,再想办法探寻出问题原因;换句话说,大胆假设小心求证... 如果没思路的话,换个交流方式?
找到问题所在了,vb中的string对应vc中的BSTR ,问题解决了,多谢了!!
jiayuxue 2013-06-17
  • 打赏
  • 举报
回复
引用 11 楼 Aizz 的回复:
哈哈,大家都菜,共勉吧。但,你回了一堆,没说问题解决没?还是问题已经不重要了... 1、通常做多次没啥意义,除了浪费资源,你可以试试看GetProcAddress返回的值,通常都一样的。 Load-Free这种形式的,通常都用 RAII 来包装一下(自己搜搜,C++必会惯用法),可以解决句柄/内存泄露之类的问题。 4、GetLastError 返回是个 DWORD ,转成 char 值就不对了(要转也是 CString.Format 靠谱吧)。想知道 error 是啥,可以用 VS 里的 ErrorLookup (菜单->工具),把返回值输进去就可以了(不过未必通用,有些 API 的返回值相同,但含义不一样,不知道M$咋想的)。 写代码,有时间多做下 review ,想想怎样能让代码更精简(让每行代码都不多余);有机会多看看其他人的代码,学习一些常见问题别人是咋处理的(比如错误码/资源管理/异常处理之类的,多借鉴借鉴)。
把 加载动态库放到循环外面了(也不知道是不是这个原因),现在最多可以循环33次了,太诡异了。。。
jiayuxue 2013-06-17
  • 打赏
  • 举报
回复
引用 11 楼 Aizz 的回复:
哈哈,大家都菜,共勉吧。但,你回了一堆,没说问题解决没?还是问题已经不重要了... 1、通常做多次没啥意义,除了浪费资源,你可以试试看GetProcAddress返回的值,通常都一样的。 Load-Free这种形式的,通常都用 RAII 来包装一下(自己搜搜,C++必会惯用法),可以解决句柄/内存泄露之类的问题。 4、GetLastError 返回是个 DWORD ,转成 char 值就不对了(要转也是 CString.Format 靠谱吧)。想知道 error 是啥,可以用 VS 里的 ErrorLookup (菜单->工具),把返回值输进去就可以了(不过未必通用,有些 API 的返回值相同,但含义不一样,不知道M$咋想的)。 写代码,有时间多做下 review ,想想怎样能让代码更精简(让每行代码都不多余);有机会多看看其他人的代码,学习一些常见问题别人是咋处理的(比如错误码/资源管理/异常处理之类的,多借鉴借鉴)。
把load free 语句放到循环外面了;问题没有解决,不是不重要,是还不知道到底是什么原因......正在查看如何让出问题那部分代码更简洁,把出问题的点去掉(侥幸心理),但是还不行......
Aizz 2013-06-16
  • 打赏
  • 举报
回复
哈哈,大家都菜,共勉吧。但,你回了一堆,没说问题解决没?还是问题已经不重要了... 1、通常做多次没啥意义,除了浪费资源,你可以试试看GetProcAddress返回的值,通常都一样的。 Load-Free这种形式的,通常都用 RAII 来包装一下(自己搜搜,C++必会惯用法),可以解决句柄/内存泄露之类的问题。 4、GetLastError 返回是个 DWORD ,转成 char 值就不对了(要转也是 CString.Format 靠谱吧)。想知道 error 是啥,可以用 VS 里的 ErrorLookup (菜单->工具),把返回值输进去就可以了(不过未必通用,有些 API 的返回值相同,但含义不一样,不知道M$咋想的)。 写代码,有时间多做下 review ,想想怎样能让代码更精简(让每行代码都不多余);有机会多看看其他人的代码,学习一些常见问题别人是咋处理的(比如错误码/资源管理/异常处理之类的,多借鉴借鉴)。
jiayuxue 2013-06-14
  • 打赏
  • 举报
回复
引用 9 楼 Aizz 的回复:
没看懂代码干啥的...其实贴这种代码还不如不贴,里面一堆东西都未知的,想判断都力不足... 通常说,这种错误一般都是是读/写内存越界导致的,如果能重现,那其实就比较简单了,只要想办法找到报错的代码行,检查下相关的内存/变量是否正常就知道该咋整;若是在执行DLL函数出问题,则需要检查下传的参数对不对... 另几点: 1、为啥要循环 LoadLibrary、GetProcAddress、FreeLibrary ?不可以只做一次吗?
2、long strlen 这种变量名还是少用吧,和标准C函数重名了 3、 if (hDll!=NULL) 的 else 部分,里面用了个 continue ,多余的吧,这已经是循环的最后一行语句了 4、int error=GetLastError(); char err; err=error; 这种保存错误号的还是第一次见呐,有啥玄机解释下? 说的比较泛,望有助
1.为啥要循环 LoadLibrary、GetProcAddress、FreeLibrary ?不可以只做一次吗?(这个。。。我当时没想那么多,这样会比较多出错?我改一下) 2.long strlen 这种变量名还是少用吧,和标准C函数重名了(这个没有意识到,我改一下吧。。。) 3. if (hDll!=NULL) 的 else 部分,里面用了个 continue ,多余的吧,这已经是循环的最后一行语句了(这个。。。是的,多余了) 4.int error=GetLastError(); char err; err=error; 这种保存错误号的还是第一次见呐,有啥玄机解释下?(只是想看看到底是什么错误。。。是我测试用的。。。没捕捉到,应该不是这么用吧,菜鸟。。。请见谅)
Aizz 2013-06-13
  • 打赏
  • 举报
回复
没看懂代码干啥的...其实贴这种代码还不如不贴,里面一堆东西都未知的,想判断都力不足... 通常说,这种错误一般都是是读/写内存越界导致的,如果能重现,那其实就比较简单了,只要想办法找到报错的代码行,检查下相关的内存/变量是否正常就知道该咋整;若是在执行DLL函数出问题,则需要检查下传的参数对不对... 另几点: 1、为啥要循环 LoadLibrary、GetProcAddress、FreeLibrary ?不可以只做一次吗? 2、long strlen 这种变量名还是少用吧,和标准C函数重名了 3、 if (hDll!=NULL) 的 else 部分,里面用了个 continue ,多余的吧,这已经是循环的最后一行语句了 4、int error=GetLastError(); char err; err=error; 这种保存错误号的还是第一次见呐,有啥玄机解释下? 说的比较泛,望有助
yaozhiyong110 2013-06-05
  • 打赏
  • 举报
回复
第九次估计已经溢出了...
jiayuxue 2013-06-05
  • 打赏
  • 举报
回复
引用 6 楼 yaozhiyong110 的回复:
第九次估计已经溢出了...
估计是吧
jiayuxue 2013-06-05
  • 打赏
  • 举报
回复
引用 5 楼 ouyh12345 的回复:
bytelen是多少? StringBuf[k*12+10] k*12+10会不会超过3000? 等等,里面可疑的变量太多
bytelen=0xa8,不会超过3000,不过infor是个结构体数组,大小是6000,全局变量,我猜想是不是全局变量的大小有限制?结构体里面的数多了,就超出全局变量的范围了??没验证出来呢。。。求指导。。。
ouyh12345 2013-06-04
  • 打赏
  • 举报
回复
bytelen是多少? StringBuf[k*12+10] k*12+10会不会超过3000? 等等,里面可疑的变量太多
ouyh12345 2013-06-04
  • 打赏
  • 举报
回复
调用堆栈呢?转到最近的自己的代码处,查看变量
jiayuxue 2013-06-04
  • 打赏
  • 举报
回复
引用 2 楼 jiayuxue 的回复:
[quote=引用 1 楼 oyljerry 的回复:] 断点停下来,调试查看出错的代码
很奇怪的是,这个for循环中,前八次都没问题,就到第九次循环时就出错了......[/quote] 出错时,断点指向这里 void __cdecl _CRT_DEBUGGER_HOOK(int _Reserved) { /* assign 0 to _debugger_hook_dummy so that the function is not folded in retail */ (_Reserved); _debugger_hook_dummy = 0; }
jiayuxue 2013-06-04
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
断点停下来,调试查看出错的代码
很奇怪的是,这个for循环中,前八次都没问题,就到第九次循环时就出错了......
oyljerry 2013-05-31
  • 打赏
  • 举报
回复
断点停下来,调试查看出错的代码

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧