滴水逆向_程序实现弹窗修改OEP

news2025/3/17 11:28:35

作业:

几个很重要的注意事项。

1 我们模拟的是内核如何将一个文件硬盘中拉伸到内存中,但是我们做的仅仅是

模拟拉伸过程。也就是说其中的属性字段是无差别的拷贝的。

但是加载exe的时候 ,imagebase 是随机分配的。

我们打开内存中的exe, imagebase就很有可能发生变化。

所以我们需要文件到内存中,将属性字段更改。
    PFILEHEADER->Characteristics |= IMAGE_FILE_RELOCS_STRIPPED

在PE文件硬盘中属性 -> 固定动态基址的那个二进制位。

不用详细了解也可以,反正知道修改上面那个属性就可以了。

2 重新开机的时候 弹窗地址也是会发生变化,需要改。

#pragma once
#define _CRT_SECURE_NO_WARNINGS 
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stddef.h>
#include<Windows.h>

#define FILEPATH_IN "c:\\oep.exe"       //自己改路径

#define FILEPATH_OUT "c:\\newoep11111.exe"    //自己改路径


#define SHELLCODELENGTH 0X12

#define MESSAGEBOX 0X773fadc0              //每次开机需要重新设置


int READPEFILE_(char * filepath, char ** pfilebuffer );

int FILEBUFFERTOIMAGBBUFFER_(char * pfilebuffer , char ** imagebuffer );

int IMAGEBUFFERTONEWBUFFER_(char* imagebuffer, char** newbuffer);

int MESSAGEBOXIN_(char * pbuffer );
//展示PE信息
int PEIMFORMATION_(char* pfilebuffer);

int WRITEPEFILE_(char* pfilepath, char* pfilebuffer, int filesize);

int FREEBUFFER_(char* pfilebuffer);

#include"header.h"


char ShellCode[SHELLCODELENGTH] =
{
	0x6a,0x00,0x6a,0x00,0x6a,0x00,0x6a,0x00,
	0xe8,0x00 ,0x00,0x00,0x00,
	0xe9,0x00,0x00,0x00,0x00
};


int READPEFILE_(char* filepath, char ** pfilebuffer )
{
	FILE* PFILE = NULL;
	PFILE = fopen(filepath, "rb");
	if (!PFILE)
	{
		printf("读取失败\n");
		return 0;
	}
	fseek(PFILE , 0, SEEK_END );
	int FILESIZE = ftell(PFILE);
	fseek(PFILE, 0, SEEK_SET);
	char* PFILETEMPBUFFER = (char * )malloc(sizeof(char) * FILESIZE);
	if (!PFILETEMPBUFFER)
	{
		free(PFILETEMPBUFFER);
		PFILETEMPBUFFER = NULL;
		fclose(PFILE);
		return 0;
	}

	memset(PFILETEMPBUFFER, 0, sizeof(char) * FILESIZE    );

	size_t n = fread(PFILETEMPBUFFER, FILESIZE ,1 ,PFILE);

	if (!n  )
	{
		free(PFILETEMPBUFFER);
		PFILETEMPBUFFER = NULL;
		fclose(PFILE);
		return 0;
	}
	*pfilebuffer = PFILETEMPBUFFER;
	PFILETEMPBUFFER = NULL;
	fclose(PFILE);
	return FILESIZE;
}



int FILEBUFFERTOIMAGBBUFFER_(char* pfilebuffer, char** imagebuffer)
{

	if (!pfilebuffer)
	{
		MessageBox(0, TEXT("缓冲区不存在"), 0, 0);
		return 0;
	}
	if (*(short*)(pfilebuffer) != 0X5A4D)
	{

		MessageBox(0, TEXT("不是一个mz文件标志"), 0, 0);
		return 0;
	}
	PIMAGE_DOS_HEADER PDOSHEADER = (PIMAGE_DOS_HEADER)pfilebuffer;

	if (*(PDWORD)((char*)pfilebuffer + PDOSHEADER->e_lfanew) != IMAGE_NT_SIGNATURE)
	{
		MessageBox(0, TEXT("不是一个NT标记"), 0, 0);
		return 0;
	}
	PIMAGE_NT_HEADERS PNTHEADER = (PIMAGE_NT_HEADERS)((char*)pfilebuffer + PDOSHEADER->e_lfanew);

	PIMAGE_FILE_HEADER PFILEHEADER = (PIMAGE_FILE_HEADER)(((char*)PNTHEADER) + 0X4);

	PIMAGE_OPTIONAL_HEADER POPTIONHEADER = (PIMAGE_OPTIONAL_HEADER)((char*)PFILEHEADER + 0x14);

	PIMAGE_SECTION_HEADER PSECTIONHEADER = (PIMAGE_SECTION_HEADER)((char*)POPTIONHEADER + PFILEHEADER->SizeOfOptionalHeader);

   
    //固定动态基址
	PFILEHEADER->Characteristics |= IMAGE_FILE_RELOCS_STRIPPED;


	char* PIMAGETEMPBUFFER = malloc(sizeof(char) * POPTIONHEADER->SizeOfImage);
	if (!PIMAGETEMPBUFFER)
	{
		return 0;

	}
	memset(PIMAGETEMPBUFFER , 0, sizeof(char )* POPTIONHEADER->SizeOfImage);

	memcpy( (void *)PIMAGETEMPBUFFER , PDOSHEADER, POPTIONHEADER->SizeOfHeaders);

	PIMAGE_SECTION_HEADER PTEMPSECTION = (PIMAGE_SECTION_HEADER)PSECTIONHEADER;

	for (int i = 0; i < PFILEHEADER->NumberOfSections; i++)
	{
		memcpy
		(
			(void *) ( (char *)PIMAGETEMPBUFFER + PTEMPSECTION[i].VirtualAddress),

			(void * ) ((char *)PDOSHEADER + PTEMPSECTION[i].PointerToRawData),

			PTEMPSECTION[i].SizeOfRawData
		);
	}


	*imagebuffer = PIMAGETEMPBUFFER;
	PIMAGETEMPBUFFER = NULL;
	return POPTIONHEADER->SizeOfImage;
}






int IMAGEBUFFERTONEWBUFFER_(char* pimagebuffer, char** newbuffer)
{
	if (!pimagebuffer)
	{
		MessageBox(0, TEXT("缓冲区不存在"), 0, 0);
		return 0;
	}
	if (*(short*)(pimagebuffer) != 0X5A4D)
	{

		MessageBox(0, TEXT("不是一个mz文件标志"), 0, 0);
		return 0;
	}
	PIMAGE_DOS_HEADER PDOSHEADER = (PIMAGE_DOS_HEADER)pimagebuffer;

	if (*(PDWORD)((char*)pimagebuffer + PDOSHEADER->e_lfanew) != IMAGE_NT_SIGNATURE)
	{
		MessageBox(0, TEXT("不是一个NT标记"), 0, 0);
		return 0;
	}
	PIMAGE_NT_HEADERS PNTHEADER = (PIMAGE_NT_HEADERS)((char*)pimagebuffer + PDOSHEADER->e_lfanew);

	PIMAGE_FILE_HEADER PFILEHEADER = (PIMAGE_FILE_HEADER)(((char*)PNTHEADER) + 0X4);

	PIMAGE_OPTIONAL_HEADER POPTIONHEADER = (PIMAGE_OPTIONAL_HEADER)((char*)PFILEHEADER + 0x14);

	PIMAGE_SECTION_HEADER PSECTIONHEADER = (PIMAGE_SECTION_HEADER)((char*)POPTIONHEADER + PFILEHEADER->SizeOfOptionalHeader);


	char* PTEMPNEWBUFFER = malloc(sizeof(char) * POPTIONHEADER->SizeOfImage);
	if (!PTEMPNEWBUFFER)
	{
		return 0;
	}

	memset(PTEMPNEWBUFFER , 0, sizeof(char ) * POPTIONHEADER->SizeOfImage) ;
	memcpy((void *)PTEMPNEWBUFFER , PDOSHEADER, POPTIONHEADER->SizeOfHeaders);

	PIMAGE_SECTION_HEADER PTEMPSECTION = (PIMAGE_SECTION_HEADER)PSECTIONHEADER;

	for (int i =  0; i < PFILEHEADER->NumberOfSections; i++)
	{
		memcpy
        (
			(void * ) ( (char *)PTEMPNEWBUFFER + PTEMPSECTION[i].PointerToRawData ) ,
			 (void * )((char *)pimagebuffer  + PTEMPSECTION[i].VirtualAddress),
			PTEMPSECTION[i].SizeOfRawData
		);
	}

	*newbuffer = PTEMPNEWBUFFER;
	PTEMPNEWBUFFER = NULL;
	return POPTIONHEADER->SizeOfImage;
}



int MESSAGEBOXIN_(char* pbuffer)
{
	if (!pbuffer)
	{
		MessageBox(0, TEXT("缓冲区不存在"), 0, 0);
		return 0;
	}
	if (*(short*)(pbuffer) != 0X5A4D)
	{

		MessageBox(0, TEXT("不是一个mz文件标志"), 0, 0);
		return 0;
	}
	PIMAGE_DOS_HEADER PDOSHEADER = (PIMAGE_DOS_HEADER)pbuffer;

	if (*(PDWORD)((char*)pbuffer + PDOSHEADER->e_lfanew) != IMAGE_NT_SIGNATURE)
	{
		MessageBox(0, TEXT("不是一个NT标记"), 0, 0);
		return 0;
	}
	PIMAGE_NT_HEADERS PNTHEADER = (PIMAGE_NT_HEADERS)((char*)pbuffer + PDOSHEADER->e_lfanew);

	PIMAGE_FILE_HEADER PFILEHEADER = (PIMAGE_FILE_HEADER)(((char*)PNTHEADER) + 0X4);

	PIMAGE_OPTIONAL_HEADER POPTIONHEADER = (PIMAGE_OPTIONAL_HEADER)((char*)PFILEHEADER + 0x14);

	PIMAGE_SECTION_HEADER PSECTIONHEADER = (PIMAGE_SECTION_HEADER)((char*)POPTIONHEADER + PFILEHEADER->SizeOfOptionalHeader);

	if ( ( PSECTIONHEADER[1].VirtualAddress - PSECTIONHEADER[0].VirtualAddress ) - PSECTIONHEADER[0].Misc.VirtualSize  <  SHELLCODELENGTH)
	{
		MessageBox(0,TEXT ("空间不足,无法注入shellcode"), 0, 0);
		return 0;
	}

	int codebegin = (char*)pbuffer + PSECTIONHEADER[0].VirtualAddress + PSECTIONHEADER[0].Misc.VirtualSize;

	memcpy((void *)codebegin, ShellCode ,SHELLCODELENGTH );


	int call = (char*)codebegin + 0x9;

	*(int*)call = MESSAGEBOX -  ( POPTIONHEADER->ImageBase +  ( codebegin - (int )PDOSHEADER )  + 0xd);

	int jump = (char*)codebegin + 0xe ;

	*(int*)jump = (   POPTIONHEADER->ImageBase + POPTIONHEADER->AddressOfEntryPoint) - (POPTIONHEADER->ImageBase +  (codebegin - (int)PDOSHEADER + 0X12)         );

	POPTIONHEADER->AddressOfEntryPoint =  codebegin - (int )PDOSHEADER;
}

int WRITEPEFILE_(char * pfilepath, char * pfilebuffer ,int filesize   )
{
	FILE* PFILE = NULL;
	PFILE = fopen(pfilepath , "wb");
	if (!PFILE)
	{
		return 0;
	}

	size_t n = fwrite(pfilebuffer , filesize , 1 , PFILE);
	if (!n)
	{
		fclose(PFILE);
		return 0;
	}

	fclose(PFILE);
	return 1;
}

int FREEBUFFER_(char * pfilebuffer)
{
	if (!pfilebuffer)
	{
		return 0;
	}
	else
	{
		free(pfilebuffer);
		pfilebuffer = NULL;
	}

}

注入成功

运行成功,不再一一演示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2295456.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

快速上手——.net封装使用DeekSeek-V3 模型

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,用爱发电,去丈量人心,是否能达到人机合一?开工大吉 新的一年就这么水灵灵的开始了,在这里,祝各位读者新春快乐,万事如意! 新年伊…

ReactNative进阶(五十九):存量 react-native 项目适配 HarmonyOS NEXT

文章目录 一、前言二、ohos_react_native2.1 Fabric2.2 TurboModule2.2.1 ArkTSTurboModule2.2.2 cxxTurboModule&#xff1a; 三、拓展阅读 一、前言 2024年10月22日19:00&#xff0c;华为在深圳举办“原生鸿蒙之夜暨华为全场景新品发布会”&#xff0c;主题为“星河璀璨&…

1-2 面向对象编程方法

1.0 面向对象编程思维 在面向对象风格中&#xff0c;结构体被看做数据&#xff08;data&#xff09;&#xff0c;而操作数据的函数称作方法&#xff08;method&#xff09;。目前函数 和数据是分离的&#xff0c;函数并不直接操作数据&#xff0c;我们需要拿到函数返回的结果&a…

CSS 组合选择符详解与实战示例

在 Web 开发过程中&#xff0c;CSS 用于定义页面元素的样式&#xff0c;而选择器则帮助我们精确定位需要添加样式的元素。今天我们主要来讲解 CSS 中的组合选择符&#xff0c;它们能够根据 DOM 结构中元素之间的关系来选中目标元素&#xff0c;从而写出结构清晰、易于维护的 CS…

html为<td>添加标注文本

样式说明&#xff1a; /*为td添加相对定位点*/ .td_text {position: relative; }/*为p添加绝对坐标(相对于父元素中的定位点)*/ .td_text p {position: absolute;top: 80%;font-size: 8px; }参考资料&#xff1a;

apachePoi中XSSFClientAnchor图片坐标简述;填充多张图片

概述 业务中经常会遇到在单元格内填充图片的需求&#xff0c;而且要求指定图片在单元格内的位置。 一般都是用的apache的poi&#xff0c;设置图片坐标。 HSSFClientAnchor(int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int row2)dx1 dy1 起始单元…

无界构建微前端?NO!NO!NO!多系统融合思路!

文章目录 微前端理解1、微前端概念2、微前端特性3、微前端方案a、iframeb、qiankun --> 使用比较复杂 --> 自己写对vite的插件c、micro-app --> 京东开发 --> 对vite支持更拉跨d、EMP 方案--> 必须使用 webpack5 --> 很多人感觉不是微前端 --> 去中心化方…

为飞牛OS基于FRP的内网穿透开启HTTPS加密

前言 玩NAS的朋友应该有比较多只是在家庭局域网使用&#xff0c;比如日常看看电影、备份手机照片什么的&#xff0c;这属于家庭局域网的使用场景。 当然了&#xff0c;如果你经常出差&#xff0c;或者过年回家不想把NAS也背回去&#xff0c;或者是想上班摸鱼&#xff0c;或者是…

《基于Python与DashScope的智能语音合成工具开发》

《基于Python与DashScope的智能语音合成工具开发》 在当今数字化时代&#xff0c;语音合成技术已经广泛应用于各种场景&#xff0c;如智能语音助手、有声读物、导航系统等。本文将介绍如何使用Python和DashScope平台开发一个简单而功能强大的文字转语音工具。通过这个工具&…

快速上手Vim的使用

Vim Linux编辑器-vim使用命令行模式下所有选项都可以带数字底行模式可视块模式&#xff08;ctrlV进入&#xff09; Linux编辑器-vim使用 Vim有多种模式的编辑器。能帮助我们很快的进行代码的编辑&#xff0c;甚至完成很多其他事情。 默认情况下我们打开vim在命令模式下&#x…

vue学习第四天 v-on事件绑定

v-on绑定事件如下&#xff0c;点击按钮会弹出alert v-on&#xff1a;事件具体名称“事件调用的函数名” 事件调用的函数写在methods里面 在methods属性的函数里&#xff0c;可以用this获取data的数据&#xff0c;this代表的就是整个vue实例 用this.age就可以拿到age&#xff0…

2.8寒假作业

web&#xff1a;[HNCTF 2022 Week1]2048 之前也做过类似的题目&#xff0c;之前的解法是直接get传参score20000&#xff0c;可以尝试 打开环境看源代码&#xff0c;直接改源代码显然是不行的&#xff0c;那么用一下上面的办法也不行&#xff0c;估计是要改其他方向的&#xff…

Formality:时序变换(五)(寄存器复制)

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 一、引言 时序变换在Design Compiler的首次综合和增量综合中都可能发生&#xff0c;它们包括&#xff1a;时钟门控(Clock Gating)、寄存器合并(Register Merging)、…

科技赋能数字内容体验的核心技术探索

内容概要 在数字化时代&#xff0c;科技的迅猛发展为我们的生活和工作带来了深刻的变革。数字内容体验已经成为人们获取信息和娱乐的重要途径&#xff0c;而这背后的技术支持则扮演着至关重要的角色。尤其是在人工智能、虚拟现实和区块链等新兴技术的推动下&#xff0c;数字内…

DeepSeek-R1 本地大模型搭建对接API

DeepSeek-R1 在这里将学到很多知识 欢迎使用使用DeepSeek-R1本地大模型DeepSeek 的模型基础说明DeepSeek的本地 API 说明DeepSeek 本地模型搭建1、执行命令安装及测试 DeepSeek-R1 API接口调用当然&#xff0c;我们为了让用户更加便捷&#xff0c;我们把API 接口全部放到上面截…

redis高级数据结构布隆过滤器

文章目录 背景什么是布隆过滤器Redis 中的布隆过滤器布隆过滤器使用注意事项实现原理空间占用估计 背景 我们在使用新闻客户端看新闻时&#xff0c;它会给我们不停地推荐新的内容&#xff0c;它每次推荐时要去重&#xff0c;去掉那些已经看过的内容。问题来了&#xff0c;新闻…

《Wiki.js知识库部署实践 + CNB Git数据同步方案解析》

一、wiki.js 知识库简介 基本概述 定义 &#xff1a;Wiki.js 是一个开源、现代、轻量且功能强大的 Wiki 应用程序&#xff0c;基于 Node.js 构建&#xff0c;旨在帮助个人和团队轻松创建、管理和共享知识。开源性质 &#xff1a;它遵循 AGPLv3 许可证&#xff0c;任何人都可以…

CSS Overflow 属性详解:控制内容溢出的利器

在前端开发中&#xff0c;处理内容溢出是一个常见的需求。CSS 提供了 overflow 属性&#xff0c;帮助我们控制当内容超出元素框时的显示方式。本文将详细介绍 overflow 属性的各种取值及其应用场景。 1. 什么是 overflow 属性&#xff1f; overflow 属性用于控制当元素的内容…

根文件系统 Debian10【1】移植

1.开发背景 一般根文件系统使用 Busybox 或者是 Buildroot 构建&#xff0c;这样构建出来的文件系统比较小&#xff0c;但是不具备上网功能&#xff0c;扩展性比较差。随着 ARM 的日益强大&#xff0c;ARM 可以搭载更庞大复杂的系统&#xff0c;可以是 Ubuntu 或者 Debian 等发…

【PyQt】实现格式刷功能

实现格式刷功能 在Qt Designer中直接实现格式刷功能并不支持&#xff0c;但可以通过以下方法在应用程序中实现类似功能&#xff1a; 一、Qt Designer中的替代方案 1.手动设置样式表 在属性编辑器中复制样式表&#xff08;QSS&#xff09;内容&#xff0c;粘贴到其他控件。 …