控制台中的C++签名扫描程序
C++ Signature Scanner in Console
我想首先说我对C++非常陌生。我正试图构建一个简单的控制台应用程序,只需更改一个字节数组即可修改绘制工具的功能。
我已经找到了需要更改的字节数组,并尝试遵循本教程,但它最终被用于dll注入,这不是我想要做的http://guidedhacking.com/showthread.php?3981
如果有人能以任何方式帮助我如何在控制台应用程序中进行签名扫描,我将不胜感激。
自从那个教程制作完成后,我还制作了一个外部模式扫描视频教程。我很难过地说,这并不完美。但让你从这里开始的是我目前使用的代码,它还没有让我失败:
内部模式扫描功能:
char* ScanIn(char* pattern, char* mask, char* begin, unsigned int size)
{
unsigned int patternLength = strlen(mask);
for (unsigned int i = 0; i < size - patternLength; i++)
{
bool found = true;
for (unsigned int j = 0; j < patternLength; j++)
{
if (mask[j] != '?' && pattern[j] != *(begin + i + j))
{
found = false;
break;
}
}
if (found)
{
return (begin + i);
}
}
return nullptr;
}
用于外部模式扫描的包装器:
char* ScanEx(char* pattern, char* mask, char* begin, char* end, HANDLE* hProc)
{
char* currentChunk = begin;
char* match = nullptr;
SIZE_T bytesRead;
while (currentChunk < end)
{
MEMORY_BASIC_INFORMATION mbi;
//return nullptr if VirtualQuery fails
if (!VirtualQueryEx(hProc, currentChunk, &mbi, sizeof(mbi)))
{
return nullptr;
}
char* buffer = new char[mbi.RegionSize];
if (mbi.State == MEM_COMMIT && mbi.Protect != PAGE_NOACCESS)
{
DWORD oldprotect;
if (VirtualProtectEx(hProc, mbi.BaseAddress, mbi.RegionSize, PAGE_EXECUTE_READWRITE, &oldprotect))
{
ReadProcessMemory(hProc, mbi.BaseAddress, buffer, mbi.RegionSize, &bytesRead);
VirtualProtectEx(hProc, mbi.BaseAddress, mbi.RegionSize, oldprotect, &oldprotect);
char* internalAddress = ScanIn(pattern, mask, buffer, bytesRead);
if (internalAddress != nullptr)
{
//calculate from internal to external
uintptr_t offsetFromBuffer = internalAddress - buffer;
match = currentChunk + offsetFromBuffer;
delete[] buffer;
break;
}
}
}
currentChunk = currentChunk + mbi.RegionSize;
delete[] buffer;
}
return match;
}
那么你可以这样称呼它:
ScanEx("x29x7bx00x8bxc7", "xx?xx", moduleBase, moduleEnd, &hProc);
我想到的想法是使用ReadProcessMemory一次将一个内存区域从目标进程复制到本地进程中,然后在该缓冲区上运行我们的ScanIn()内部扫描函数。当您在目标内存中移动时,您会检查内存页是否具有正确的保护和状态,以确认它是一个有效的内存区域。
这里最大的警告是:如果你的模式跨越两个区域,这个函数找不到它。但我在过去3年里使用它没有遇到任何问题。
我会读取ReadProcessMemory,这是一种在不需要DLL注入的情况下从外部读取数据的好方法。
没有回答签名扫描问题。我会以块的形式读取目标进程的内存,比如1024字节,并在块上运行模式匹配函数。
但这个领域真的不适合C++初学者,除非你以前在其他语言中使用过它。
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- C++,系统无法执行指定的程序
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- C++ Windows 驱动程序MSB3030无法复制该文件,因为它找不到
- 重载操作程序时出错>>用于类中的字符串 memebr
- C++客户端/服务器聊天应用程序 - 从 Ubuntu 命令窗口扫描输入
- 我可以在我的 cmake 代码中手动使用 CMake 的 cpp 文件依赖项扫描程序吗?
- C++ 签名扫描程序输出错误
- 扫描头文件并报告可用代码的程序
- 控制台中的C++签名扫描程序
- C++端口扫描程序
- 强制无线网卡只扫描一个通道(以程序方式)
- 使用哪个库来创建简单的端口扫描程序
- 如何加快我的内存扫描程序
- 调试断言失败文件、令牌扫描程序和文本文件
- 扫描程序等待另一个类似的程序
- 发送扫描码到我的应用程序
- 扫描参数并用c++程序确定它们是什么
- 启动多个程序扫描计算机以查找恶意软件