萌新逆向学习笔记——IAT钩取

前言

在上一篇文章中介绍了以模拟调试器的方式来对特定的API地址进行钩取。而这次本篇文章介绍的是修改IAT来同样达到钩取API的目的,这也是一种“劫持”API的方法。

本文为个人学习《逆向工程核心原理》书籍的学习笔记,如果想深入学习逆向工程,推荐去观摩一下该本书籍。因为它实在是十分的易懂。

原理

当程序调用函数的时候,它会使用函数所在模块名称进行一个查表操作。这个表就是俗称的IID(IMAGE_IMPORT_DESCRIPTOR)。表上记载着程序调用目标函数的地址又称为IAT。待查询到目标函数地址后,程序才会真正的通过这个函数地址来进行函数调用:

1.png

而我们只要修改IID中记录的对应的函数地址IAT,使它指向我们自己定义的另一个MessageBoxA,这样函数查表返回的地址就不是原来程序中定义的地址,而是我们修改后指向自己定义函数的地址了,这就完成了一次IAT“劫持”。

1.png

实现思路

整体思路:将修改函数地址的实现,以及新函数的实现写在一个DLL里,再编写一个注入器,将该DLL注入到目标程序中。DLL注入成功后便会修改IAT函数地址,达到IAT钩取的目的。

细节思路:主要是如何找到该程序的IID里对应的IAT。我们可以先使用getModuleHandle(NULL)函数找到当前被注入程序的基址pfile,该基址即是指向当前PE文件DOS头的起始地址。通过DOS头结构体的e_lfanew属性,获取到NT头的虚拟内存空间的偏移量RVA,将该值加上基址pfile即可得到NT头的虚拟内存地址。而最后通过相关的属性操作,就可以从NT头中获取对应的IAT地址。

实践

获取IID:

void findIID() {
    // 找到IID所在的内存地址
    //获取当前被注入DLL的程序模块基址
    pfile = (PBYTE)GetModuleHandle(NULL);  
    //转换成DOS头
    PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)pfile;  
    //通过DOS头的e_lfanew找到NT头
    PIMAGE_NT_HEADERS ntHeader = (PIMAGE_NT_HEADERS)(pfile + dosHeader->e_lfanew); 
    //NT头中的可选NT头里的DataDirectory数组,记载着IID的虚拟内存偏移地址
    IMAGE_DATA_DIRECTORY IATSection = (IMAGE_DATA_DIRECTORY)(ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT]);
    //加上基址,获取到IID虚拟内存地址
    currentIID = PIMAGE_IMPORT_DESCRIPTOR(pfile + IATSection.VirtualAddress);
}

修改IAT

LPCSTR dialogDLL = "user32.dll";
void hookIAT() {
    // 修改IAT
    while (currentIID)
    {
        //去IID中的Name字段,其为IAT对应的模块名称虚拟内存地址偏移量,如MessageBoxA是在系统函数user32.dll中
        DWORD RVAName = currentIID->Name;
        char* VAName = (char*)(pfile + RVAName);
        //对比是否为user32.dll
        if (strcmp(VAName, dialogDLL))
        {
            // 符合条件,取出IAT列表
            DWORD RVAIAT = currentIID->FirstThunk;
            PIMAGE_THUNK_DATA pthunk = (PIMAGE_THUNK_DATA)(pfile + RVAIAT);
            //循环IAT函数地址列表,找到MessageBoxA函数地址
            while (pthunk->u1.Function)
            {
                DWORD funAddress = pthunk->u1.Function;
                if (funAddress == (DWORD)oriAddress)
                {
                    //修改IAT
                    DWORD oldProtect = NULL;
                    VirtualProtect((LPVOID)&pthunk->u1.Function, 4, PAGE_EXECUTE_READWRITE, &oldProtect);
                    pthunk->u1.Function = (DWORD)hookMessageBox;
                    VirtualProtect((LPVOID)&pthunk->u1.Function, 4, oldProtect, &oldProtect);
                    break;
                }
                pthunk++;
            }
            return;
        }
        currentIID++;
    }
}

结果

例中使用的依旧是上篇文章中编写的可怜的弹窗程序:


2.png
3.png

结论

IAT钩取具有一定的局限性,我们只能钩取IAT中存在的函数,而不能无中生有。而我们定义的函数签名也必须符合钩取的原函数前的签名;如参数类型,函数返回等须相同。

总的来说IAT钩取还是比较简单快速的,其难点是寻找IAT的过程。倘若我们对PE文件结构毫无所知,不能理解DOS头,NT头等重要结构,想必就要多费一些心思了吧。

源码及例子

https://share.weiyun.com/iCyzPWuM

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,616评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,020评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,078评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,040评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,154评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,265评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,298评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,072评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,491评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,795评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,970评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,654评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,272评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,985评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,815评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,852评论 2 351