heap corruption detected

jacobvv 2012-04-17 09:09:02
环境描述:
Windows 7 + VS2008
MFC应用程序



代码如下:

void CCCCdemoDlg::OnBnClickedEccdecrypt()
{
// TODO: 在此添加控件通知处理程序代码
this->UpdateData();
int buflen, strlen;
CString result;
strlen = this->m_ECCciphertext.GetLength();

if(strlen == 0){
this->m_ECCplaintext.Format("ERROR 011. The ciphertext is NULL!");
this->UpdateData(false);
return;
}
if(strlen % 2)
buflen = strlen / 2 + 1;
else
buflen = strlen / 2;

if(buflen <= ECIES_OVERHEAD){
this->m_ECCplaintext.Format("ERROR 012. The ciphertext is illegal!");
this->UpdateData(false);
return;
}
char *hextext = this->m_ECCciphertext.GetBuffer(strlen);
char *plainstr = (char *)malloc(buflen - ECIES_OVERHEAD);
char *cipherstr = (char *)malloc(buflen);

if((strlen > 624) || (Hextext2Bitstr(cipherstr, strlen, hextext) != 0)){ //624 = 256*2+56*2
this->m_ECCplaintext.Format("ERROR 013. The ciphertext is too long!");
this->UpdateData(false);
return;
}

if(ECIES_Decryption(plainstr, cipherstr, buflen - ECIES_OVERHEAD) < 0){
result.Format("ERROR 019. The ciphertext is illegal! Please check it again and the possibility of attack is not excluded.");
}
else{
result.Format("%s",plainstr);
}

this->m_ECCplaintext = result;
this->UpdateData(false);
free(plainstr);
free(cipherstr);
}

int Hextext2Bitstr(char *bitstr, int len, char *hextext)
{
int i = 0, j = 0;
char *lsData = NULL;
char *lsReply = NULL;

if(hextext == NULL){
return -1;
}
if(bitstr == NULL){
return -1;
}

lsData = new char[len];
lsReply = new char[len];
memcpy(lsData, hextext, len);
for(i = 0; i < len; i++){
if(lsData[i] >= 65 && lsData[i] <= 70){
lsReply[j] = lsData[i] - 55;
i++;
if(lsData[i] >= 65 && lsData[i] <= 70){
lsReply[j] = ((lsReply[j] << 4) | ( lsData[i] - 55));
j++;
}
else if (lsData[i] >= 48 && lsData[i] <= 57){
lsReply[j] = ((lsReply[j] << 4) | ( lsData[i] - 48));
j++;
}
}
else if (lsData[i] >= 48 && lsData[i] <= 57){
lsReply[j] = lsData[i] - 48;
i++;
if((lsData[i] >= 65 && lsData[i] <= 70)){
lsReply[j] = ((lsReply[j] << 4) | (lsData[i] - 55));
j++;
}
else if (lsData[i] >= 48 && lsData[i] <= 57){
lsReply[j] = ((lsReply[j] << 4) | ( lsData[i] - 48));
j++;
}
}
if(len == 1){
j++;
}
}
//对于奇数长度字符串,尾部二进制转换最后一个字节没有左移,产生4bit未用空间。
lsReply[j] = 0x00;
memcpy(bitstr, lsReply, j+1);
delete []lsReply;
delete []lsData;
return 0;
}


最终发现是最后一句free(cipherstr);的时候出现的问题

求帮助谢谢
...全文
219 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
jacobvv 2012-04-23
  • 打赏
  • 举报
回复
首先感谢这位朋友
你说的很对,我在查找可能出现问题的地方的时候,发现Hextext2Bitstr函数中算出的生成串长度并不等于传入串len/2或len/2+1。后来发现是这个函数里对字符串越界操作了。。。
[Quote=引用 6 楼 的回复:]
这种错误是堆内存错误,非常难于查找。

产生这种问题的原因是内存越界读写。而且被错误改写的内存恰恰是程序连续分配的一段内存,导致一些信息被改写。从而在堆内存释放的时候产生这个问题。

你可以用pageheap工具帮助查找这个越界的错误。这样在发生越界访问的时候就会产生越界访问错误。从而让错误查找变得容易。
[/Quote]
draracle 2012-04-18
  • 打赏
  • 举报
回复
这种错误是堆内存错误,非常难于查找。

产生这种问题的原因是内存越界读写。而且被错误改写的内存恰恰是程序连续分配的一段内存,导致一些信息被改写。从而在堆内存释放的时候产生这个问题。

你可以用pageheap工具帮助查找这个越界的错误。这样在发生越界访问的时候就会产生越界访问错误。从而让错误查找变得容易。
ZPH2254 2012-04-18
  • 打赏
  • 举报
回复
顶,等高手来解答,也碰到了类似的问题
oyljerry 2012-04-17
  • 打赏
  • 举报
回复
是不是还有其他地方的指针越界了.
jacobvv 2012-04-17
  • 打赏
  • 举报
回复
我Debug了下,没有看到指针指向的地址被改动啊
[Quote=引用 2 楼 的回复:]

代码中修改了指针的值?
[/Quote]
Eleven 2012-04-17
  • 打赏
  • 举报
回复
代码中修改了指针的值?
  • 打赏
  • 举报
回复
释放无效内存?

16,472

社区成员

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

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

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