对类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弹窗的更多相关文章

  1. 如何在RCP程序中添加一个banner栏

    前言:这段时间还算比较空闲,我准备把过去做过的有些形形色色,甚至有些奇怪的研究总结一下,也许刚好有人用的着也不一定,不枉为之抓耳挠腮的时光和浪费的电力.以前有个客户提出要在RCP程序中添加一个bann ...

  2. 向PE文件中添加一个Section

    背景 之前说过直接向类HelloWorld.exe的可执行文件添加一个MessageBox弹窗, 但有时候, 需要添加的内容太多了, 因为数据与代码一起插入, 以至于可执行文件本身没有足够的空闲空间存 ...

  3. Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作

    Entity Framework 的小实例:在项目中添加一个实体类,并做插入操作 1>. 创建一个控制台程序2>. 添加一个 ADO.NET实体数据模型,选择对应的数据库与表(Studen ...

  4. 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 ...

  5. 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. ...

  6. 【MFC - 菜单】在对话框程序中添加菜单栏(CMenu)(转)

    原文转自 http://lishiqiang1988.blog.163.com/blog/static/41147912201382104631547/ VS2010的MFC对话框程序中添加菜单栏的过 ...

  7. 如何在VS2010的VC++ 基于对话框的MFC程序中添加菜单

    方法1:亲测 成功  转载自https://social.msdn.microsoft.com/Forums/vstudio/zh-CN/48338f6b-e5d9-4c0c-8b17-05ca3ef ...

  8. 除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛

    MainWindow::MainWindow(QWidget *parent) :   QMainWindow(parent)   {   pThreadCon = new CSerialThread ...

  9. Day_09【常用API】扩展案例1_程序中使用一个长度为3的对象数组,存储用户的登录名和密码……

    需求说明:实现用户注册.登陆功能: 1.程序中使用一个长度为3的**对象数组**,存储用户的登录名和密码: 例如如下格式: 登录名 密码 生日 爱好 zhangsan 1111 1998-03-15 ...

随机推荐

  1. 非常有利于seo的主题(红黄蓝绿)通用教程

    这篇教程是帮助刚使用Wordpres的朋友们的,免得自己弄得一头雾水.大江网络来教大家了解下如何设置自定义导航菜单. 一.首先进入后台,点击“外观”,选择“菜单”按钮,如下图: 然后看到右边界面中菜单 ...

  2. 判断一个js对象,是否具有某个属性

    一个对象,想必我们关注的最多的应该是它上面的属性有哪些吧.那么,怎么判断一个对象是否具有某个属性呢? /*下面是一个对比,看看在判断是否包括一个键上面,Object结构和Set结构的写法不同.*/ / ...

  3. const和violate

    const修饰变量 C语言中,const修饰的变量是只读的,本质还是变量,修饰的变量也会在内存中占用空间(这不废话么)本质上const只对编译器有用,在运行时无用.const和类型顺序无要求,一般类型 ...

  4. Git学习资料整理

    Git作为一个优秀的版本控制系统,是我们开发人员必须要学会使用的一个工具,接触git一年多以来,也看了不少相关资料,今天把我所看过的一些学习资源整理一下. Git入门当然首推廖雪峰廖老师的教程:Git ...

  5. 当多个客户请求一个servlet时,引擎为每个客户启动一个线程,那么servlet类的成员变量被所有的线程共享?

    因为servlet的实现是单例,多线程也就是说,N个客户端请求同一个servlet,他们所请求的是同一个对象,成员变量是属于这个对象的,因此成员变量也被共享了因此在servlet编程中,无状态的ser ...

  6. ASIHTTPRequest 详解 例子

    目录 目录 发起一个同步请求 创建一个异步请求 队列请求 请求队列上下文 ASINetworkQueues, 它的delegate提供更为丰富的功能 取消异步请求 安全的内存回收建议 向服务器端上传数 ...

  7. BitmapFactory.decodeByteArray() 返回null,分析与解决

    问题描述:用android自带的Camera获取图片,上传至远程数据库中(mysql),以BLOB格式存储, 但在提取图片时,始终无法在android界面显示,示例代码如下: .....  .... ...

  8. [Javascript] Add a browser build to an npm module

    In this lesson, we're going to use webpack to create a UMD (Universal Module Definition) build of ou ...

  9. android在广播接收器BroadcastReceiver里面再进行发送广播,造成当前广播接收器不断循环执行问题

    最近在公司处理项目时,用到锁屏状态弹出activity进行提示,类似QQ消息弹屏提示的功能.当中用到了,假如该弹出activity已经位于锁屏界面外时,将不进行再次弹窗,而是发送广播进行通知数据更新, ...

  10. jboss学习 - vfs---转载

    jboss的VFS是为了解决什么问题,他为什么有用呢 在jboss中有很多类似的资源操作的代码都分散在程序的各个地方,大多数情况下代码首先确定操作的资源的类型,比如是文件或者是文件夹,通过URL加载的 ...