好文档 - 专业文书写作范文服务资料分享网站

源程序程序破解之 API HOOK技术

天下 分享 时间: 加入收藏 我要投稿 点赞

【源程序】程序破解之 API HOOK技术

API HOOK,就是截获API调用的技术,在程序对一个API调用之前先执行你的函数,然后根据你的需要可以执行缺省的API调用或者进行其他处理,假设如果想截获一个进程对网络的访问,一般是几个socket API : recv,recvfrom, send, sendto等等,当然你可以用网络抓包工具,这里只介绍通过API HOOK的方式来实现, 主要原理是在程序运行中动态修改目标函数地址的内存数据,使用jmp语句跳转到你的函数地址,执行完后再恢复内存数据, 汇编代码是:

mov eax, pNewAddr[/size][size=3] jmp eax

读写进程内存方法: 1. 读进程内存:

2. VirtualProtect(lpAddress, nSize, PAGE_READONLY, &dwOldProtect); 3. ReadProcessMemory(hProcess, lpAddress, lpBuffer, nSize, &dwRead); 4. VirtualProtect(lpAddress, nSize, dwOldProtect, &dwOldProtect);

2.写进程内存:

VirtualProtect(lpAddress, nSize, PAGE_READWRITE, &dwOldProtect); WriteProcessMemory(hProcess, lpAddress, lpBuffer, nSize, &dwWrite); VirtualProtect(lpAddress, nSize, dwOldProtect, &dwOldProtect);

在很多年前这种技术非常的流行,有各种各样的工具和SDK,我自己也实现了一个C++ class,名为 CAdHookApi, 主要几个函数是:

class CAdHookApi {

public:

// 指定DLL的某个函数进行HOOK

HANDLE Add(LPCTSTR lpszModule, LPCSTR lpcFuncName, void *pNewAddr, DWORD dwData = 0); // 给定一个函数地址进行HOOK

HANDLE Add(void *pOldAddr, void *pNewAddr, const BYTE *verifyData = NULL, DWORD verifySize = 0, DWORD dwData = 0); BOOL Remove(HANDLE hHook); BOOL Begin(HANDLE hHook); BOOL End(HANDLE hHook);

BOOL Begin2(void *pNewAddr); BOOL End2(void *pNewAddr); int BeginAll(); int EndAll(); };

举例说明使用方法:

假设一个软件是试用软件,试用7天,最笨的办法就是改本机时间,但如果用API HOOK技术就可以很容易做到,可以先用CFF Explorer或者Dependency查看一下该软件是调用哪个函数来获取系统当前时间的,假如是GetLocalTime函数(当然获取时间的函数还有很多API),那么我就可以截获GetLocalTime,返回一个永不过期的时间. 1. 首先,声明一个全局变量:

static CAdHookApi gHooks;

2. 确定要截获API的参数,API GetLocalTime对应的DLL是KERNEL32.DLL, API定义为:

void WINAPI GetLocalTime(LPSYSTEMTIME lpSystemTime);

写一个新的函数,定义和原函数保持一致:

void WINAPI my_GetLocalTime(LPSYSTEMTIME lpSystemTime) {

#if 1

// 执行缺省调用

CAdAutoHookApi autoHook(&gHooks, my_GetLocalTime); GetLocalTime(lpSystemTime); #else

// 改变函数的行为,返回固定的时间 // 2012-12-28 10:00:00

lpSystemTime->wYear = 2012; lpSystemTime->wMonth = 12; lpSystemTime->wDayOfWeek = 0; lpSystemTime->wDay = 28; lpSystemTime->wHour = 10; lpSystemTime->wMinute = 0; lpSystemTime->wSecond = 0; lpSystemTime->wMilliseconds = 0; #endif }

3.直接HOOK已知的函数地址:

如果已知函数地址和函数定义,可以直接对地址进行HOOK,在HOOK之前还可以先对内存数据进行检验,只有数据一致才HOOK.

// 004026B0 ;

static int my_sub_4026B0(BYTE *pbData) {

CAdAutoHookApi autoHook(&gHooks, my_sub_4026B0);

sub_4026B0_func sub_4026B0 = (sub_4026B0_func)(0x004026B0);

string hexData1 = toHexString((const char *)pbData, strlen((const char *)pbData)); int ret = sub_4026B0(pbData);

string hexData2 = toHexString((const char *)pbData, strlen((const char *)pbData));

logOutput(formatString(\hexData1.c_str(), hexData2.c_str()));

return ret; }

const BYTE verifyData[] = { 0x55, 0x8B, 0xEC, 0x81, 0xEC, 0x2C, 0x01, 0x00, 0x00 }; void *addr = (void *)0x004026B0;

if(gHooks.Add(addr, my_sub_4026B0, verifyData, sizeof(verifyData), 0) != NULL) {

logOutput(formatString(\} else {

logOutput(formatString(\}

4.函数首次HOOK是在DLL加载时完成的,DLL入口增加代码:

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) {

switch (ul_reason_for_call) {

case DLL_PROCESS_ATTACH: {

// 截获KERNEL32.DLL的API GetLocalTime到你的函数地址my_GetLocalTime gHooks.Add(_T(\ // 开始HOOK所有的 gHooks.BeginAll(); }

break ;

case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: break ;

case DLL_PROCESS_DETACH: {

gHooks.EndAll(); }

break; }

return TRUE;

源程序程序破解之 API HOOK技术

【源程序】程序破解之APIHOOK技术APIHOOK,就是截获API调用的技术,在程序对一个API调用之前先执行你的函数,然后根据你的需要可以执行缺省的API调用或者进行其他处理,假设如果想截获一个进程对网络的访问,一般是几个socketAPI:recv,recvfrom,send,sendto等等,当然你可以用网络抓包工具,这里只介绍通过APIHOOK的方
推荐度:
点击下载文档文档为doc格式
339bz1l2sp1h1yk7prs5
领取福利

微信扫码领取福利

微信扫码分享