首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

IAT HOOK

注:以下操作是在 XP 上实现的,其他版本注意写保护机制 目录 0x00 IAT表的填写 0x01 IAT HOOK的原理 0x02 实现代码 0x00 IAT表的填写 在上一篇文章中,我们构造导入表的时候...,将 IAT 表和 INT 表都指向的是函数名称所在的位置,然后在运行的时候,IAT 表中的内容会被替换成对应函数的地址,在调用的时候使用间接 CALL ,来调用其中所储存的地址。...前面一直在说,填写到对应的位置,是在说 INT 表和 IAT 表的对应关系,在 INT 表中处于第一项,对应的填写到 IAT 表的时候,也是填写到第一项的位置。...0x01 IAT HOOK的实现 既然我们明白了 IAT 表的填写方法,那么就可以通过更改 IAT 表中对应的地址,来达到我们执行自己但是代码的目的,同时为了保证原函数的功能不受影响,还需要进行一些其他的处理...表中的位置,因为已经得到了函数的地址,那么我们就可以通过对比 IAT 表中所指向的地址与当前地址是否一致,来判断是不是我们想要找的函数。

66320
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    4.3 IAT Hook 挂钩技术

    IAT是一个数据结构,其中包含了应用程序在运行时使用的导入函数的地址。 IAT Hook的原理是通过修改IAT中的函数指针,将原本要调用的函数指向另一个自定义的函数。...修改IAT表项:将目标函数在IAT中对应的函数指针修改为自定义函数的地址。 实现自定义函数:编写自定义的函数,该函数会在被钩子函数被调用时执行。...该技术常用于实现一些系统级的功能,例如API监控、函数跟踪、代码注入等,接下来笔者将具体分析IAT Hook的实现原理,并编写一个DLL注入文件,实现IAT Hook替换MessageBox弹窗的功能。...表的地址,后面的黄色为IAT表的大小。...循环遍历导入表中的IAT表,找到与MessageBox地址相同的4字节位置。 找到后通过VirtualProtect设置内存属性可读写,并将自己的函数地址写入到目标IAT表中。

    28540

    4.3 IAT Hook 挂钩技术

    IAT是一个数据结构,其中包含了应用程序在运行时使用的导入函数的地址。IAT Hook的原理是通过修改IAT中的函数指针,将原本要调用的函数指向另一个自定义的函数。...修改IAT表项:将目标函数在IAT中对应的函数指针修改为自定义函数的地址。实现自定义函数:编写自定义的函数,该函数会在被钩子函数被调用时执行。...该技术常用于实现一些系统级的功能,例如API监控、函数跟踪、代码注入等,接下来笔者将具体分析IAT Hook的实现原理,并编写一个DLL注入文件,实现IAT Hook替换MessageBox弹窗的功能。...表的地址,后面的黄色为IAT表的大小。...循环遍历导入表中的IAT表,找到与MessageBox地址相同的4字节位置。找到后通过VirtualProtect设置内存属性可读写,并将自己的函数地址写入到目标IAT表中。

    87820

    PE格式:导入表与IAT内存修正

    脱壳修复:输入表一般分为IAT与INT,由于加壳后程序可能会加密或者破坏IAT结构,导致脱壳后IAT不一致了,脱壳修复就是使用未脱壳的源程序的输入表覆盖到新程序中,就这麽简单。...0000 => ForwardChain => 转向API索引,默认为00000 2174 => Name => 指向DLL名字的指针0000 2010 => FirstThunk => 指向输入地址表IAT...图片再来看一下FirstThunk也就是IAT中的内容,由于User32的FirstThunk字段默认值是2010h,使用该值减去1a00h即可得到610h,此处就是IAT的内容,定位过去看看,完全一致的...图片可以发现,黄色的INT并没有变化,但是绿色的IAT则相应的发生了变化,以第一个0x766bd680则是载入内存后LoadIconA的内存地址,我们使用X64DBG跟过去看看,没错吧!...有时我们在拖壳时,由于IAT发生了变化,所以程序会无法被正常启动,我们Dump出来的文件可能收入表已经被破坏了,导入表不一致,我们可以使用原始的未脱壳的导入表地址对脱壳后的导入表地址进行覆盖,来修复文件

    79000

    红队 | IAT Hook技术实现

    HOOK 1.监控 2.行为改变 改变执行流,让函数先到我这里,获得优先执行权 思路 导入表中有个IAT表,在导入表结构中的FirstThunk.在调用一些API时,只要是LoadLibrary的dll...,其中的API都会在IAT表中,我们可以通过IAT表来寻找我们想要"了解"的函数,并对其进行操作,比如将这个API替换成自己的函数,但是注意参数要相同,不然栈平衡不了。...我这里用简单的MessageBox来说明IAT HOOK问题 SetHook DWORD SetIATHook(DWORD OldAddr,DWORD NewAddr) //oldAddr是原地址,...pIATThunk++; } pImport++; } return Flag; } 大体就是获取基址,定位导入表,IAT...PIMAGE_IMPORT_DESCRIPTOR)(pOptionHeader->DataDirectory[1].VirtualAddress + dwImageBase); //定位导入表 //定位IAT

    61430

    PE格式:导入表与IAT内存修正

    脱壳修复:输入表一般分为IAT与INT,由于加壳后程序可能会加密或者破坏IAT结构,导致脱壳后IAT不一致了,脱壳修复就是使用未脱壳的源程序的输入表覆盖到新程序中,就这麽简单。...(if bound this IAT has actual addresses) } IMAGE_IMPORT_DESCRIPTOR; typedef IMAGE_IMPORT_DESCRIPTOR...=> ForwardChain => 转向API索引,默认为0 0000 2174 => Name => 指向DLL名字的指针 0000 2010 => FirstThunk => 指向输入地址表IAT...再来看一下FirstThunk也就是IAT中的内容,由于User32的FirstThunk字段默认值是2010h,使用该值减去1a00h即可得到610h,此处就是IAT的内容,定位过去看看,完全一致的。...可以发现,黄色的INT并没有变化,但是绿色的IAT则相应的发生了变化,以第一个0x766bd680则是载入内存后LoadIconA的内存地址,我们使用X64DBG跟过去看看,没错吧!

    76630

    PE文件学习笔记(五):导入表、IAT、绑定导入表解析

    ②TimeDateStamp:当时间戳值为0时,表示未加载前IAT表与INT表完全相同;当时间戳不为0(为-1)时,表示IAT与INT表不同,IAT存储的是该dll的所有函数的绝对地址,这样在未加载前就直接填充函数地址的方式为函数地址的绑定...2、IAT(Import Address Table)、INT(import Name Table)结构解析: 关于绑定导入表和IAT表的特殊情况这里先不做研究,我们先来看看IAT和INT结构相同的时情况...而IAT则根据导入表INT(IAT加载前)的内容和导出表信息,修改为对应的函数的地址信息,如下所示: 这里写图片描述 3、绑定导入表(Bound Import Descriptor)与IAT: 我们上面分析了加载前...,IAT中存储非函数地址的情况,下面我们来分析加载前IAT表中存储函数地址的情况。...12项,IAT是第13项)。

    1.6K40

    PE格式第四讲,数据目录表之导入表,以及IAT

    PE格式第四讲,数据目录表之导入表,以及IAT表 一丶IAT(地址表) 首先我们思考一个问题,程序加载的时候会调用API,比如我们以前写的标准PE 那么他到底是怎么去调用的?...+ 400 = 408 (文件偏移处) 看下文件偏移处 可以看出,205C是一个RVA偏移,转为FA跟随则是 FA = 5c + 400 = 45c位置 45C位置 正好是MsgBosA的字符串 这个IAT...而这个表格的存储方式则是 /* IAT [iat1......0 iat2........0] */ 其中是以0结尾的....表格的RVA地址, 加载DLL了,根据函数名获得了函数地址,程序启动之后就会往IAT表格中填写地址了....的RVA偏移地址,得出IAT表格位置 现在是2008 FA = 8+400 = 408 那么408的位置就是IAT表格了 可以看出,表格中前四个字节还记录了一个RVA偏移 那么这个偏移代表的就是函数名字的位置

    1.4K50
    领券