こんにちは私のプログラムにこの2つのコードがあります:
PIMAGE_IMPORT_DESCRIPTOR PE::GetImportedLibInfo(LPSTR libName )
{
PIMAGE_DOS_HEADER doshdr = (PIMAGE_DOS_HEADER)EntryPoint;
PIMAGE_NT_HEADERS nthdr = (PIMAGE_NT_HEADERS)((DWORD)doshdr + doshdr->e_lfanew);
DWORD tmp =nthdr->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
DWORD Rva = RvaToOffset((DWORD)tmp);
if(Rva != -1)
{
Rva += EntryPoint;
PIMAGE_IMPORT_DESCRIPTOR iid =(PIMAGE_IMPORT_DESCRIPTOR)(DWORD)Rva;
while(iid->Characteristics)
{
char* dll = (char*)((DWORD_PTR)RvaToOffset(iid->Name)+ EntryPoint);
DWORD res=lstrcmp((LPCSTR)dll,(LPCSTR)libName);
if(res == 0)
{
return iid;
}
iid ++;
}
}
return NULL;
}
VOID FillLibInfo(PIMAGE_IMPORT_DESCRIPTOR iiD)
{
if(iiD != NULL)
{
char* buff[20];
wsprintf((LPSTR)&buff,"%08lX",(DWORD)iiD->OriginalFirstThunk);
SetDlgItemText(hImpDlg,IDC_EDIT1,(LPCSTR)&buff);
wsprintf((LPSTR)&buff,"%08lX",(DWORD)iiD->TimeDateStamp);
SetDlgItemText(hImpDlg,IDC_EDIT2,(LPCSTR)&buff);
wsprintf((LPSTR)&buff,"%08lX",(DWORD)iiD->ForwarderChain);
SetDlgItemText(hImpDlg,IDC_EDIT3,(LPCSTR)&buff);
wsprintf((LPSTR)&buff,"%08lX",(DWORD)iiD->FirstThunk);
SetDlgItemText(hImpDlg,IDC_EDIT4,(LPCSTR)&buff);
}
}
そして、私はそれを使用します:
FillLibInfo(GetImportedLibInfo("MyLibName"));
追加するのは、マウスを渡すまでテキストボックスがテキストを実現しないということです。
プログラムを数回呼び出した後、GetImportedLibInfo()
クラッシュしました。スタックが壊れていると思います...
誰かが私にヒントを与えることができますか?
@編集:
クラスPEの定義:
class PE
{
private:
DWORD ptrImgDosHeader;
DWORD RvaToOffset(DWORD Rva);
DWORD RvaToMemory(DWORD Rva);
public:
DWORD EntryPoint;
PE(DWORD ptrMemory);
~PE();
VOID EnumSections(BOOL (*ptrCallBack)(PIMAGE_SECTION_HEADER));
VOID EnumImports(BOOL (*ptrCallBack)(LPSTR,DWORD),DWORD);
VOID EnumImportedFunctionsFromLib(LPSTR,BOOL (*ptrCallBack)(LPSTR,LPSTR));
VOID EnumExportedFunctions(BOOL (*ptrCallBack)(LPSTR,LPSTR,LPSTR));
WORD GetPeType();
DWORD ValidatePE();
DWORD ValidateNtHeader();
PIMAGE_IMPORT_DESCRIPTOR GetImportedLibInfo(LPSTR lib);
};