BOOL LoadImportFx(LPBYTE pBase, FxLoadLibrary fnLoadLibrary, FxGetProcAddr fnGetProcAddr)
{
PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)pBase;
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)(pBase + pidh->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR piid = (PIMAGE_IMPORT_DESCRIPTOR)
(pBase + pinh->OptionalHeader.DataDirectory[1].VirtualAddress); for(; piid->OriginalFirstThunk != 0; piid++)
{
HMODULE hDll = fnLoadLibrary((LPCSTR)(pBase + piid->Name));
if(hDll == NULL)
return FALSE; PIMAGE_THUNK_DATA pOrigin = (PIMAGE_THUNK_DATA)(pBase + piid->OriginalFirstThunk);
PIMAGE_THUNK_DATA pFirst = (PIMAGE_THUNK_DATA)(pBase + piid->FirstThunk); LPCSTR pFxName = NULL;
PIMAGE_IMPORT_BY_NAME piibn = NULL; for(; pOrigin->u1.Ordinal != 0; pOrigin++, pFirst++)
{
if(pOrigin->u1.Ordinal & IMAGE_ORDINAL_FLAG)
pFxName = (LPCSTR)IMAGE_ORDINAL(pOrigin->u1.Ordinal);
else
{
piibn = (PIMAGE_IMPORT_BY_NAME)(pBase + pOrigin->u1.AddressOfData);
pFxName = (LPCSTR)piibn->Name;
}
pFirst->u1.Function = (DWORD)fnGetProcAddr(hDll, pFxName);
if(pFirst->u1.Function == NULL)
return FALSE;
}
} return TRUE;
}void WINAPI ThreadEntry(PTHREADPARAM pParam)
{
if(LoadImportFx(pParam->pImageBase, pParam->fnLoadLibrary, pParam->fnGetProcAddr))
{
TCHAR szModule[256], szText[512], szFormat[256];
LoadString((HINSTANCE)pParam->pImageBase, IDS_FORMAT, szFormat, sizeof(szFormat) / sizeof(TCHAR));
GetModuleFileName(NULL, szModule, 256);
MessageBox(NULL, szText, _T("远程线程"), MB_OK|MB_ICONINFORMATION);
}
{
PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)pBase;
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)(pBase + pidh->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR piid = (PIMAGE_IMPORT_DESCRIPTOR)
(pBase + pinh->OptionalHeader.DataDirectory[1].VirtualAddress); for(; piid->OriginalFirstThunk != 0; piid++)
{
HMODULE hDll = fnLoadLibrary((LPCSTR)(pBase + piid->Name));
if(hDll == NULL)
return FALSE; PIMAGE_THUNK_DATA pOrigin = (PIMAGE_THUNK_DATA)(pBase + piid->OriginalFirstThunk);
PIMAGE_THUNK_DATA pFirst = (PIMAGE_THUNK_DATA)(pBase + piid->FirstThunk); LPCSTR pFxName = NULL;
PIMAGE_IMPORT_BY_NAME piibn = NULL; for(; pOrigin->u1.Ordinal != 0; pOrigin++, pFirst++)
{
if(pOrigin->u1.Ordinal & IMAGE_ORDINAL_FLAG)
pFxName = (LPCSTR)IMAGE_ORDINAL(pOrigin->u1.Ordinal);
else
{
piibn = (PIMAGE_IMPORT_BY_NAME)(pBase + pOrigin->u1.AddressOfData);
pFxName = (LPCSTR)piibn->Name;
}
pFirst->u1.Function = (DWORD)fnGetProcAddr(hDll, pFxName);
if(pFirst->u1.Function == NULL)
return FALSE;
}
} return TRUE;
}void WINAPI ThreadEntry(PTHREADPARAM pParam)
{
if(LoadImportFx(pParam->pImageBase, pParam->fnLoadLibrary, pParam->fnGetProcAddr))
{
TCHAR szModule[256], szText[512], szFormat[256];
LoadString((HINSTANCE)pParam->pImageBase, IDS_FORMAT, szFormat, sizeof(szFormat) / sizeof(TCHAR));
GetModuleFileName(NULL, szModule, 256);
MessageBox(NULL, szText, _T("远程线程"), MB_OK|MB_ICONINFORMATION);
}
#include "..\ThreadParam.h"
#include "resource.h"
BOOL LoadImportFx(LPBYTE pBase, FxLoadLibrary fnLoadLibrary, FxGetProcAddr fnGetProcAddr)
{
PIMAGE_DOS_HEADER pidh = (PIMAGE_DOS_HEADER)pBase;
PIMAGE_NT_HEADERS pinh = (PIMAGE_NT_HEADERS)(pBase + pidh->e_lfanew);
PIMAGE_IMPORT_DESCRIPTOR piid = (PIMAGE_IMPORT_DESCRIPTOR)
(pBase + pinh->OptionalHeader.DataDirectory[1].VirtualAddress); for(; piid->OriginalFirstThunk != 0; piid++)
{
HMODULE hDll = fnLoadLibrary((LPCSTR)(pBase + piid->Name));
if(hDll == NULL)
return FALSE; PIMAGE_THUNK_DATA pOrigin = (PIMAGE_THUNK_DATA)(pBase + piid->OriginalFirstThunk);
PIMAGE_THUNK_DATA pFirst = (PIMAGE_THUNK_DATA)(pBase + piid->FirstThunk); LPCSTR pFxName = NULL;
PIMAGE_IMPORT_BY_NAME piibn = NULL; for(; pOrigin->u1.Ordinal != 0; pOrigin++, pFirst++)
{
if(pOrigin->u1.Ordinal & IMAGE_ORDINAL_FLAG)
pFxName = (LPCSTR)IMAGE_ORDINAL(pOrigin->u1.Ordinal);
else
{
piibn = (PIMAGE_IMPORT_BY_NAME)(pBase + pOrigin->u1.AddressOfData);
pFxName = (LPCSTR)piibn->Name;
}
pFirst->u1.Function = (DWORD)fnGetProcAddr(hDll, pFxName);
if(pFirst->u1.Function == NULL)
return FALSE;
}
} return TRUE;
}void WINAPI ThreadEntry(PTHREADPARAM pParam)
{
if(LoadImportFx(pParam->pImageBase, pParam->fnLoadLibrary, pParam->fnGetProcAddr))
{
TCHAR szModule[256], szText[512], szFormat[256];
LoadString((HINSTANCE)pParam->pImageBase, IDS_FORMAT, szFormat, sizeof(szFormat) / sizeof(TCHAR));
GetModuleFileName(NULL, szModule, 256);
MessageBox(NULL, szText, _T("远程线程"), MB_OK|MB_ICONINFORMATION);
}
}
//其中resource.h文件为
//{{NO_DEPENDENCIES}}
// Microsoft Visual C++ generated include file.
// Used by Dll.rc
//
#define IDS_FORMAT 101// Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif
另,建议将此部分功能封装成DLL,在C#里直接调用。
// Microsoft Visual C++ generated include file.
// Used by Dll.rc
//
#define IDS_FORMAT 101// Next default values for new objects
//ThreadParam.h代码是这样的:
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 102
#define _APS_NEXT_COMMAND_VALUE 40001
#define _APS_NEXT_CONTROL_VALUE 1001
#define _APS_NEXT_SYMED_VALUE 101
#endif
#endif