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
  • 相关阅读:
    ubuntu下安装maven
    159.Longest Substring with At Most Two Distinct Characters
    156.Binary Tree Upside Down
    155.Min Stack
    154.Find Minimum in Rotated Sorted Array II
    153.Find Minimum in Rotated Sorted Array
    152.Maximum Product Subarray
    151.Reverse Words in a String
    150.Evaluate Reverse Polish Notation
    149.Max Points on a Line
  • 原文地址:https://www.cnblogs.com/Archimedes/p/7010571.html
Copyright © 2011-2022 走看看