15,471
社区成员
发帖
与我相关
我的任务
分享
// 将add()中的入口代码保存入OldCode[]
_asm
{
lea edi,OldCode
mov esi,pfadd
cld
movsd
movsb
}
NewCode[0]=0xe9;//实际上0xe9就相当于jmp指令
//获取Myadd()的相对地址
_asm
{
lea eax,Myadd
mov ebx,pfadd
sub eax,ebx
sub eax,5
mov dword ptr [NewCode+1],eax
}
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
//相同的导出函数
extern "C" __declspec(dllexport) int coutb1(char *a,char *b)
{
//把参数写出来
cout<<b<<a<<endl;
//调用原dll
HINSTANCE hdll;
hdll=LoadLibrary("target.dll");
if(hdll==NULL)
{
FreeLibrary(hdll);
return 1;
}
typedef int(*Dllfun)(char *,char*);
Dllfun maopao1;
maopao1=(Dllfun)GetProcAddress(hdll,"maopao");
if(maopao1==NULL)
{
FreeLibrary(hdll);
return 1;
}
return 0;
}
[/quote]
忘了些执行了
maopao1(a,b);
BOOL APIENTRY DllMain( HANDLE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE;
}
//相同的导出函数
extern "C" __declspec(dllexport) int coutb1(char *a,char *b)
{
//把参数写出来
cout<<b<<a<<endl;
//调用原dll
HINSTANCE hdll;
hdll=LoadLibrary("target.dll");
if(hdll==NULL)
{
FreeLibrary(hdll);
return 1;
}
typedef int(*Dllfun)(char *,char*);
Dllfun maopao1;
maopao1=(Dllfun)GetProcAddress(hdll,"maopao");
if(maopao1==NULL)
{
FreeLibrary(hdll);
return 1;
}
return 0;
}
如果你的 dll 导出的函数不是很多,你可以手动写每一个导出符号。 当很多的时候,才需要使用自动的函数。此时才需要替换函数入口,否则根本不需要处理你说的情况。
修改页面属性,直接写入跳转指令// 长跳转说明: // 0x0: 0xff2500000000 ;jump to the address immediately following this address // 0x6: the address to be jumped ;64 bits address of hooking function // 参考 AMD x64体系指令结构 *((unsigned char *)mi2.mappedAddr) = 0xff; *((unsigned char *)mi2.mappedAddr + 1) = 0x25; *((uint32_t *)((ULONG_PTR)mi2.mappedAddr + 2)) = 0x0; *((ULONG_PTR *)((ULONG_PTR)mi2.mappedAddr + 6)) = (ULONG_PTR)(pHook->newFunc);
// 长跳转说明:
// 0x0: 0xff2500000000 ;jump to the address immediately following this address
// 0x6: the address to be jumped ;64 bits address of hooking function
// 参考 AMD x64体系指令结构
*((unsigned char *)mi2.mappedAddr) = 0xff;
*((unsigned char *)mi2.mappedAddr + 1) = 0x25;
*((uint32_t *)((ULONG_PTR)mi2.mappedAddr + 2)) = 0x0;
*((ULONG_PTR *)((ULONG_PTR)mi2.mappedAddr + 6)) = (ULONG_PTR)(pHook->newFunc);
修改页面属性,直接写入跳转指令WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/
自己做一个同名的 dll,自己导出其导出符号,当呼叫你指定的函数的时,就可以看到参数了。
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 头文件
#include <Windows.h>
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
PVOID pfnPicFreeFileInfo;
PVOID pfnPicRetrieveFileInfo;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 获取原始函数地址
FARPROC WINAPI GetAddress(PCSTR pszProcName)
{
pfnPicFreeFileInfo=GetAddress("PicFreeFileInfo");
pfnPicRetrieveFileInfo=GetAddress("PicRetrieveFileInfo");
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 宏定义
#define EXTERNC extern "C"
#define NAKED __declspec(naked)
#define EXPORT __declspec(dllexport)
#define ALCPP EXPORT NAKED
#define ALSTD EXTERNC EXPORT NAKED void __stdcall
#define ALCFAST EXTERNC EXPORT NAKED void __fastcall
#define ALCDECL EXTERNC NAKED void __cdecl
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// AheadLib 命名空间
namespace AheadLib
{
HMODULE m_hModule = NULL; // 原始模块句柄
DWORD m_dwReturn[2] = {0}; // 原始函数返回地址
// 加载原始模块
inline BOOL WINAPI Load()
{
TCHAR tzPath[MAX_PATH];
TCHAR tzTemp[MAX_PATH * 2];
lstrcpy(tzPath, TEXT("aepicOrg"));
m_hModule = LoadLibrary(tzPath);
if (m_hModule == NULL)
{
wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
}
return (m_hModule != NULL);
}
// 释放原始模块
inline VOID WINAPI Free()
{
if (m_hModule)
{
FreeLibrary(m_hModule);
}
}
// 获取原始函数地址
FARPROC WINAPI GetAddress(PCSTR pszProcName)
{
FARPROC fpAddress;
CHAR szProcName[16];
TCHAR tzTemp[MAX_PATH];
fpAddress = GetProcAddress(m_hModule, pszProcName);
if (fpAddress == NULL)
{
if (HIWORD(pszProcName) == 0)
{
wsprintf(szProcName, "%d", pszProcName);
pszProcName = szProcName;
}
wsprintf(tzTemp, TEXT("无法找到函数 %hs,程序无法正常运行。"), pszProcName);
MessageBox(NULL, tzTemp, TEXT("AheadLib"), MB_ICONSTOP);
ExitProcess(-2);
}
return fpAddress;
}
}
using namespace AheadLib;
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
return Load();
}
else if (dwReason == DLL_PROCESS_DETACH)
{
Free();
}
return TRUE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_PicFreeFileInfo(void)
{
// 保存返回地址
__asm POP m_dwReturn[0 * TYPE long];
// 调用原始函数
GetAddress("PicFreeFileInfo")();
// 转跳到返回地址
__asm JMP m_dwReturn[0 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// 导出函数
ALCDECL AheadLib_PicRetrieveFileInfo(void)
{
// 保存返回地址
__asm POP m_dwReturn[1 * TYPE long];
// 调用原始函数
GetAddress("PicRetrieveFileInfo")();
// 转跳到返回地址
__asm JMP m_dwReturn[1 * TYPE long];
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
有考虑过,64位的输入输出表没弄下来,仿照的导出函数不知道怎么写啊,请指教一下,十分感谢。 [quote=引用 1 楼 dustpg 的回复:] 替换dll不就行了, 仿照导出函数自己实现, 再调用原dll, 还不用修改
有考虑过,64位的输入输出表没弄下来,仿照的导出函数不知道怎么写啊,请指教一下,十分感谢。 替换dll不就行了, 仿照导出函数自己实现, 再调用原dll, 还不用修改
替换dll不就行了, 仿照导出函数自己实现, 再调用原dll, 还不用修改