X64下指定进程内存搜索

#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:4996)
#include <stdio.h>
#include <windows.h>
#include <string>
#pragma region FindSig
#include <vector>
#include <Psapi.h>
#include <iostream>
#include <tchar.h>
#include <tlhelp32.h>
unsigned char code[12];
unsigned char oldcode[12];
FARPROC addr;
DWORD pid;
using namespace std;



bool FHexCharValid(char c)
{
	if (c >= '0' && c <= '9' ||
		c >= 'A' && c <= 'F' ||
		c >= 'a' && c <= 'f' ||
		c == '?')
		return true;
	else
		return false;
}
bool FHexDecoder(char* Dec, char* Src)
{
	char HighC, LowC;
	DWORD dwSrcLen = strlen(Src) / 2;
	int i;
	for (i = 0; i < dwSrcLen; i++) {
		HighC = Src[i * 2], LowC = Src[i * 2 + 1];
		if (!FHexCharValid(LowC) || !FHexCharValid(HighC))
			return false;
		HighC -= '0';
		if (HighC > 9) HighC -= 7;
		if (HighC > 0xf) HighC -= 0x20;
		LowC -= '0';
		if (LowC > 9) LowC -= 7;
		if (LowC > 0xf) LowC -= 0x20;
		Dec[i] = (HighC << 4) | LowC;
	}
	return true;
}
bool __SundayHexInit__(char* Sub, DWORD*p, char* HexSub, unsigned long dwSubLen)
{
	if (!FHexDecoder(HexSub, Sub)) {
		return false;
	}
	DWORD i;

	for (i = 0; i < 0x100; i++) {
		p[i] = -1;
	}

	int WildAddr = 0;
	for (i = 0; i < dwSubLen; i++) {
		if (Sub[i * 2] == '?')
			WildAddr = i;
	}

	for (i = WildAddr + 1; i < dwSubLen; i++) {                     //扫描Sub,初始化 P 表
		p[(BYTE)HexSub[i]] = dwSubLen - i;
	}

	for (i = 0; i < 0x100; i++) {
		if (p[i] == -1)
			p[i] = dwSubLen - WildAddr;
	}
	return true;
}
int __SundayHex__(char* Src, unsigned long dwSrcLen, char* Sub, DWORD* p, char* HexSub, DWORD dwSubLen)
{
	//开始配对字符串
	//j为 Sub位置指标, k为 当前匹配位置
	DWORD j, k;
	j = dwSubLen - 1;                                   //初始化位置为 dwSubLen - 1,匹配顺序为从右到左

	bool bContinue = true;
	bool bSuccess;
	while (bContinue) {
		bSuccess = true;
		for (k = 0; k < dwSubLen; k++) {
			if (Sub[(dwSubLen - k - 1) * 2] != '?' && Src[j - k] != HexSub[dwSubLen - k - 1]) {
				bSuccess = false;
				break;
			}
		}
		if (bSuccess)
			bContinue = false;
		else {                                          //移动j指针
			if (j < dwSrcLen - 1)                                                        //防止j+1 >= dwSrcLen造成溢出
				j += p[(BYTE)Src[j + 1]];
			else j++;
		}
		if (j >= dwSrcLen)
			break;
	}
	if (j < dwSrcLen)
		return j - dwSubLen + 1;
	else
		return -1;
}
int __SundayHexV__(char* Src, unsigned long dwSrcLen, char* Sub, DWORD* p, char* HexSub, DWORD dwSubLen, int v)
{
	//开始配对字符串
	//j为 Sub位置指标, k为 当前匹配位置
	DWORD j, k;
	j = dwSubLen - 1 + v;                                   //初始化位置为 dwSubLen - 1,匹配顺序为从右到左

	bool bContinue = true;
	bool bSuccess;
	while (bContinue) {
		bSuccess = true;
		for (k = 0; k < dwSubLen; k++) {
			if (Sub[(dwSubLen - k - 1) * 2] != '?' && Src[j - k] != HexSub[dwSubLen - k - 1]) {
				bSuccess = false;
				break;
			}
		}
		if (bSuccess)
			bContinue = false;
		else {                                          //移动j指针
			if (j < dwSrcLen - 1)                                                        //防止j+1 >= dwSrcLen造成溢出
				j += p[(BYTE)Src[j + 1]];
			else j++;
		}
		if (j >= dwSrcLen)
			break;
	}
	if (j < dwSrcLen)
		return j - dwSubLen + 1;
	else
		return -1;

}
int SundayHex(char* Src, unsigned long dwSrcLen, char* Sub)
{
	DWORD dwSubLen = strlen(Sub);
	if (dwSubLen % 2)                    //长度必须为2的倍数
		return -1;
	dwSubLen /= 2;

	char* HexSub = new char[dwSubLen + 1];
	DWORD* p = new DWORD[0x100];        //table P,标志距离
	int i = -1;

	if (__SundayHexInit__(Sub, p, HexSub, dwSubLen)) {


		i = __SundayHex__(Src, dwSrcLen, Sub, p, HexSub, dwSubLen);
	}

	delete[]p;
	delete[]HexSub;
	return i;
}
vector< int> SundayHexV(char* Src, unsigned long dwSrcLen, char* Sub)
{
	vector< int> v;
	DWORD dwSubLen = strlen(Sub);

	if (dwSubLen % 2)                    //长度必须为2的倍数
		return v;
	dwSubLen /= 2;

	char* HexSub = new char[dwSubLen + 1];
	DWORD* p = new DWORD[0x100];        //table P,标志距离
	int i = -1;



	if (__SundayHexInit__(Sub, p, HexSub, dwSubLen)) {

		i = __SundayHexV__(Src, dwSrcLen, Sub, p, HexSub, dwSubLen, 0);

		while (i != -1)
		{
			v.push_back(i);
			i = __SundayHexV__(Src, dwSrcLen, Sub, p, HexSub, dwSubLen, i + dwSubLen);

		}

	}

	delete[]p;
	delete[]HexSub;
	return v;

}

int Getpid(const char *name)
{
	char szProcessName[MAX_PATH];
	char *pName;
	PROCESSENTRY32 pe = { sizeof(PROCESSENTRY32) };
	printf("进程快照\n");
	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	Process32First(hSnapshot, &pe);
	printf("Pid=%d    进程名:%s\n", pe.th32ProcessID, pe.szExeFile);
	while (Process32Next(hSnapshot, &pe))
	{
		pName = strrchr(pe.szExeFile, '\\');
		if (pName != 0)
		{
			strcpy(szProcessName, pName + 1);
			if (!strcmp(szProcessName, name))
				return pe.th32ProcessID;

		}
		else
		{
			if (!strcmp(pe.szExeFile, name))
				return pe.th32ProcessID;
		}
	}
	CloseHandle(hSnapshot);
	return 0;
}

DWORD64 __stdcall FindSig(const char* Value)
{
	vector <DWORD> 保存数组;
	DWORD64 区段大小 = 0;
	ULONG64 Start = 0, End = 0x7fffffffffffffff;
	//if (dwPid == 0) return 保存数组;
	MEMORY_BASIC_INFORMATION 内存信息 = { 0 };

	

	HANDLE hFake1 =  OpenProcess(PROCESS_ALL_ACCESS, false, Getpid("my.exe"));//通过取pid取handle 
	
	if (hFake1 != NULL)
	{
		
		while (VirtualQueryEx(hFake1, (LPCVOID)Start, &内存信息, sizeof(内存信息)))
		{
			//cout << 内存信息.BaseAddress << endl;
			if (内存信息.Protect != 1 && 内存信息.Protect != 16 && 内存信息.RegionSize != 1 && 内存信息.Protect != 512)
			{

				区段大小 = (DWORD64)内存信息.BaseAddress + 内存信息.RegionSize - Start;
				//char tmpchar[255];
				//sprintf_s(tmpchar, "0x%I64x", 区段大小);
				//MessageBoxA(NULL, tmpchar, "Size", MB_OK);
				char* buf = new char[区段大小 + 1];
				if (ReadProcessMemory(hFake1, (LPCVOID)Start, buf, 区段大小, NULL))
				{

					vector<int>  dwValue = SundayHexV(buf, 区段大小, (char*)Value);
					for (size_t i = 0; i < dwValue.size(); i++)
					{
						//保存数组.push_back(Start + dwValue[i]);
						char tmpchar[255];
						sprintf_s(tmpchar, "0x%I64x", Start + dwValue[i]);
						MessageBoxA(NULL, tmpchar, "Result", MB_OK);
						return Start + dwValue[i];
						
					}
					//delete(buf);
				}
				//delete(buf);
			}
			if (End == 0) {
				break;
			}

			Start += 内存信息.RegionSize;
			if (Start > End)
				break;
		}
		//CloseHandle(hProcess);
	}

	return 0;
}



int main()
{
	FindSig("4533C944894C2420458BCF452BCC488BCF498BD5458BC4");  //特征码 
	//4533C944894C2420458BCC452BCD488BCB498BD7458BC5  
}

通过搜集代码集合而成,觉得好用

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 易语言是一种基于Windows平台的编程语言,x64特征码搜索模块是它的一个特性。x64特征码搜索模块是为了在Windows x64 64位操作系统上进行特征码搜索而设计的工具。 特征码是指在程序或者数据中能够唯一标识某一功能或者特征的一段二进制代码。在软件开发过程中,开发者常常需要对某些特定的功能或者特征进行定位和修改。在x64操作系统中,由于64位的寻址空间和指令集的不同,传统的特征码搜索方法无法直接使用。因此,易语言提供了x64特征码搜索模块来支持对64位操作系统的特征码搜索x64特征码搜索模块能够根据开发者提供的特征码,快速的在指定进程中进行搜索,找到匹配的特征码位置。这个功能对于软件逆向工程和游戏修改等领域非常有用。开发者可以使用易语言编写特定的算法和逻辑来处理搜索到的特征码,实现各种功能的修改和增加。 通过x64特征码搜索模块,易语言提供了对64位操作系统的特征码搜索的支持,为开发者在64位操作系统上进行特征码搜索提供了便利。它的使用也是易语言在不断更新和提升的过程中,为了适应新的技术和发展而推出的新功能。 ### 回答2: 易语言x64特征码搜索模块是一种提供给易语言程序开发者使用的功能模块,用于在64位操作系统上进行特征码的搜索和匹配。特征码是一种用来识别特定功能或行为的代码片段,可以用于进行软件逆向工程、游戏修改等应用。 该模块基于x64架构开发,因此能够满足64位操作系统的要求,并且具有较强的搜索和匹配能力。在使用该模块时,开发者可以指定一个特定的特征码,然后模块会在指定进程内存空间中搜索匹配该特征码的位置和值。 该模块的主要特点有: 1. 支持常见的特征码格式,如字符串、字节序列、函数标识等。开发者可以根据具体需求选择合适的特征码类型。 2. 提供多种搜索算法,包括精确搜索、模糊搜索等,方便快速地找到特征码匹配的位置。 3. 支持内存读写操作,可以在搜索到特征码匹配位置后,读取或修改该位置的值。 4. 提供丰富的API接口和函数,开发者可以根据需要进行二次开发和定制,实现更复杂的功能。 易语言x64特征码搜索模块的出现,极大地方便了开发者在64位操作系统上进行特征码搜索和匹配的工作。无论是对于游戏修改、软件逆向工程还是其他领域的开发,都能提供强大的支持和便捷的操作。开发者可以在易语言平台上直接调用该模块,简化开发流程,提高工作效率。 ### 回答3: 易语言是一种简单易学的编程语言,其特征码搜索模块主要用于在指定的二进制数据中搜索特定的特征码。 特征码是指二进制数据中具有唯一标识或特定含义的字节序列。在软件开发中,我们常常需要对某些特定的二进制数据进行分析和处理,此时就可以使用特征码搜索模块来实现。 在易语言x64特征码搜索模块中,我们可以首先选择要搜索的二进制数据文件或内存区域。然后,可以输入要搜索的特征码,特征码可以是字符串或十六进制表示的字节序列。 搜索过程中,特征码搜索模块会逐一扫描二进制数据,并与输入的特征码进行比对。如果找到匹配的特征码,就会给出相应的提示或结果。同时,该模块还可以提供一些额外的功能,比如搜索时的增量偏移和范围限制等。 易语言x64特征码搜索模块具有以下特点:第一,易于使用,无需编写复杂的代码,只需简单设置参数即可实现特征码的搜索。第二,搜索速度较快,可以高效地处理大量的二进制数据。第三,支持对搜索结果进行进一步的分析和处理,例如导出结果或修改数据值等。 总之,易语言x64特征码搜索模块是一种方便实用的功能,可以帮助开发者在软件开发和逆向工程中有效地分析和处理特定的二进制数据。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值