首页
社区
课程
招聘
[旧帖] 关于API HOOK IAT的问题 0.00雪花
发表于: 2012-7-12 17:16 4902

[旧帖] 关于API HOOK IAT的问题 0.00雪花

2012-7-12 17:16
4902
大侠们,小弟最近在学习API HOOK的东东,从网上下载了张正秋编著的《windows应用程序捆绑核心编程》的随书源码,但在测试时出现了些疑问,特来请教各位:
使用修改IAT表的方法来HOOK,以挂钩MessageBoxA()函数为例。附件中有三个文件夹,HookIAT_dll(实现修改IAT表进行HOOK),HookRemote(实现远程注入),HookMsgbx(用于测试的程序,调用了MessageBoxA())。
结果为什么不像书中说的那样呢?进行了HOOK之后,MessageBoxA()的对话框还是显示的原有字符???
附件.zip

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

上传的附件:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 297
活跃值: (235)
能力值: ( LV4,RANK:55 )
在线值:
发帖
回帖
粉丝
2
熟悉pe结构了很好写吧,注入代码将目标进程地址空间iat中函数地址改为你的函数地址就是了。   你那个测试程序调试定位到函数地址看看是否被修改成功了
2012-7-12 18:21
0
雪    币: 324
活跃值: (21)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
谢谢楼主推荐这本书,我一直想学hook,这回可解燃眉之急了,谢谢哈!!~
2012-7-12 20:21
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
我试了下,好像没有成功呀,HOOK前后,点击测试程序中的“确定”按键,弹出的对话框的输出内容是一样的。。。

朋友,了解的话,帮我看下代码吧?
2012-7-12 22:25
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不客气,我也是刚学,有问题可以互相交流下!
2012-7-12 22:26
0
雪    币: 227
活跃值: (66)
能力值: ( LV7,RANK:100 )
在线值:
发帖
回帖
粉丝
6
LZ贴下你的代码吧。
IAT HOOK的话,首先要枚举所有进程模块,然后修改每个模块的IAT才可以,不然挂钩不完整某些情况下会失效。你是否仅仅修改了EXE映像的IAT?
2012-7-12 22:32
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
有代码啊,压缩包“附件”,在我最开始写的问题后面。
2012-7-12 23:01
0
雪    币: 130
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
这是其中的HookApi_IAT.cpp文件的完整代码:
// HookApi_IAT.cpp:实现CHookApi_IAT类.
//
#include "stdafx.h"
#include "HookApi_IAT.h"
#include <tlhelp32.h>
#include <imagehlp.h>
#pragma comment (lib,"imagehlp.lib")

//---------------------------------------------------------------------------
CHookApi_IAT::CHookApi_IAT()
{
}

//---------------------------------------------------------------------------
CHookApi_IAT::~CHookApi_IAT()
{
}

//---------------------------------------------------------------------------
BOOL CHookApi_IAT::HookAllAPI(LPCTSTR ModuleName, PROC HookAPIAddr, PROC lpNewFunc)
{
        if (ModuleName == NULL||HookAPIAddr == NULL)
                return FALSE;

        HANDLE hSnapshot;
        MODULEENTRY32 hMod = {sizeof(hMod)};
        hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,NULL);
       
        // 取得所有模块列表中的指定的模块.
        BOOL bMoreMods = Module32First(hSnapshot, &hMod);
        if (bMoreMods == FALSE) return FALSE;
       
        // 循环取得想要的模块.
        for (;bMoreMods; bMoreMods = Module32Next(hSnapshot, &hMod))
        {
                MEMORY_BASIC_INFORMATION mbi;
                // 获取本模块信息.
                VirtualQuery(this,&mbi,sizeof(mbi));
                // 不在自己的模块中挂钩函数.
                if (hMod.hModule != (HMODULE)mbi.AllocationBase)
                {
                        //hMod.hModule:指向当前被挂钩进程的每一个模块.
                        HookOneAPI(        ModuleName,HookAPIAddr,
                                lpNewFunc,hMod.hModule);
                }
        }
       
        return TRUE;  
}

//---------------------------------------------------------------------------
BOOL CHookApi_IAT::HookOneAPI(PCSTR   ModuleName, PROC HookAPIAddr,
                                                          PROC    lpNewFunc, HMODULE hmodCaller)
{
        DWORD size;
       
        PIMAGE_IMPORT_DESCRIPTOR pImportDesc =
                (PIMAGE_IMPORT_DESCRIPTOR) ImageDirectoryEntryToData(
                hmodCaller,TRUE,IMAGE_DIRECTORY_ENTRY_IMPORT,&size);
       
    if(pImportDesc == NULL) return FALSE;
       
    for (;pImportDesc->Name;pImportDesc++)
    {
        LPSTR pszDllName = (LPSTR)((PBYTE)hmodCaller + pImportDesc->Name);
        if(lstrcmpiA(pszDllName,ModuleName) == 0) break;
    }
       
    if(pImportDesc->Name == NULL) return FALSE;
    PIMAGE_THUNK_DATA pThunk = (PIMAGE_THUNK_DATA)
                ((PBYTE)hmodCaller + pImportDesc->FirstThunk);//IAT

    for(;pThunk->u1.Function;pThunk++)
    {
        PROC * ppfn= (PROC *)&pThunk->u1.Function;
               
                m_lpOldFunc = (PROC)pThunk->u1.Function;
                m_lpNewFunc =lpNewFunc;

        if (*ppfn == HookAPIAddr)
        {
                MEMORY_BASIC_INFORMATION mbi;
                        ZeroMemory(&mbi, sizeof(MEMORY_BASIC_INFORMATION));
                        VirtualQuery(ppfn,&mbi,sizeof(MEMORY_BASIC_INFORMATION));
                        VirtualProtect(mbi.BaseAddress,mbi.RegionSize,
                                                       PAGE_READWRITE,&mbi.Protect);
                        *ppfn = *lpNewFunc;
                        DWORD dwOldProtect;
                        VirtualProtect(mbi.BaseAddress,mbi.RegionSize,
                                                mbi.Protect,&dwOldProtect);
            return TRUE;
        }
    }
       
        return FALSE;
}

//---------------------------------------------------------------------------
BOOL CHookApi_IAT::HookOneAPI_OFF(PCSTR ModuleName, HMODULE hmodCaller)
{
    return  HookOneAPI(ModuleName, m_lpNewFunc,m_lpOldFunc,hmodCaller);
}
2012-7-12 23:07
0
游客
登录 | 注册 方可回帖
返回
//