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);
}

解决方案 »

  1.   

    全部代码是这样的:#include "stdafx.h"
    #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
      

  2.   

    相关代码不全,无法进行转换。
    另,建议将此部分功能封装成DLL,在C#里直接调用。
      

  3.   

    //{{NO_DEPENDENCIES}}
    // 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