我的工具是:
我想要实现的目标:
我正在尝试覆盖GINA.dll,这是一个负责图形窗口登录的Windows DLL文件等等。 我的DLL文件应该在GINA中具有相同的名称相同的功能,我需要一些方法来代替原始的DLL文件,当系统调用方法X时它应该在原始的MSGINA.DLL中执行X方法,
我使用LoadLibrary加载了MsGina.dll,我可以使用GetProcAddress来获取原始函数地址,但是如何使我的方法从msgina.dll执行相同的名称方法?
注意:我们不能将宏与内联汇编jmp指令一起使用,因为X64不支持它。
我已经看到了这个: 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中的原始方法具有相同的名称
答案 0 :(得分:1)
我使用汇编函数来解决这个问题。 该代码可在我的github repo上找到。 对于32位内联仍然使用,对于64位asm文件使用。 详情请参阅此post。
只需运行python脚本,它就会为你创建项目。
顺便说一句,除了你要覆盖的那个函数之外,没有必要知道所有函数的原型。只需修改您对生成的cpp文件感兴趣的功能。
答案 1 :(得分:1)
您似乎正在尝试编写代理DLL。不需要组装。
首先,您可能需要阅读this。
其次,microsoft链接器有一个编译指示,允许您指定函数名称beign导出和转发函数到另一个dll。
Pragma看起来像这样:
#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")
答案 2 :(得分:0)
看看here。
该链接指向一个项目,该项目为DLL生成骨架以创建代理。 如果我没记错的话,当我试图做同样的事情时,他想到了很多我没有做过的事情。
另一个想法是,阅读本地MSDN副本中的DEF文件文档。我相信在那里有一个关键字基本上说“如果这个def文件没有定义这个函数(通过函数名或序号),将它传递给另一个DLL,函数名称或序号'X'”。
因此,如果您尝试更换gina.dll中的函数VOID WINAPI DoSomething(VOID),您可以使用我所描述的关键字来代理所有其他函数,无论是名称还是序数
我不再拥有真正的Windows开发机器,所以我无法查找它。我拒绝使用MSDN网站,因为它找不到任何东西......