-
-
[求助]原看雪的截获ws2_32.dl的原程序l如何+入新代码?
-
发表于: 2008-10-1 21:38 4401
-
看雪原代码:ws2_32.dll的原代码写的很精湛,可是我等后生有点搞不懂
问题如下:
原主人意思说在函数PatchProcess可以放入自己的代码,可是次函数没有参数传入则我们如何写自己的代码呢。比如我要接收recv这个函数的数据,
函数原型:int PASCAL FAR recv(SOCKET s, char FAR * buf, int len, int flags)
在patchprocess中的如何传入recv的参数,或者有别的其他方法?
大大们给个实例,谢谢!
原程序部分如下
#include <Windows.h>
#include "jh.h"
#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
// MemCode 命名空间
namespace MemCode
{
HMODULE m_hModule = NULL;
DWORD m_dwReturn[500] = {0};
inline BOOL WINAPI Load()
{
TCHAR tzPath[MAX_PATH]={0};
TCHAR tzTemp[MAX_PATH]={0};
GetSystemDirectory(tzPath, sizeof(tzPath));
strcat(tzPath,"\\ws2_32.dll");
//显式装载ws2_32.dll
m_hModule = LoadLibrary(tzPath);
if (m_hModule == NULL)
{
wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
MessageBox(NULL, tzTemp, TEXT("MemCode"), MB_ICONSTOP);
}
return (m_hModule != NULL);
}
// 释放原始模块的函数
inline VOID WINAPI Free()
{
if (m_hModule)
{
FreeLibrary(m_hModule);
}
}
// 获取原始函数地址
FARPROC WINAPI GetAddress(PCSTR pszProcName)
{
FARPROC fpAddress;
TCHAR szProcName[16]={0};
TCHAR tzTemp[MAX_PATH]={0};
//MessageBox(NULL, "打开", TEXT("提示"), MB_ICONSTOP);
if (m_hModule == NULL)
{
if (Load() == FALSE)
{
ExitProcess(-1);
}
}
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("MemCode"), MB_ICONSTOP);
ExitProcess(-2);
}
return fpAddress;
}
}
using namespace MemCode;
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
//MessageBox(NULL,"WBS","WBS",0);
//SaveRecord("aa");
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
for (INT i = 0; i < sizeof(m_dwReturn) / sizeof(DWORD); i++)
{
m_dwReturn[i] = TlsAlloc();
}
}
else if (dwReason == DLL_PROCESS_DETACH)
{
for (INT i = 0; i < sizeof(m_dwReturn) / sizeof(DWORD); i++)
{
TlsFree(m_dwReturn[i]);
}
Free();
}
return TRUE;
}
// 补丁程序
/*
将相关补丁代码存放到函数PatchProcess( )里。
*/
void PatchProcess(HANDLE hProcess)
{
DWORD Oldpp;
/************************************************************************/
/*补丁代码样例 */
/************************************************************************/
unsigned char p401496[2] = {
0xEB, 0x29
};
VirtualProtectEx(hProcess, (LPVOID)0x401496, 2, PAGE_EXECUTE_READWRITE, &Oldpp);
WriteProcessMemory(hProcess, (LPVOID)0x401496, p401496, 2, NULL);
// 更多的补丁代码此处略去,实际运用时,读者可放更多的补丁代码在此
}
// 判断是否是目标程序
BOOL isTarget(HANDLE hProcess)
{
DWORD Targetcode = NULL;
if (ReadProcessMemory(hProcess, (LPVOID)0x401484, &Targetcode, 4, NULL))
{
if (Targetcode == 0x000543e8)//从目标程序随机取个点,本例为00401484 E8 43050000 call <jmp.&WS2_32.#4>
return TRUE;
else
return FALSE;
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//选择ws2_32.dll的输出函数WSAStartup调用 hijack(),具体参见后面的 WSAStartup
void hijack()
{
if (isTarget(GetCurrentProcess()))
{
PatchProcess(GetCurrentProcess());
}
}
//过滤处理ws2_32.dll各输出函数
ALCDECL MemCode_recv(void)
{
GetAddress("recv");
__asm JMP EAX;
}
//其他函数省略
#pragma comment(linker, "/EXPORT:recv=_MemCode_recv,@16")
问题如下:
原主人意思说在函数PatchProcess可以放入自己的代码,可是次函数没有参数传入则我们如何写自己的代码呢。比如我要接收recv这个函数的数据,
函数原型:int PASCAL FAR recv(SOCKET s, char FAR * buf, int len, int flags)
在patchprocess中的如何传入recv的参数,或者有别的其他方法?
大大们给个实例,谢谢!
原程序部分如下
#include <Windows.h>
#include "jh.h"
#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
// MemCode 命名空间
namespace MemCode
{
HMODULE m_hModule = NULL;
DWORD m_dwReturn[500] = {0};
inline BOOL WINAPI Load()
{
TCHAR tzPath[MAX_PATH]={0};
TCHAR tzTemp[MAX_PATH]={0};
GetSystemDirectory(tzPath, sizeof(tzPath));
strcat(tzPath,"\\ws2_32.dll");
//显式装载ws2_32.dll
m_hModule = LoadLibrary(tzPath);
if (m_hModule == NULL)
{
wsprintf(tzTemp, TEXT("无法加载 %s,程序无法正常运行。"), tzPath);
MessageBox(NULL, tzTemp, TEXT("MemCode"), MB_ICONSTOP);
}
return (m_hModule != NULL);
}
// 释放原始模块的函数
inline VOID WINAPI Free()
{
if (m_hModule)
{
FreeLibrary(m_hModule);
}
}
// 获取原始函数地址
FARPROC WINAPI GetAddress(PCSTR pszProcName)
{
FARPROC fpAddress;
TCHAR szProcName[16]={0};
TCHAR tzTemp[MAX_PATH]={0};
//MessageBox(NULL, "打开", TEXT("提示"), MB_ICONSTOP);
if (m_hModule == NULL)
{
if (Load() == FALSE)
{
ExitProcess(-1);
}
}
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("MemCode"), MB_ICONSTOP);
ExitProcess(-2);
}
return fpAddress;
}
}
using namespace MemCode;
// 入口函数
BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, PVOID pvReserved)
{
//MessageBox(NULL,"WBS","WBS",0);
//SaveRecord("aa");
if (dwReason == DLL_PROCESS_ATTACH)
{
DisableThreadLibraryCalls(hModule);
for (INT i = 0; i < sizeof(m_dwReturn) / sizeof(DWORD); i++)
{
m_dwReturn[i] = TlsAlloc();
}
}
else if (dwReason == DLL_PROCESS_DETACH)
{
for (INT i = 0; i < sizeof(m_dwReturn) / sizeof(DWORD); i++)
{
TlsFree(m_dwReturn[i]);
}
Free();
}
return TRUE;
}
// 补丁程序
/*
将相关补丁代码存放到函数PatchProcess( )里。
*/
void PatchProcess(HANDLE hProcess)
{
DWORD Oldpp;
/************************************************************************/
/*补丁代码样例 */
/************************************************************************/
unsigned char p401496[2] = {
0xEB, 0x29
};
VirtualProtectEx(hProcess, (LPVOID)0x401496, 2, PAGE_EXECUTE_READWRITE, &Oldpp);
WriteProcessMemory(hProcess, (LPVOID)0x401496, p401496, 2, NULL);
// 更多的补丁代码此处略去,实际运用时,读者可放更多的补丁代码在此
}
// 判断是否是目标程序
BOOL isTarget(HANDLE hProcess)
{
DWORD Targetcode = NULL;
if (ReadProcessMemory(hProcess, (LPVOID)0x401484, &Targetcode, 4, NULL))
{
if (Targetcode == 0x000543e8)//从目标程序随机取个点,本例为00401484 E8 43050000 call <jmp.&WS2_32.#4>
return TRUE;
else
return FALSE;
}
return FALSE;
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//选择ws2_32.dll的输出函数WSAStartup调用 hijack(),具体参见后面的 WSAStartup
void hijack()
{
if (isTarget(GetCurrentProcess()))
{
PatchProcess(GetCurrentProcess());
}
}
//过滤处理ws2_32.dll各输出函数
ALCDECL MemCode_recv(void)
{
GetAddress("recv");
__asm JMP EAX;
}
//其他函数省略
#pragma comment(linker, "/EXPORT:recv=_MemCode_recv,@16")
赞赏
他的文章
看原图
赞赏
雪币:
留言: