两个小程序利用注入如何进行简单交互
文章目录
- 前奏
- 找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.
内核对象如下:
两个小程序利用注入如何进行简单交互相关推荐
- 小程序全局注入-gio原理简单分析
1.简单看了一下gio源码,通过定义App和Page两个方法,将小程序运行时的App()和Page()作为调用,然后对App和Page中的对应的事件方法进行注入自己的代码实现埋点 核心代码 Page ...
- 小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像)
小程序利用canvas 绘制图案 (生成海报, 生成有特色的头像) 微信小程序生成特色头像,海报等是比较常见的.下面我来介绍下实现该类小程序的过程. 首先选择前端来通过 canvas 绘制.这样比较节 ...
- 微信小程序利用echarts实现中国任意行政区域地图
微信小程序利用echarts实现中国任意行政区域地图 前言 实现 克隆代码 集成 点击事件 点击跳转 代码改造 尾巴 前言 最近微信小程序中需要绘制地图,然后点击地图可以跳转到下一层级.研究了一番,选 ...
- python画图代码-Python实战小程序利用matplotlib模块画图代码分享
Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...
- 用python画图代码-Python实战小程序利用matplotlib模块画图代码分享
Python中的数据可视化 matplotlib 是python最著名的绘图库,它提供了一整套和matlab相似的命令API,十分适合交互式地进行制图.而且也可以方便地将它作为绘图控件. 实战小程序: ...
- 微信小程序利用腾讯云IM发送语音 + 图片
微信小程序利用腾讯云IM发送语音 + 图片 能做到这里 说明你已经可以发送普通文本了 如果没有的话可以看一下我的上一篇文章 有完整的讲解 效果图 语音聊天 发送图片 传送 → 发送图片 发送语音 ** ...
- html5绘制图形幸运大转盘,微信小程序利用canvas 绘制幸运大转盘功能
小程序对 canvas api 跟h5的不太一致 ,所以这个搞的比较久,不多说,先贴代码 Page({ /** * 页面的初始数据 */ data: { awardsConfig: {}, resta ...
- 小程序利用canvas实现波浪动态图,原生canvas的部分限制
小程序利用canvas实现波浪动态图 小程序的canvas与该动态图的问题 首先上效果图片 下面直接上代码 小程序的canvas与该动态图的问题 小程序的canvas与html的canvas实现是完全 ...
- 微信小程序利用swiper+scroll-view实现Tab切换
微信小程序利用swiper+scroll-view实现Tab切换 先放一张效果图 需要实现的功能逻辑: 1.当用户点击tab的时候,tab样式发生改变,并且下方对应的展示内容也发生改变. 2.当用户滑 ...
最新文章
- Java注解---通俗易懂
- 推荐10个windows软件,让你的办公更高效
- 一起谈.NET技术,Visual Studio 2010 中的代码约定设置
- JAX-WS使用Handler实现简单的WebService权限验证
- Linux下GCC生成和使用静态库和动态库详解(二)
- 剑指offer刷题 04. 二维数组中的查找
- python bytes转int_Python学习进阶教程(11)—数值类型
- 自编基于jQuery实现分页插件
- Android 中文API (37) —— AbsoluteLayout
- 谷歌硬盘 idm_为什么Google搜索结果比本地硬盘查询要快?
- C语言学习:原子操作
- react 工程启动运行时,报错Content not from webpack is served from ...
- 数字逻辑练习题(四)用卡诺图化简下面的函数为最简“与-或”式
- Java 8 stream的使用示例
- linux红帽子认证费用RHCT,关于RHCE和RHCT认证
- 开口式霍尔电流传感器AHKC在直流配电改造的应用
- cuda 和 pytorch 安装
- 多个微信账号同时登录怎么操作
- 2019.5.输入正整数n,再输入n个数,计算并输出这n个数之和。要求:本题必须使用递归完成,整个程序不允许使用循环。例如3 2 3 4,输出7
- 基于HTML5的年货购物网站前端网页设计
热门文章
- python pil保存图片_python爬取百度图片并保存到本地
- Py之GUI之PyQt:PyQt5的简介、入门、安装(QtCreator和QtDesigner)图文教程之详细攻略
- Crawler之Scrapy:数据挖掘必备的scrapy框架之最完整爬取网页内容攻略
- Deap : 遗传算法算法解决 背包问题
- javascript闭包学习
- Windows Defender还原误删文件
- Leetcode 92.反转链表
- 自定event事件之手动触发(一)
- CentOs下搭建GitLab
- 安卓8.1 字体 ——现在6.0,7.0,8.0都可以体验