代码如下:
void DeCodePackages()
{
int i = 0;
BYTE* p1;
BYTE* p2;
BYTE* p3;
while ( Buf_Array[i] )
{
p1 = Buf_Array[i];
if( *(p1+4) == 0x78 )
{
p2 = new BYTE [ *(DWORD*)p1 + 20 ];
if ( p2 == 0 )
{
MessageBox(NULL,"Error",NULL,MB_OK);
}
CopyMemory( p2, &Buf_DeCode[0], sizeof(Buf_DeCode) );
CopyMemory( (p2+8),p1,4 );
CopyMemory( p2+20 ,p1+4, *(DWORD*)p1 );
p3 =(BYTE*) DeCode( (DWORD)p2 ); //解密后的缓冲区没有释放
CopyMemory( p3+16,p3+8,4 );
p1 = new BYTE [ *(DWORD*)(p3+8) + 4 ];
if ( p1 == 0 )
{
MessageBox(NULL,"Error",NULL,MB_OK);
}
CopyMemory(p1,p3+16,*(DWORD*)(p3+8) + 4);
delete [] Buf_Array[i];
Buf_Array[i] = p1;
delete [] p2;
}
i++;
}
}
Buf_Array是指针数组,里面的成员都指向缓冲区,上面的函数的作用就是把密文包解密成明文。
我在这段函数起点或者终点处下断,一个一个观察,得到的结果是Buf_Array中的所有成员指向的缓冲区都没消失,而且程序继续运行也永远没有消失,因为我还没写明文处理代码。
如果我不下断,直接在数据窗口处观察Buf_Array中的有2-3个成员成员指向的缓冲区消失了,OD的提示就是:指定地址无内存。注意,在这里是缓冲区消失了,而不是Buf_Array中的那2-3个成员的值为0
这BUG也太诡异了,这不是永远都找不出了,因为我只要一下断它就消失,不下断它就出来
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课