zoukankan      html  css  js  c++  java
  • 初探IAT

    ---恢复内容开始---

    IAT(Import Address Table:输入函数地址表)

    【IAT作用是什么:】

    一个API函数,比如MessageBoxA,我们是如何调用它的呢,

    在这里我们可以看出是通过一个间接跳转来抵达了MessageBoxA的入口点。

     

    它的入口点在我的电脑上是75F1FDAE,但是在其他版本操作系统或者User32.dll版本不相同的电脑上,入口点就可能会不同。

    为了解决以上兼容问题,操作系统就必须提供一些措施来确保该CrackMe可以在其他版本的Windows操作系统,以及DLL版本下也能正常运行。

    这时IAT(Import Address Table:输入函数地址表)就应运而生了。

    【 IAT是什么:】

    这时我们在数据窗口看看调用MessageBoxA时JMP的4031AC有什么

     

    我们看到里面是MessageBoxA的入口点

    除了MessageBoxA,我们还可以看到很多类似的间接JMP。

    这一片区域包含了该程序调用的所有API函数的入口地址,这块区域我们称之为IAT(导入函数地址表),这里就是解决不同版本操作系统间调用API兼容问题的关键所在,

    不同版本操作系统,相同API函数的入口点不相同,这时我们就需要提前把API函数地址填充到IAT中,然后像刚才一样通过间接跳转来调用该API函数即可,

    这样就可以确保不同版本系统调用的都是正确的API函数。

    那么现在问题来了,【何将API函数入口地址填充到IAT中呢?】

    现在我们仍以调用MessageBoxA时间接跳转IAT的4031AC内存单元为例,这里我们选中4031AC中保存的内容,单击鼠标右键选择-View executable file(浏览可执行文件),

    就能看到4031AC这个虚拟地址对应于可执行文件中的文件偏移是多少了。

    我们看到在可执行文件对应文件偏移处中的内容为60 33 00 00,当程序运行起来的时候,0FAC这个文件偏移对应的虚拟地址处就会被填充为EA 04 D5 77,

    也就是说该CrackMe进程空间中的4031AC地址处会被填入正确的API函数地址,然后就可以通过间接跳转来调用MessagBoxA啦。

    这里3360加上映像基址即,我们定位到403360处,看看是什么。

     

    哇看到了一个字符串,是我们调用函数API的名字MessagBoxA,也就是说操作系统根据这个字符串,能够定位到相应的API函数名称,然后通过调用GetProcAddress(注)获取对应API函数的地址,

    然后将该地址填充到IAT中,覆盖原来的3360。这样就能保证在程序执行前,IAT中被填充了正确的API函数地址。如果我们换一台机器,定位到4031AC处,可能会看到里面存放着不同的地址。

    这样就能够调用MessageBoxA了,大家可能会觉得这个过程很复杂,其实填充IAT的过程都是操作系统帮我们完成的,在程序开始执行前,IAT已经被填入了正确的API函数地址。

    到现在为止,操作系统是如何填充IAT的了,而要成功执行应该满足:

    可执行文件各IAT项所在的文件偏移处必须是一个指针,指向一个字符串(如:MessagBoxA)。

    【直接跳转和间接跳转】

     

    跳转分为两种,直接跳转和间接跳转

    直接跳转

    跳转的目的地为后面的内存单元

     

    间接跳转

    跳转的真正目的地保存在内存单元中

     

    当程序需要调用某个API函数的时候,都是通过一个间接跳转来调用的

    ---注释---

    FARPROC GetProcAddress(
    HMODULE hModule, // DLL模块句柄
    LPCSTR lpProcName // 函数名
    );
     
     
    参考书籍:《使用OllyDbg从零开始Cracking》———RicardoNarvaja

    ---恢复内容结束---

    IAT(Import Address Table:输入函数地址表)

    【IAT作用是什么:】

    一个API函数,比如MessageBoxA,我们是如何调用它的呢,

    在这里我们可以看出是通过一个间接跳转来抵达了MessageBoxA的入口点。

     

    它的入口点在我的电脑上是75F1FDAE,但是在其他版本操作系统或者User32.dll版本不相同的电脑上,入口点就可能会不同。

    为了解决以上兼容问题,操作系统就必须提供一些措施来确保该CrackMe可以在其他版本的Windows操作系统,以及DLL版本下也能正常运行。

    这时IAT(Import Address Table:输入函数地址表)就应运而生了。

    【 IAT是什么:】

    这时我们在数据窗口看看调用MessageBoxA时JMP的4031AC有什么

     

    我们看到里面是MessageBoxA的入口点

    除了MessageBoxA,我们还可以看到很多类似的间接JMP。

    这一片区域包含了该程序调用的所有API函数的入口地址,这块区域我们称之为IAT(导入函数地址表),这里就是解决不同版本操作系统间调用API兼容问题的关键所在,

    不同版本操作系统,相同API函数的入口点不相同,这时我们就需要提前把API函数地址填充到IAT中,然后像刚才一样通过间接跳转来调用该API函数即可,

    这样就可以确保不同版本系统调用的都是正确的API函数。

    那么现在问题来了,【何将API函数入口地址填充到IAT中呢?】

    现在我们仍以调用MessageBoxA时间接跳转IAT的4031AC内存单元为例,这里我们选中4031AC中保存的内容,单击鼠标右键选择-View executable file(浏览可执行文件),

    就能看到4031AC这个虚拟地址对应于可执行文件中的文件偏移是多少了。

    我们看到在可执行文件对应文件偏移处中的内容为60 33 00 00,当程序运行起来的时候,0FAC这个文件偏移对应的虚拟地址处就会被填充为EA 04 D5 77,

    也就是说该CrackMe进程空间中的4031AC地址处会被填入正确的API函数地址,然后就可以通过间接跳转来调用MessagBoxA啦。

    这里3360加上映像基址即,我们定位到403360处,看看是什么。

     

    哇看到了一个字符串,是我们调用函数API的名字MessagBoxA,也就是说操作系统根据这个字符串,能够定位到相应的API函数名称,然后通过调用GetProcAddress(注)获取对应API函数的地址,

    然后将该地址填充到IAT中,覆盖原来的3360。这样就能保证在程序执行前,IAT中被填充了正确的API函数地址。如果我们换一台机器,定位到4031AC处,可能会看到里面存放着不同的地址。

    这样就能够调用MessageBoxA了,大家可能会觉得这个过程很复杂,其实填充IAT的过程都是操作系统帮我们完成的,在程序开始执行前,IAT已经被填入了正确的API函数地址。

    到现在为止,操作系统是如何填充IAT的了,而要成功执行应该满足:

    可执行文件各IAT项所在的文件偏移处必须是一个指针,指向一个字符串(如:MessagBoxA)。

    【为什么脱壳后要修复IAT呢】

    因为壳把IAT破坏了,

    壳压根不需要原程序的IAT,因为被加壳程序首先会执行解密例程,读取IAT中所需要的API的名称指针,然后定位到API函数地址,将其填入到IAT中,这个时候,IAT中已经被填充了正确的API函数地址,

    对应的API函数名称的字符串已经不需要了,可以清除掉。大部分的壳会将API函数名称对应的字符串以密文的形式保存到某个地址处,让Cracker们不能那么容易找到它们。

    【直接跳转和间接跳转】

     

    跳转分为两种,直接跳转和间接跳转

    直接跳转

    跳转的目的地为后面的内存单元

     

    间接跳转

    跳转的真正目的地保存在内存单元中

     

    当程序需要调用某个API函数的时候,都是通过一个间接跳转来调用的

    ---注释---

    FARPROC GetProcAddress(
    HMODULE hModule, // DLL模块句柄
    LPCSTR lpProcName // 函数名
    );
     
     
    参考书籍:《使用OllyDbg从零开始Cracking》———RicardoNarvaja
  • 相关阅读:
    是用VLC API将RTSP流convert为视频文件
    VLC命令行的应用
    OpenRTSP的使用
    (3两个例子)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
    寻找轮廓的中点
    (4程序框架)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
    (2环境架设)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
    (1综述)从零开始的嵌入式图像图像处理(PI+QT+OpenCV)实战演练
    初步实现GoQtTemplate
    特征提取算法的综合实验(多种角度比较sift/surf/brisk/orb/akze)
  • 原文地址:https://www.cnblogs.com/Archimedes/p/7010571.html
Copyright © 2011-2022 走看看