手机上怎么买彩票双色球 微信上有人推荐买彩票 能合买彩票的平台 夫妻买彩票狂中30亿 买彩票心态 买彩票就买大乐透开奖结果 哪个平台买彩票安全吗 买彩票有买一个号的吗 怎么看走势图买彩票 如何在电脑上买彩票 美国几岁可以买彩票? 福彩工作人员买彩票 彩客网买彩票 能在微信上买彩票吗 怎么买彩票容易中

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

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

windows调试艺术主要是记录我自己学习的windows知识,并希望尽可能将这些东西在某些?#23548;?#26041;面体现出来。
所谓导入函数在很多人眼中是个非常简单的概念,无非就是把人家写好的函数拿过来用罢了,但?#23548;噬希?#23548;入一个函数是基于复杂的数据结构和加载机制的,不管是加壳脱壳还是病毒分析都离不开它,这篇文章主要是理顺整个pe文件导入函数相关的数据结构和导入过程,最后再结合windbg的调试尝试仿照病毒的编写实现我们自己的导入机制。
阅读本篇前建议先阅读以下两篇学习前置知识
Windows调试艺术——利用LBR?#32610;襠ll基址
Windows调试艺术——?#31995;?#21644;反调试(?#24076;?br/> 导入和导出函数
简单实例
所谓导入函数?#23548;?#19978;就是我们将dll暴漏出来的导出函数拿过来为我们所用,当我们的程序加载到内存中后,其实并不能独立运行,因为我们有很多”窟窿”没有填?#24076;?#36825;些”窟窿”也就是我们调用的自己并没有?#23548;?#32534;写的、追根溯源?#23548;?#19978;来自dll的函数,哪怕你的程序什么也没有做,单单是显示个黑窗(cmd)就退出,那初始化黑窗和退出其实也是dll中的函数完成的。
可以想象,必然是有人在我们程序执行时帮我们填上了这些”窟窿”,让我们能够正常使用这些函数。其实这个人就是windows的pe加载器,它在我们程序启动时就将相应的dll也加载入了该程序所?#26434;?#30340;虚拟内存(注意,为了节约物理内存,如果有多个程序加载了同一个dll时,?#23548;?#19978;物理?#29616;?#26377;一份,但是相当于进入了不同程序的虚拟空间),然后将我们原来的函数地址替换成了真实的地址,我们可以通过一个真实的例子来看一下
程序很简单,就是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,我们再次跳转过去看看

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

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

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

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

【声明】:黑吧安全网(http://www.rliwo.live)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱[email protected],我们会在最短的时间内进?#20889;?#29702;。
  • 最新更新
    • 相关阅读
      • 本类?#35753;?/li>
        • 最近下载
        购买彩票权威网址
        手机上怎么买彩票双色球 微信上有人推荐买彩票 能合买彩票的平台 夫妻买彩票狂中30亿 买彩票心态 买彩票就买大乐透开奖结果 哪个平台买彩票安全吗 买彩票有买一个号的吗 怎么看走势图买彩票 如何在电脑上买彩票 美国几岁可以买彩票? 福彩工作人员买彩票 彩客网买彩票 能在微信上买彩票吗 怎么买彩票容易中
        拳皇命运插画 贵州十一选五历史开奖查询结果 北极特务注册 拳皇命运除了腾讯手游 76人凯尔特人 黄金大转轮彩金 中国竞彩网竞彩网首页 皇室战争攻略 热火vs凯尔特人 勒沃库森vs莱红牛