用VC创建不导入任何DLL的WIN32程序(5)
unsigned int GetFunctionByName(unsigned int ImageBase,const char*FuncName)
{
IMAGE_DOS_HEADER *pdoshdr=(IMAGE_DOS_HEADER *)ImageBase;
PIMAGE_NT_HEADERS32 pnthdr=(PIMAGE_NT_HEADERS32)(ImageBase+pdoshdr->e_lfanew);
if(pnthdr->Signature!=IMAGE_NT_SIGNATURE)
return 0;
PIMAGE_DATA_DIRECTORY pidd=&pnthdr->OptionalHeader.DataDirectory[0];
IMAGE_EXPORT_DIRECTORY *pied=(IMAGE_EXPORT_DIRECTORY *)(ImageBase+pidd->VirtualAddress);
LONG *pfuncnames=(LONG *)(ImageBase+pied->AddressOfNames);
for(unsigned int i=0;i<pied->NumberOfNames;i++)
{
PSTR pfunc=(PSTR)(ImageBase+pfuncnames[i]);
if(mystrcmp(pfunc,FuncName))
{
WORD *EOT=(WORD *)(pied->AddressOfNameOrdinals+ImageBase);
LONG *EAT=(LONG *)(pied->AddressOfFunctions+ImageBase);
int index=EOT[i];
return (ImageBase+EAT[index]);
}
}
return 0;
}
typedef HMODULE (WINAPI *TLoadLibraryA)(LPCSTR lpFileName);
typedef BOOL (WINAPI *TFreeLibrary)(HMODULE hModule);
typedef void (WINAPI *TExitProcess)(UINT uExitCode);
typedef int (WINAPI *TMessageBox)(HWND hWnd,LPCSTR lpText,LPCSTR lpCaption,UINT uType);
extern "C" void WinMainCRTStartup()
{
unsigned int kernel32imagebase,user32imagebase;
char title[]="ddd&&*U( sunwang need beauty %^%&*";
char caption[]="hack";
char user32[]="user32";
TEB *pteb=NULL;
__asm mov eax,fs:[18h]
__asm mov pteb,eax
PEB *ppeb=pteb->Peb;
PPEB_LDR_DATA pldr=ppeb->LoaderData;
PLDR_MODULE pmodule=(PLDR_MODULE)pldr->InLoadOrderModuleList.Flink;
PLDR_MODULE pntdllmodule=(PLDR_MODULE)pmodule->InLoadOrderModuleList.Flink;
PLDR_MODULE pkernel32module=(PLDR_MODULE)pntdllmodule->InLoadOrderModuleList.Flink;
kernel32imagebase=(unsigned int)pkernel32module->BaseAddress;
TLoadLibraryA pLoadLibraryA=(TLoadLibraryA)GetFunctionByName(kernel32imagebase,"LoadLibraryA");
TFreeLibrary pFreeLibrary=(TFreeLibrary)GetFunctionByName(kernel32imagebase,"FreeLibrary");
TExitProcess pExitProcess=(TExitProcess)GetFunctionByName(kernel32imagebase,"ExitProcess");
user32imagebase=(unsigned int)pLoadLibraryA(user32);
TMessageBox pMessageBox=(TMessageBox)GetFunctionByName(user32imagebase,"MessageBoxA");
pMessageBox(NULL,title,caption,MB_OK);
pFreeLibrary((HMODULE)user32imagebase);
pExitProcess(0);
}
- 上一篇:VC系统热键的注册
- 下一篇:VC++5.0下MIDI、WAV及CD的播放