文章目录

  • 前奏
  • 找call
  • CreateFileMapping
  • 函数功能
  • 函数声明
  • 第一个参数:
  • 第二个参数:
  • 第三个参数:
  • 第四个参数:
  • 第五个参数:
  • 第六个参数:
  • 返回值
  • MapViewOfFile
  • 函数功能
  • 函数声明
  • 第一个参数
  • 第二个参数
  • 第三个参数
  • 第四个参数
  • 第五个参数
  • 返回值

前奏

这里需要用到的是Mapped Memory,这个内存利用CreateFileMapping函数申请的。利用VirtualAlloc/VirtualAllocEx申请的内存时Private Memory。Mapped Memory(映射内存)最大的好处也就是进程之间可以共享物理页

找call

这里涉及到找call,

实际情况中可以用OD找函数地址,这里我用的是VS(而且还得把编译器的ASLR技术关掉,系统的ASLR技术也得关掉)

attack函数地址:

defend函数地址:


sitdown函数地址:

CreateFileMapping

函数功能

为指定文件创建或打开命名或未命名文件映射对象(也就是如何设置共享内存)

函数声明

HANDLE CreateFileMappingW(HANDLE                hFile,LPSECURITY_ATTRIBUTES lpFileMappingAttributes,DWORD                 flProtect,DWORD                 dwMaximumSizeHigh,DWORD                 dwMaximumSizeLow,LPCWSTR               lpName
);

第一个参数:

从中创建文件映射对象的文件句柄,也就是把这个文件映射在物理内存中,可以填NULL。
必须使用与flProtect参数指定的保护标志兼容的访问权限来打开文件 。这不是必需的,但是建议您打开要映射的文件以进行独占访问。有

如果hFile为INVALID_HANDLE_VALUE,则调用过程还必须在dwMaximumSizeHigh和 dwMaximumSizeLow参数中指定文件映射对象的大小。在这种情况下, CreateFileMapping创建指定大小的文件映射对象,该文件映射对象由系统页面文件而不是文件系统中的文件支持

第二个参数:

指向SECURITY_ATTRIBUTES 结构的指针,该结构确定子进程是否可以继承返回的句柄。SECURITY_ATTRIBUTES结构的 lpSecurityDescriptor成员 为新文件映射对象指定安全描述符。

如果lpAttributes为NULL,则不能继承该句柄,并且文件映射对象将获取默认的安全描述符。文件映射对象的默认安全描述符中的访问控制列表(ACL)来自创建者的主要或模拟令牌

第三个参数:

指定文件映射对象的页面保护。对象的所有映射视图都必须与此保护兼容

第四个参数:

文件映射对象最大大小的高32位

第五个参数:

文件映射对象最大大小的低32位,
如果此参数和dwMaximumSizeHigh为0(零),则文件映射对象的最大大小等于hFile标识的文件的当前大小 。
尝试映射长度为0(零)的文件失败,错误代码为 ERROR_FILE_INVALID。应用程序应测试长度为0(零)的文件,并拒绝这些文件

第六个参数:

文件映射对象的名称。

如果此参数与现有映射对象的名称匹配,则该函数使用flProtect指定的保护来请求访问该对象。(这个参数就是设置共享内存的关键点)

如果此参数为NULL,则创建的文件映射对象不带名称。

返回值

如果该函数成功,则返回值是新创建的文件映射对象的句柄。

如果对象在函数调用之前存在,则该函数将返回现有对象的句柄(具有其当前大小,而不是指定的大小),并且GetLastError返回ERROR_ALREADY_EXISTS。

如果函数失败,则返回值为NULL。

这个函数结束后,也就相当于在物理内存中开辟了一段空间,然后需要用函数MapViewOfFile和线性虚拟地址进行关联,然后才能使用

MapViewOfFile

函数功能

将文件映射的视图映射到调用进程的地址空间

函数声明

LPVOID MapViewOfFile(HANDLE hFileMappingObject,DWORD  dwDesiredAccess,DWORD  dwFileOffsetHigh,DWORD  dwFileOffsetLow,SIZE_T dwNumberOfBytesToMap
);

第一个参数

文件映射对象的句柄。该 的CreateFileMapping和 OpenFileMapping函数返回该句柄。

第二个参数

对文件映射对象的访问类型,它确定页面的页面保护。该参数可以是以下值之一,也可以是多个值的按位“或”组合(这个是在虚拟线性地址的访问权限。这个权限不能比物理内存地址权限高,它俩是映射关系,前因后果,后者权限不可能比前者高)。物理内存中的很多空间都是映射到虚拟线性地址共享的,然后它们又有各自不同的权限。

举个例子:系统dll只加载一份,然后需要时直接映射给虚拟线性地址即可。然后各自权限都不同,互不影响。

第三个参数

视图开始处的文件偏移量的高32位。

第四个参数

视图开始处的文件偏移量的低32位。高偏移量和低偏移量的组合必须在文件映射中指定偏移量。它们还必须匹配系统的内存分配粒度。即,偏移量必须是分配粒度的倍数。要获取系统的内存分配粒度,请使用 GetSystemInfo函数,该函数将填充SYSTEM_INFO结构的成员。

第五个参数

映射到视图的文件映射的字节数。所有字节必须在CreateFileMapping指定的最大大小内。如果此参数为0(零),则映射将从指定的偏移量扩展到文件映射的末尾

返回值

如果函数成功,则返回值是映射视图的起始地址。

如果函数失败,则返回值为NULL。要获取扩展的错误信息,请调用GetLastError。

DLL代码cpp

#include "pch.h"
#define _MAP_ "共享内存"
#include<Windows.h>
#include <cstdio>
#define __ATTACK__   0x00411880
#define __DEFEND__   0x004118E0
#define __SITDOWN__   0x00411A90
HMODULE g_hModule;void thread() {int dword=0;HANDLE handle=OpenFileMapping(FILE_MAP_ALL_ACCESS, FALSE, _MAP_);LPTSTR  lpBuff=(LPTSTR)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0,BUFSIZ);for (;;) {if(lpBuff!=NULL)CopyMemory(&dword, lpBuff, 4);if (dword == 1) {__asm {mov eax, __DEFEND__call eax}dword = 0;CopyMemory(lpBuff, &dword, 4);}if (dword == 2) {__asm {mov eax, __SITDOWN__call eax}dword = 0;CopyMemory(lpBuff, &dword, 4);}if (dword == 3) {__asm {mov eax, __ATTACK__call eax}dword = 0;CopyMemory(lpBuff, &dword, 4);}if (dword == 4) {FreeLibraryAndExitThread(g_hModule, 0);}Sleep(500);}return ;
}
BOOL APIENTRY DllMain( HMODULE hModule,DWORD  ul_reason_for_call,LPVOID lpReserved)
{switch (ul_reason_for_call){case DLL_PROCESS_ATTACH:g_hModule = hModule;CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)thread, NULL, 0, NULL);break;case DLL_THREAD_ATTACH:case DLL_THREAD_DETACH:case DLL_PROCESS_DETACH:break;}return TRUE;
}

载体:

#include <iostream>
#include<Windows.h>
#define _MAP_ "共享内存"
LPTSTR IpBuff;
void inject(const char* name) {HANDLE handle = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 256);int length = strlen(name) + 1;LPVOID ipAllocAddr = VirtualAllocEx(handle, NULL, length, MEM_COMMIT, PAGE_READWRITE);WriteProcessMemory(handle, ipAllocAddr, name, length, NULL);HMODULE hMoudule = GetModuleHandle("Kernel32.dll");DWORD  dwLoadr = (DWORD)GetProcAddress(hMoudule, "LoadLibraryA");CreateRemoteThread(handle, NULL, 0, (LPTHREAD_START_ROUTINE)dwLoadr, ipAllocAddr, 0, NULL);}
void init() {HANDLE handle=CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, 0x1000, _MAP_);IpBuff = (LPTSTR)MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, BUFSIZ);
}void add() {for (int i = 0; i < 15; i++){printf("add%d\n", i);}
}int main()
{init();inject("G:\\windows核心编程\\inject2\\Debug\\inject2.dll");DWORD list[10];list[0] = 1;list[1] = 2;list[2] = 3;list[3] = 3;list[4] = 2;list[5] = 1;list[6] = 1;list[7] = 2;list[8] = 3;list[9] = 4;for (int i = 0; i < 10; i++) {int code = list[i];CopyMemory(IpBuff, &code, 4);Sleep(2000);}getchar();
}

被注入的程序:

 void attack() {printf("攻击了……………………\n");}void defend() {printf("防御了……………………\n");}void sitdown() {printf("坐下了……………………\n");}int main()
{char a=NULL;while (1) {a=getchar();if (a == 'a') {attack();}else if (a == 'b') {defend();}else if (a == 'c') {sitdown();}}
}

最后利用UnmapViewOfFile把物理页和虚拟线性地址之间关系去掉。它们之间的映射关系没了,但是它的物理页还是存在的。所以还需要用 CloseHandle(物理页是内核对象),把内核对象计数器减1.
内核对象如下:

两个小程序利用注入如何进行简单交互相关推荐

  1. 小程序全局注入-gio原理简单分析

    1.简单看了一下gio源码,通过定义App和Page两个方法,将小程序运行时的App()和Page()作为调用,然后对App和Page中的对应的事件方法进行注入自己的代码实现埋点 核心代码 Page ...

  2. 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)

    小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...

  3. 微信小程序利用echarts实现中国任意行政区域地图

    微信小程序利用echarts实现中国任意行政区域地图 前言 实现 克隆代码 集成 点击事件 点击跳转 代码改造 尾巴 前言 最近微信小程序中需要绘制地图,然后点击地图可以跳转到下一层级.研究了一番,选 ...

  4. python画图代码-Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...

  5. 用python画图代码-Python实战小程序利用matplotlib模块画图代码分享

    Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...

  6. 微信小程序利用腾讯云IM发送语音 + 图片

    微信小程序利用腾讯云IM发送语音 + 图片 能做到这里 说明你已经可以发送普通文本了 如果没有的话可以看一下我的上一篇文章 有完整的讲解 效果图 语音聊天 发送图片 传送 → 发送图片 发送语音 ** ...

  7. html5绘制图形幸运大转盘,微信小程序利用canvas 绘制幸运大转盘功能

    小程序对 canvas api 跟h5的不太一致 ,所以这个搞的比较久,不多说,先贴代码 Page({ /** * 页面的初始数据 */ data: { awardsConfig: {}, resta ...

  8. 小程序利用canvas实现波浪动态图,原生canvas的部分限制

    小程序利用canvas实现波浪动态图 小程序的canvas与该动态图的问题 首先上效果图片 下面直接上代码 小程序的canvas与该动态图的问题 小程序的canvas与html的canvas实现是完全 ...

  9. 微信小程序利用swiper+scroll-view实现Tab切换

    微信小程序利用swiper+scroll-view实现Tab切换 先放一张效果图 需要实现的功能逻辑: 1.当用户点击tab的时候,tab样式发生改变,并且下方对应的展示内容也发生改变. 2.当用户滑 ...

最新文章

  1. Java注解---通俗易懂
  2. 推荐10个windows软件,让你的办公更高效
  3. 一起谈.NET技术,Visual Studio 2010 中的代码约定设置
  4. JAX-WS使用Handler实现简单的WebService权限验证
  5. Linux下GCC生成和使用静态库和动态库详解(二)
  6. 剑指offer刷题 04. 二维数组中的查找
  7. python bytes转int_Python学习进阶教程(11)—数值类型
  8. 自编基于jQuery实现分页插件
  9. Android 中文API (37) —— AbsoluteLayout
  10. 谷歌硬盘 idm_为什么Google搜索结果比本地硬盘查询要快?
  11. C语言学习:原子操作
  12. react 工程启动运行时,报错Content not from webpack is served from ...
  13. 数字逻辑练习题(四)用卡诺图化简下面的函数为最简“与-或”式
  14. Java 8 stream的使用示例
  15. linux红帽子认证费用RHCT,关于RHCE和RHCT认证
  16. 开口式霍尔电流传感器AHKC在直流配电改造的应用
  17. cuda 和 pytorch 安装
  18. 多个微信账号同时登录怎么操作
  19. 2019.5.输入正整数n,再输入n个数,计算并输出这n个数之和。要求:本题必须使用递归完成,整个程序不允许使用循环。例如3 2 3 4,输出7
  20. 基于HTML5的年货购物网站前端网页设计

热门文章

  1. python pil保存图片_python爬取百度图片并保存到本地
  2. Py之GUI之PyQt:PyQt5的简介、入门、安装(QtCreator和QtDesigner)图文教程之详细攻略
  3. Crawler之Scrapy:数据挖掘必备的scrapy框架之最完整爬取网页内容攻略
  4. Deap : 遗传算法算法解决 背包问题
  5. javascript闭包学习
  6. Windows Defender还原误删文件
  7. Leetcode 92.反转链表
  8. 自定event事件之手动触发(一)
  9. CentOs下搭建GitLab
  10. 安卓8.1 字体 ——现在6.0,7.0,8.0都可以体验