对类HelloWorld程序中添加一个MessageBox弹窗
2015-12-15 22:30
288 查看
对类HelloWorld程序中添加一个MessageBox弹窗
分析:
任一程序运行的时候都会加载kernel32.dll的,但MessageBoxA()这个API却是在user32.dll中的。所以在HelloWorld.exe中是没办法直接添加MessageBoxA()的调用。不过好在有kernel32.dll,其中有两个API可以解决user32.dll没加载的问题,分别是LoadLibraryA(filename)和GetProcAddress(hModule, 函数名)。
操作:
清除基址重定位表
先用PE View这个工具查看一下HelloWorld.exe是否用基址重定位表。若有,就用WinHex工具把IMAGE_OPTIONAL_HEADER中的BASE RELOCATION Table清空为0。(这样是为了避免我们硬编进去的代码变得不可用,具体原因看关于基址重定位表的内容)记录ImageBase的值
用PE View就可以在IMAGE_OPTIONAL_HEADER中看到的一般ImageBase的值都为00400000。
API的导入地址(IMPORT Table)
首先查到IMAGE_OPTIONAL_HEADER的DataDirectories数组中的Import Table的RVA值为 000064BC此RVA值代表的是Import Table相关的数据在文件中相对于文件头的偏移量:
这时要注意一下Import Address Table RAV这个数据的值,因为这个值会告诉我们,从kernel32.dll中导入的API列表在文件中的位置。在这个程序里的值,其值为00006000。
去到文件的偏移量00006000上看到了是个函数列表,暂时这个程序只有需要用的kernel32中的函数。
注意看Data列表的值,其实它也是RVA值来,指向的是文件中当前项所代理的函数名字符串。现在不妨看看文件偏移量00006594上的内容:
当PE文件加载到了内存,Data中的值就会被替换成真实的API起始地址的。但现在要做的是我们会知道这个列表会加载内存的哪个位置呢?首先需要看看这个列表是在哪个节区中?在这个程序中,它是在.rdata节区中。
所以我们需要看看节区.rdata的节区头信息。
记录下其中的RVA为00006000,根据公式:
虚拟地址(内存中) = ImageBase + RVA
得出这个节区会加载到00406000上,用OllDbg查看一下
``````````这时我们去一下761929AC上,应该会看到这是API GetCommandLineA() 的指向,在这里又跳转了一次
但我们操作的时候不理会这样,只要记下00406000这个地址就行,具体操作如下:
CALL DWORD PTR DS:[00406000]
只要把00406000换成对应的LoadLibraryA之类的地址就好。
LoadLibraryA:00406080
GetProcAddress:0040607C
到这里,准备工作已经做了。
输入下面的代码:
需要记录一下00405923这个值,稍候修改PE头信息的作为新的入口点( AddressOfEntryPoint )
另外要注意红框的代码
JMP 00401041
这个是用来跳转回程序原本的入口点的,可以事先用PE编辑器查看一下,并且记下:
也是用这个工具,把入口点改成我们的新的入口点:00405923
再保存就好了
之后运行测试一下,原始的:
修改后的:
来自为知笔记(Wiz)
相关文章推荐
- 《掌握需求过程》阅读笔记一
- HTML总结I
- Node.js入门第二讲
- 语言模型srilm(二) prune剪枝
- 安装 MySQLdb 出现 Python version 2.7 required, which was not found in the registry
- 随笔
- iOS 蓝牙的GameKit用法
- Android 动态添加线性布局(.java文件内) 实现控件按比例分割空间
- Android四大组件之ConentProvider.
- [jQueryUI] - Chosen:select下拉选择框美化插件及问题
- 中文分词之左右完整性及稳定性
- 64位机器上安装和使用JMF
- 使用Chrome来调试你的Android App
- 散列表的插入和删除
- 《IOS多线程基础》
- Kmeans算法学习与SparkMlLib Kmeans算法尝试
- Android Studio之build.gradle小技巧
- DSP-C6416-录音混音算法工程
- OPENCV直方图均衡化
- java的System.getProperties属性