对类HelloWorld程序中添加一个MessageBox弹窗
对类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
再保存就好了
之后运行测试一下,原始的:
修改后的:
http://www.cnblogs.com/dilex/p/5049762.html
对类HelloWorld程序中添加一个MessageBox弹窗的更多相关文章
- 如何在RCP程序中添加一个banner栏
前言:这段时间还算比较空闲,我准备把过去做过的有些形形色色,甚至有些奇怪的研究总结一下,也许刚好有人用的着也不一定,不枉为之抓耳挠腮的时光和浪费的电力.以前有个客户提出要在RCP程序中添加一个bann ...
- 向PE文件中添加一个Section
背景 之前说过直接向类HelloWorld.exe的可执行文件添加一个MessageBox弹窗, 但有时候, 需要添加的内容太多了, 因为数据与代码一起插入, 以至于可执行文件本身没有足够的空闲空间存 ...
- Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作
Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...
- 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】
Adding a controller to a ASP.NET Core MVC app with Visual Studio 在asp.net core mvc 中添加一个控制器 2017-2-2 ...
- 008.Adding a model to an ASP.NET Core MVC app --【在 asp.net core mvc 中添加一个model (模型)】
Adding a model to an ASP.NET Core MVC app在 asp.net core mvc 中添加一个model (模型)2017-3-30 8 分钟阅读时长 本文内容1. ...
- 【MFC - 菜单】在对话框程序中添加菜单栏(CMenu)(转)
原文转自 http://lishiqiang1988.blog.163.com/blog/static/41147912201382104631547/ VS2010的MFC对话框程序中添加菜单栏的过 ...
- 如何在VS2010的VC++ 基于对话框的MFC程序中添加菜单
方法1:亲测 成功 转载自https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/48338f6b-e5d9-4c0c-8b17-05ca3ef ...
- 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { pThreadCon = new CSerialThread ...
- Day_09【常用API】扩展案例1_程序中使用一个长度为3的对象数组,存储用户的登录名和密码……
需求说明:实现用户注册.登陆功能: 1.程序中使用一个长度为3的**对象数组**,存储用户的登录名和密码: 例如如下格式: 登录名 密码 生日 爱好 zhangsan 1111 1998-03-15 ...
随机推荐
- HDU3631:Shortest Path(Floyd)
Problem Description When YY was a boy and LMY was a girl, they trained for NOI (National Olympiad in ...
- 经典C面试题
12个有趣的C语言面试题 面试题C 摘要:12个C语言面试题,涉及指针.进程.运算.结构体.函数.内存,看看你能做出几个! 1.gets()函数 问:请找出以下代码里的问题: #include< ...
- soundPool和audiofocus
audiofocus试验: 使用soundPool来写一个播放音频的porject. 资源初始化: setContentView(R.layout.activity_main); Button bt1 ...
- 27个Jupyter快捷键、技巧(原英文版)
本文是转发自:https://www.dataquest.io/blog/jupyter-notebook-tips-tricks-shortcuts/ 的一篇文章,先记录在此,等有空时我会翻译成中文 ...
- web页面缓存技术之Local Storage
业务:检测页面文本框的值是否有改变,有的话存入缓存,并存储到数据库,这样用户异常操作后再用浏览器打开网页,就可避免重新填写数据 数据库表:Test,包含字段:PageName,PageValue BL ...
- JNI 详细使用步骤 上手示例
1.定义本地native方法 定义本地方法,通常情况下,应单独定义一个类来封装所有native方法 /** 存放native方法的类 */ public class MyNativeMethods { ...
- 组合控件 圆环 ring
使用 可以设置内部填充样式及大小 可以设置边框颜色及宽度 这里只是介绍了其中一种实现方式,其实这种类型的东西完全可以用自定义View去实现,他就是一个空中的大圆+一个空中或实心的小圆,实现起来也是非常 ...
- poj 3349 (最小表示法)
开始按hash做的 交上去就wa 但是和标称拍了半天也没有不一样的 可能是生成的数据太水了吧... #include<iostream> #include<cstdio> #i ...
- C#判断网站运行状态是否正常
我使用的是控制台应用程序来监控网站的运行状态,通过判断网站请求头(HEAD)来判断是否运行正常 下面列出几种常见的网站状态码 StatusCode 数字表示 OK 200. OK 指示请求成功,且请求 ...
- PLSQL编程基础
一 PL/SQL简介 1 SQL:结构化的查询语句 2 PL/SQL优点与特性: 提高运行效率==>>提高运行效率的其他方式(存储过程,分页,缓存,索引) 模块化设计 允许定义标识符(变量 ...