使用VC写的DLL通过内存加载类,转成SHELLCODE,发现一个诡异的问题,程序直接运行操作与下载无任何问题,下载10G数据也不会出错。但转成SHELLCODE后,诡异的问题,就出现了,不确定时间地点,出错。
经过3个多小时,每句代码排查,找出问题原因,使用了如下代码:
UINT ProcFileEnumWillDown(TCHAR * str_path)//枚举要下载的文件夹
{
CListDirectoryFile list;
list.SearchFileAll(str_path);
CMySocket sock;
sock.m_socket=m_socket;
for (int i=0;i<list.MyVectorFileName.size();i++)
{
WIN32_FIND_DATA fd={0};
HANDLE hFind = FindFirstFile(list.MyVectorFileName[i].c_str(), &fd);
if (hFind==INVALID_HANDLE_VALUE){
lstrcpy(fd.cFileName,_T("Failed to access files"));//获取文件信息失败时把错误信息返给用户
}else{
lstrcpy(fd.cFileName,list.MyVectorFileName[i].c_str());//因为是枚举所有文件,把文件全路径复制到WIN32_FIND_DATA结构中
FindClose(hFind);
}
PACKET pkt={0};//注意这里!
CopyMemory((void*)pkt.buf,(char*)&fd,sizeof(fd));
SendPacket(&pkt);
}
PACKET pkt={0};//注意这里!
SendPacket(&pkt);
return 1;
}
看出猫腻吗?如果是编译的EXE,板钉的没任何问题,决对靠普,但在SHELLCODE中,就出问题了,SHELLCODE中要求,禁止引用任何全局变量常量,这里编译后就会出问题了,解决方法,直接合并成一个 PACKET pkt={0}问题得到解决。