任意程序添加ShellCode

  • 我先写了一个小程序Test.exe(注意:由于我用的是控制台程序没有导入user32.dll所以我用的直接添加ShellCode是不行的,要么在ShellCode中导入user32.dll要么在程序中Load一下,如果没有以下测试不成功)。
//Test.exe源代码#include <stdio.h>
#include <windows.h>

int main(int argc, char* argv[])
{
    LoadLibrary("kernel32.dll");
    LoadLibrary("user32.dll");
    MessageBox(NULL,"http://cnblogs/ONDragon","ONDragon",0);
    printf("Test\n");
    return 0;
}
  • 用UE打开,添加我们要添加的ShellCode(弹出另一个MessageBox)。
push 0x0        6A 00
push 0x0        6A 00
push 0x0        6A 00
push 0x0        6A 00
call 771BEA11   E8 XXXX
  • 解释 call 771BEA11 这个地址是我本机MessageBox的地址,连地址都不会找,那么先自己查查在学这个吧(还有后面的OEP查找什么的),有写小复杂对于新手。
  • E8 是Call的硬编码,6A 00 是 push 0x00 的硬编码。
  • 因为MessageBox需要4个参数,处于简单化,我们就给它push4个0,只是简单化。
  • 我们要做的就是在程序中添加这个硬编码指令,那么在哪里添加呢?我们大概学过PE结构了,我们只要找到一个节的空白位置添加即可。

  • 我们只要把上面的硬编码添加到程序中即可,但是也不是直接添加的,需要一个转换。
  • 要跳转的地址  =  E8下一条指令的地址 + XXXX。(E9同理,下面会遇到)!!!
  • XXXX  =  要跳转的地址   -  E8下一条指令的地址。(E9同理,下面会遇到)!!!
  • 比如我们要跳转的地址是MessageBox的地址771BEA11,我们不能直接写E8(call)771BEA11,需要上公式转换,要跳的地址就是(771BEA11) - E8的下一条指令的地址。
  • 例子:
  • 我们在文件偏移为5940的地址添加我们的ShellCode。
  • 6A 00  6A 00  6A 00  6A 00(注意大小端格式)
  • XXXX(就是将要填入E8 后面的值) = 771BEA11 - 0040594D(E8的下一条指令的地址)。
  • 还要注意,一定是减去 0040594D,是内存地址RVA不是文件偏移。

  • 但是程序运行起来不会自己跑到这个位置运行代码,所以要让程序自己打开时到这里运行代码,所以要修改OEP。

  • 这样程序就会跑到我们的ShellCode处执行我们的代码,但是,为了不让被发现程序被修改了,得让它执行完我们的代码后,再去正常执行自己的代码,所以我们还要跳回去正常的入口OEP。

  • 所以我们用E9(jmp 的硬编码)程序执行完我们的代码要无条件跳转到正常入口OEP,所以XXXX = 正常OEP - E9下一条指令的地址 = 401071 - 405952 = FFFFB71F。
  • 然后保存运行即可,会先弹出我们的ShellCode。OK。

  • 总结
  1. 注意不适合新手。
  2. 注意要仔细,要LoadLibrary("user32.dll");只针对控制台程序。
  3. 注意大小端格式。
  4. 注意E8(E9)后面地址的转换。
  5. 注意添加代码地址是(内存中的地址)RVA。
  6. 还是学学PE才行。
时间: 2024-10-27 17:59:54

任意程序添加ShellCode的相关文章

巧把任意程序添加到Win10控制面板(添加“系统配置”为例)

引用https://www.windows10.pro/add-msconfig-to-control-panel/ 首先,我们需要为待添加的程序编一个GUID(什么是GUID),其实就是一组字符串,如果你没自信编好,那么可以到Generate GUIDs online网站自动获取一个.如图: 例如MS酋长获取到的 GUID 为 8e8a1707-e6df-4460-a015-03b48e857856 .如果对当前GUID不满意,点击 Generate new GUID 按钮可继续生成新的GUI

将程序添加到右键菜单(以记事本、UltraEdit为例)

原文:将程序添加到右键菜单(以记事本.UltraEdit为例) 如何将程序加入右键菜单,这里分别以记事本.UltraEdit为例! 以记事本程序为例: 1. 在运行中输入regedit,打开注册表,找到HKEY_CLASSES_ROOT\*\shell分支,如果没有shell分支,则在*下点击右键,选择“新建-项”,建立shell分支. 2. 在shell下新建“用记事本打开”项,在右侧窗口的“默认”键值栏内输入“用记事本打开”.项的名称和键值可以任意,以含义明确为好.其中键值将显示在右键菜单中

debian中 将一个程序添加到favorite

debian中 将一个程序添加到favorite创建一个×.desktop文件,内容如下,然后保存到application文件夹下即可[Desktop Entry] Type=Application Name=Eclipse Comment=Eclipse Integrated Development Environment Icon=/opt/eclipse-4.2.1/icon.xpm Exec=/opt/eclipse-4.2.1/eclipse Terminal=false Catego

给go程序添加命令行参数

操作系统: CentOS 6.9_x64 go语言版本: 1.8.3 问题描述 需要应用程序根据不同的配置文件访问不同的服务器,希望程序启动时可以指定配置文件. 解决方案 package main import ( "os" "fmt" ) func main() { argsWithProg := os.Args if(len(argsWithProg) < 2) { fmt.Println("usage : ",argsWithProg

为WPF程序添加字体

很多时候我们开发的程序可能会在多个版本的Windows上运行,比如XP.Win7.Win8. 为了程序美观,现在很多公司会使用WPF作为程序的界面设计. 跨版本的操作的操作系统往往有一些字体上的问题,比如Win7和Win8有微软雅黑字体,而XP上没有(虽然微软已经明确不在维护XP,但往往还是有很多一部分使用者会使用相当长一段时间,比如医疗机构.企事业单位),还有的一种情况就是为了程序效果的需要而使用一些特殊的字体. WPF程序只要下面几个步骤就可以为程序自带字体,而不需要放到系统目录的Fonts

在Ubuntu的系统中如何将应用程序添加到开始菜单中

/*********************************************************************  * Author  : Samson  * Date    : 07/03/2014  * Test platform:  *              3.11.0.11-generic #19-Ubuntu  *              GNU bash, version 4.2.45  * ****************************

C# 为网络程序添加用户代理

如何为网络程序添加用户代理,本人推荐使用UrlMkSetSessionOption函数, 不过该函数有一个弱点不可以X64编译,X86编译软件才可以调用该函数 否则会一直返回!S_OK意义错误.第二呢 我建议大家在网上找找类似 http://www.proxy.com.ru/免费的代理的网站,代码上的代理是在网上找的 几日后你在使用我的代码则没有代理效果 因为代理服务器无效,所有后面 需要查阅方法的自己去找一个免费代理的服务器地址 不要说我没提醒. 我不建议大家在Wininet层使用Intern

linux如何给程序添加自启动

我要使我的服务程序在重启系统后也随之自动启动.启动我的服务用到了一个脚本.现在有两个方法: 法1: sudo vi /etc/init.d/rc.local在这里添加启动服务的脚本命令. 这个方法的优点是:此时尚未登录用户,启动服务用的是su.相当于sudo.权限无比大. 这个方法的缺陷是:这个时候用户尚未login,当然更没有指定用户主目录,因此假如我们的服务程序里有用到'~'作为路径的,那就废了,'~'表示'null'...ps:可以在/var/log/boot.log里看日志. 法2: s

c程序添加apue头文件

#include "apue.h" (c程序添加的头文件) 1. 超级用户权限登入 #cd /usr/include 2. 将apue.h和error.c两个文件copy到该目录下.(apue.h位于 your_apue_path/inlcude ; error.c位于your_apue_path/lib ) 以我的路径为例: #cp /root/apue.2e/inlcude/apue.h . #cp /root/apue.2e/lib/error.c . (实现apue.h中的出错