PE结构->【输入表】Import【上】
来源:互联网 发布:ps软件在线升级 编辑:程序博客网 时间:2024/06/07 14:16
使用工具:PEinfo.exe, hello.exe,UE
输入函数
在代码分析或编程中经常遇到“输入函数(Import Functions,也称导入函数)”的概念。
这里我们就来解释下,输入函数就是被程序调用但其执行代码又不在程序中的函数,这些函数的代码位于相关的DLL 文件中,在调用者程序中只保留相关的函数信息(如函数名、DLL 文件名等)就可以。
以上是咱这次实验的小青蛙哈~灰常简单的一个小程序,如图双击程序只显示一个对话窗口,然后就结束~试验用小程序,我们尽量的将内部的结构删减,调试起来才方便些。
我们这次体验的目的就是想靠所学的知识,试图来找到MessageBox 在内存中的地址。
注:MessageBox 是来自于USER32.DLL 动态链接库里的一个函数,我们通过对PE 文件的静态反编译分析来观察hello.exe 这个试验品是如何定位和调用MessageBox 这个在“异乡”的函数哈。
(MessageBox 有两个版本,一个是MessageBoxA 还有一个是MessageBoxW 分别带便ASCII码形式和UNICODE~历史故事了~)
体验开始:
1. 我们用曾经号称为屠龙刀的W32DAM 对hello.exe进行反编译,如图:
我们可以看到这个程序只有两个导入模块(Import Module),分别导入来自两个动态链接库(USER32.DLL和KERNEL32.DLL)的若干函数。
我们还清晰可见,咱要跟踪的MessageBoxA 就在USER32.DLL 中,这里程序还自动给我们定位了它的虚拟地址:2A2DC,但我们不要用这个。
我们通过W32DASM 的查找功能找出MessageBox 这个函数代码的位置,并试图查看他的汇编跳转~
各位看官看到了吧?push xxxx push xxxx push xxxx push xxxx 之后再来一个Call xxxx ……
没错,这就是调用函数的一个标准形式。每个push 其实就是将所要调用的函数需要的参数入栈
int MessageBox( HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType // style of message box );
由定义可见MessageBox 函数共有四个参数,因此我们四次push xxxx 分别将参数按照STDCALL 的方式入栈之后,就可以CALL MessageBox 这个函数了。
好,既然是CALL 我们的目标函数了,通过反汇编我们就可以观察到它的地址是:[0042A2AC],难道就这么简单?
那我们就直接把程序往下拉,试图找找这个 42A2AC 的地址吧~
可是…… ……
我们悲剧的发觉,程序压根还没到 42A2AC 这地方,到了421FF8 就结束了!!什么情况呢?
没错,这是一个VA 哈
需要根据VA换算成实际地址,42A2AC 落在了 .idata区块中,请看下图:
我们看到,咱的42A2AC 地址加载咱的2A000 和 2B000 之间(改程序VC编写,映像基地址为400000打头哦~),因此我们可以将该地址定位到改程序位于.idata 区块内。
该区块的VA 起始地址为42A000,因此42A2AC – 42A000 = 2AC,raw data offs 跟我们说该区块的物理地址是28000,因此42A2AC 这个VA 所对应的物理偏移地址就是 28000 + (2A2AC-2A000 )= 282AC。
咱用UE 打开看下282AC 这偏移地址上有啥东西……
282AC 这个地址上存放着 DCA20200 这个数据,翻译成ASCII 码也是莫名其妙的说~
但我们把DCA20200 当成一个DWORD 类型的数据来读的话我们得到数据 0002A2DC(还记得大端与小端吧)
慢着,是不是很熟悉,又是2A****开头,跟咱之前的地址是不是差不多?
那好,我们又按照刚才的方法转化为偏移地址试试,转化后得到的偏移地址是:282DC,【计算方式:28000+(2a2dc-2a000)=282DC】,咱再看看282DC 里边有啥神秘的东西吧?
哈哈,看到奇迹了吗?从282DC 地址读起,ASCII 码对应的值是MessageBoxA.USER32.dll
但根本问题我们还是没能解决:MessageBox 的地址是?其实在这里我们还不能帮大家解决这个问题,因为我们缺乏对输入表的深入理解。
所以我们期待吧,下节课将揭开输入表的神秘面纱……
- PE结构->【输入表】Import【上】
- PE结构->【输入表】Import【下】
- 认识Import表-PE输入表说明
- PE文件结构(三) 输入表
- 认识PE中的IMPort表
- 输入表在PE中的结构及加载过程
- PE文件结构(二)-输入表实例分析
- PE格式详解 输入表信息 (上)
- PE文件结构详解-PE导入表
- PE文件结构详解--PE导出表
- PE格式之输入表
- PE结构导出表详解
- PE结构->【导出表】Export
- PE import function
- PE IMPORT TABLE
- PE文件结构 - 导入表结构
- PE文件结构部分解析以及输入的定位
- PE结构
- CentOS 7 修改默认字符集
- ack机制之代码实现,实现BaseRichBolt的方式,使用BaseBasicBolt的方式实现BaseRichBolt发ack和fail的功能
- Valgrind使用说明
- Crosswalk 集成到 Android Studio
- @RequestMapping 用法详解之地址映射(转)
- PE结构->【输入表】Import【上】
- 彻底弄懂 Http 缓存机制
- 017华为开发者大赛正式开赛,助力开发者商业成功
- iOS之Modal情况下使用WebView使用系统相册
- 第六课,线性表的相关操作
- 利用html表单创建网易邮箱注册登陆界面
- cocos compile 时提示ant 不是内部命令也不是外部命令
- Description &&debugDescription && runtime(debug模式下调试model)
- Swift项目中添加GPUImage