0

私のツールは:

  1. 開発環境として Windows 8
  2. Visual Studio 2008 を IDE として
  3. プログラミング言語としての C++
  4. Windows XP 32 ビット仮想マシンと別の 64 ビット マシンをテスト マシンとして使用

私が達成しようとしていること:

グラフィカルな Windows ログオンなどを担当する Windows DLL ファイルである GINA.dll をオーバーライドしようとしています。私のDLLファイルはGINAで同じ名前の同じ関数を持つ必要があります.システムコールメソッドXが元のMSGINA.DLLでXメソッドを実行する必要がある場合、元のDLLファイルのプロキシになるメソッドがいくつか必要です.

LoadLibrary を使用して MsGina.dll をロードし、GetProcAddress を使用して元の関数のアドレスを取得できますが、メソッドに msgina.dll から同じ名前のメソッドを実行させるにはどうすればよいですか?

注: X64 ではサポートされていないため、インライン アセンブリ jmp 命令でマクロを使用することはできません。

私はこれを見ました: http://msdn.microsoft.com/en-US/library/ms686944(v=vs.85).aspx しかし、元の名前と同じではない別の名前で新しい関数を作成しました。

試行中のエラー:次のようなメソッドを追加しようとしたとき

    __declspec(dllexport) BOOL WlxActivateUserShell(
  _In_  PVOID pWlxContext,
  _In_  PWSTR pszDesktopName,
  _In_  PWSTR pszMprLogonScript,
  _In_  PVOID pEnvironment
);

私の.hファイルと

   BOOL WlxActivateUserShell( 
  _In_  PVOID pWlxContext,  
  _In_  PWSTR pszDesktopName,   
  _In_  PWSTR pszMprLogonScript,    
  _In_  PVOID pEnvironment  
  ){
    return true;
}

私の.cppファイルでエラーが発生しました:

Error   1   error C2373: 'WlxActivateUserShell' : 
redefinition; different type modifiers  d:\xxxxxxx.h    23  Gina

たとえば、メソッドの名前を WlxActivateUserShellssss に変更した場合、エラーは表示されませんが、これは Windows が使用できないことを意味し、msgina.dll の元のメソッドと同じ名前にする必要があります。

4

3 に答える 3

1

プロキシ dll を書き込もうとしているようです。組み立ての必要はありません。

まず、これを読むことをお勧めします。

次に、Microsoft リンカにはプラグマがあり、関数名を指定してエクスポートし、関数を別の dll に転送できます。

プラグマは次のようになります。

#pragma comment(linker, "/export:SwapBuffers=gdi32.SwapBuffers") //this will forward call from your dll into original dll you're "overriding".
#pragma comment(linker, "/export:TextOutA=_HookedTextOutA@20") //and this will let you use your own function

プロキシ dll コードは次のようになります。

#include <windows.h>
#include <gdi32_fwd.h>
#pragma pack(1)
#include <stdio.h>
#include <stdarg.h>

static HINSTANCE hLThis = 0;
static HINSTANCE hGDI32 = 0;
static TCHAR prtBuf[0x1000];

static BOOL (WINAPI* Gdi32_TextOutA)(
  __in  HDC hdc,
  __in  int nXStart,
  __in  int nYStart,
  __in  LPSTR lpString,
  __in  int cbString
);

static HFONT (WINAPI* Gdi32_CreateFontIndirectA)(
  const LOGFONTA* lplf
); 

extern "C" HFONT WINAPI HookedCreateFontIndirectA(
  const LOGFONTA* lplf
){
    LOGFONTA lf;
    //override data here
    ...

    return Gdi32_CreateFontIndirectA(lplf);
}

extern "C" BOOL WINAPI HookedTextOutA(
  __in  HDC hdc,
  __in  int nXStart,
  __in  int nYStart,
  __in  LPSTR lpString,
  __in  int cbString
){
    //override data here
    ....

    return Gdi32_TextOutA(hdc, nXStart, nYStart, lpString, cbString);
}


//! Attach or detach this proxy.
BOOL WINAPI DllMain( HINSTANCE hInst,DWORD reason,LPVOID )
{
    if( reason == DLL_PROCESS_ATTACH )
    {
        hLThis = hInst;
        hGDI32 = LoadLibrary( "gdi32" );
        if( !hGDI32 )
        {
            return FALSE;
        }
    *(void **)&Gdi32_TextOutA = (void *)GetProcAddress( hGDI32, "TextOutA");
*(void **)&Gdi32_CreateFontIndirectA = (void *)GetProcAddress( hGDI32, "CreateFontIndirectA");  
    }
    else if( reason == DLL_PROCESS_DETACH )
    {
        FreeLibrary( hGDI32 );
    }
    return TRUE;
}
//! End of file.

ヘッダ:

#pragma comment(linker, "/export:AbortDoc=gdi32.AbortDoc")
#pragma comment(linker, "/export:AbortPath=gdi32.AbortPath")
#pragma comment(linker, "/export:AddFontMemResourceEx=gdi32.AddFontMemResourceEx")
#pragma comment(linker, "/export:AddFontResourceA=gdi32.AddFontResourceA")
#pragma comment(linker, "/export:AddFontResourceExA=gdi32.AddFontResourceExA")
#pragma comment(linker, "/export:AddFontResourceExW=gdi32.AddFontResourceExW")
#pragma comment(linker, "/export:AddFontResourceTracking=gdi32.AddFontResourceTracking")
#pragma comment(linker, "/export:AddFontResourceW=gdi32.AddFontResourceW")
#pragma comment(linker, "/export:AngleArc=gdi32.AngleArc")
#pragma comment(linker, "/export:AnimatePalette=gdi32.AnimatePalette")
#pragma comment(linker, "/export:AnyLinkedFonts=gdi32.AnyLinkedFonts")
#pragma comment(linker, "/export:Arc=gdi32.Arc")
#pragma comment(linker, "/export:ArcTo=gdi32.ArcTo")
#pragma comment(linker, "/export:BRUSHOBJ_hGetColorTransform=gdi32.BRUSHOBJ_hGetColorTransform")


#pragma comment(linker, "/export:CreateEnhMetaFileA=gdi32.CreateEnhMetaFileA")
#pragma comment(linker, "/export:CreateEnhMetaFileW=gdi32.CreateEnhMetaFileW")
#pragma comment(linker, "/export:CreateFontA=gdi32.CreateFontA")
//#pragma comment(linker, "/export:CreateFontIndirectA=gdi32.CreateFontIndirectA")
#pragma comment(linker, "/export:CreateFontIndirectA=_HookedCreateFontIndirectA@4")

...

#pragma comment(linker, "/export:CreateFontIndirectExA=gdi32.CreateFontIndirectExA")
#pragma comment(linker, "/export:CreateFontIndirectExW=gdi32.CreateFontIndirectExW")
#pragma comment(linker, "/export:CreateFontIndirectW=gdi32.CreateFontIndirectW")
#pragma comment(linker, "/export:SwapBuffers=gdi32.SwapBuffers")
//#pragma comment(linker, "/export:TextOutA=gdi32.TextOutA")
#pragma comment(linker, "/export:TextOutA=_HookedTextOutA@20")

...

#pragma comment(linker, "/export:bInitSystemAndFontsDirectoriesW=gdi32.bInitSystemAndFontsDirectoriesW")
#pragma comment(linker, "/export:bMakePathNameW=gdi32.bMakePathNameW")
#pragma comment(linker, "/export:cGetTTFFromFOT=gdi32.cGetTTFFromFOT")
#pragma comment(linker, "/export:gdiPlaySpoolStream=gdi32.gdiPlaySpoolStream")
于 2013-09-16T12:31:27.773 に答える
0

ここを見てください。

リンクは、プロキシを作成するために DLL のスケルトンを生成するプロジェクトにつながります。私の記憶が正しければ、私が同じことをしようとしていたときに、彼は私が思いつかなかった多くのことを考えていました.

別の考えとして、MSDN のローカル コピーにある DEF ファイルのドキュメントを読んでください。基本的に「このdefファイルがこの関数を(関数名または序数で)定義していない場合は、関数名または序数 'X'でこの他のDLLに渡します」というキーワードがあると思います。

したがって、gina.dll 内の関数 VOID WINAPI DoSomething(VOID) だけを置き換えようとしている場合は、前述のキーワードを使用して、名前または序数に関係なく、他のすべての関数をプロキシできます。

私はもはや真の Windows 開発マシンを持っていないので、調べることができません。何も見つからないため、MSDN Web サイトの使用を拒否します...

于 2013-09-16T11:40:37.700 に答える