欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

Windows调试艺术——导入函数和导出函数

来源:本站整理 作者:佚名 时间:2019-04-30 TAG: 我要投稿

windows调试艺术主要是记录我自己学习的windows知识,并希望尽可能将这些东西在某些实际方面体现出来。
所谓导入函数在很多人眼中是个非常简单的概念,无非就是把人家写好的函数拿过来用罢了,但实际上,导入一个函数是基于复杂的数据结构和加载机制的,不管是加壳脱壳还是病毒分析都离不开它,这篇文章主要是理顺整个pe文件导入函数相关的数据结构和导入过程,最后再结合windbg的调试尝试仿照病毒的编写实现我们自己的导入机制。
阅读本篇前建议先阅读以下两篇学习前置知识
Windows调试艺术——利用LBR寻找dll基址
Windows调试艺术——断点和反调试(上)
导入和导出函数
简单实例
所谓导入函数实际上就是我们将dll暴漏出来的导出函数拿过来为我们所用,当我们的程序加载到内存中后,其实并不能独立运行,因为我们有很多”窟窿”没有填上,这些”窟窿”也就是我们调用的自己并没有实际编写的、追根溯源实际上来自dll的函数,哪怕你的程序什么也没有做,单单是显示个黑窗(cmd)就退出,那初始化黑窗和退出其实也是dll中的函数完成的。
可以想象,必然是有人在我们程序执行时帮我们填上了这些”窟窿”,让我们能够正常使用这些函数。其实这个人就是windows的pe加载器,它在我们程序启动时就将相应的dll也加载入了该程序所对应的虚拟内存(注意,为了节约物理内存,如果有多个程序加载了同一个dll时,实际上物理上只有一份,但是相当于进入了不同程序的虚拟空间),然后将我们原来的函数地址替换成了真实的地址,我们可以通过一个真实的例子来看一下
程序很简单,就是malloc了0x20的空间,然后打印了一句话而已
push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF0h
sub     esp, 20h
call    ___main
mov     dword ptr [esp], 20h ; size_t
call    _malloc
mov     [esp+1Ch], eax
mov     dword ptr [esp+1Ch], offset aHelloWorld ; "hello world"
mov     eax, [esp+1Ch]
mov     [esp], eax      ; char *
call    _printf
mov     eax, 0
leave
retn
我们点击我们自己并没有写的malloc函数,发现其call到一个jmp
; void *__cdecl malloc(size_t)
public _malloc
_malloc proc near
jmp     ds:__imp__malloc
_malloc endp
我们可以用od动态看一下,在jmp指令下右键选择在数据窗口中跟随


可以看到jmp的地址是406124,而里面存放的数据显然是一个dll的地址,也就是76308730,我们再次跳转过去看看

实际上就是真实的malloc函数。
根据上面的过程我们可以看到,在调用一个函数的时候,会经历这样的过程
call --> jmp --> address(address里存放func地址) --> func
而在有大量函数的时候,这个address就成了一个巨大的表,由于这个表保存的是导入函数在内存中的真实地址,我们把这个表叫做导入函数地址表(import address table),也就是IAT。在ida中我们顺着上面的操作就可以直观的看见IAT了。

导入函数的数据结构和机制
上面的机制看起来似乎是非常简单,就是维护了一张保存了函数的表,但仔细想想就会发现事情不那么容易,还有一堆需要解决的问题:程序加载器是怎么按照顺序将函数的真实地址填进去的呢?函数地址又是怎么和函数名称一一对应的呢?函数的地址又是通过什么找到的呢?
显然单纯的一张表解决不了这么多的问题,微软是怎么做的呢?笔者做了张整体的数据结构图,先从整体上来认识一下,之后我们在仔细说说每一部分

我们上面提到的IAT虽然在调试中里面的内容已经变成了函数的地址,叫做函数地址表,而实际上在程序未加载前它和INT是“双胞胎”,一模一样,都指向了另外一个数据结构。
INT叫做导入函数名表(import name table),顾名思义,它指向的是就是函数的“名字”,只不过这名字可不单单只有malloc这么简单,它包含了函数名的字符串和函数名的号码(hint),字符串好理解,而hint其实就是一个标志,通过hint就可以在指定的dll中找到这个函数了(后面提到导出表的时候还会再用)。

[1] [2] [3] [4] [5]  下一页

【声明】:黑吧安全网(http://www.ylxj.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载