在已立坏了程序内部状态的xxx.exe中发生了缓冲区溢出。
在已破坏了程序内部状态的xxx.exe中发生了缓冲区溢出。。。
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 中发生了缓冲区溢出。按“中断”以调试程序,或按“继续”以终止程序。”
大家遇到过这样的问题吗?是什么原因导致的呢?
------解决方案--------------------
断点停下来,调试查看出错的代码
------解决方案--------------------
调用堆栈呢?转到最近的自己的代码处,查看变量
------解决方案--------------------
第九次估计已经溢出了...
------解决方案--------------------
没看懂代码干啥的...其实贴这种代码还不如不贴,里面一堆东西都未知的,想判断都力不足...
通常说,这种错误一般都是是读/写内存越界导致的,如果能重现,那其实就比较简单了,只要想办法找到报错的代码行,检查下相关的内存/变量是否正常就知道该咋整;若是在执行DLL函数出问题,则需要检查下传的参数对不对...
另几点:
1、为啥要循环 LoadLibrary、GetProcAddress、FreeLibrary ?不可以只做一次吗?
2、long strlen 这种变量名还是少用吧,和标准C函数重名了
3、 if (hDll!=NULL) 的 else 部分,里面用了个 continue ,多余的吧,这已经是循环的最后一行语句了
4、int error=GetLastError();
char err;
err=error;
这种保存错误号的还是第一次见呐,有啥玄机解释下?
说的比较泛,望有助
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 中发生了缓冲区溢出。按“中断”以调试程序,或按“继续”以终止程序。”
大家遇到过这样的问题吗?是什么原因导致的呢?
------解决方案--------------------
断点停下来,调试查看出错的代码
------解决方案--------------------
调用堆栈呢?转到最近的自己的代码处,查看变量
------解决方案--------------------
第九次估计已经溢出了...
------解决方案--------------------
没看懂代码干啥的...其实贴这种代码还不如不贴,里面一堆东西都未知的,想判断都力不足...
通常说,这种错误一般都是是读/写内存越界导致的,如果能重现,那其实就比较简单了,只要想办法找到报错的代码行,检查下相关的内存/变量是否正常就知道该咋整;若是在执行DLL函数出问题,则需要检查下传的参数对不对...
另几点:
1、为啥要循环 LoadLibrary、GetProcAddress、FreeLibrary ?不可以只做一次吗?
2、long strlen 这种变量名还是少用吧,和标准C函数重名了
3、 if (hDll!=NULL) 的 else 部分,里面用了个 continue ,多余的吧,这已经是循环的最后一行语句了
4、int error=GetLastError();
char err;
err=error;
这种保存错误号的还是第一次见呐,有啥玄机解释下?
说的比较泛,望有助