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

Windows调试艺术¡ª¡ª导入函数和导出函数

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

windows调试艺术主要是记录我自己学习的windows知识£¬并希望尽可能将这些东西在某些?#23548;?#26041;面体现出来¡£
所谓导入函数在很多人眼中是个非常简单的概念£¬无非就是把人家写好的函数拿过来用罢了£¬但?#23548;ÊÉ希?#23548;入一个函数是基于复杂的数据结构和加载机制的£¬不管是加壳脱壳还是病毒分析都离不开它£¬这篇文章主要是理顺整个pe文件导入函数相关的数据结构和导入过程£¬最后再结合windbg的调试尝试仿照病毒的编写实现我们自己的导入机制¡£
阅读本篇前建议先阅读以下两篇学习前置知识
Windows调试艺术——利用LBR?#32610;Òdll基址
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亿 买彩票心态 买彩票就买大乐透开奖结果 哪个平台买彩票安全吗 买彩票有买一个号的吗 怎么看走势图买彩票 如何在电脑上买彩票 美国几岁可以买彩票? 福彩工作人员买彩票 彩客网买彩票 能在微信上买彩票吗 怎么买彩票容易中