gpt4 book ai didi

c++ - 签名扫描说明

转载 作者:行者123 更新时间:2023-11-28 02:15:07 24 4
gpt4 key购买 nike

最近开始学习逆向工程,突然接触到签名扫描。

DWORD FindPattern(char *szPattern, char *szMask)
{
// Get the current process information
MODULEINFO mInfo = {0};
GetModuleInformation(GetCurrentProcess(), GetModuleHandle(NULL), &mInfo, sizeof(MODULEINFO));
// Find the base address
DWORD dwBase = (DWORD)mInfo.lpBaseOfDll;
DWORD dwSize = (DWORD)mInfo.SizeOfImage;
// Get the pattern length
DWORD dwPatternLength = (DWORD)strlen(szMask);
// Loop through all the process
for(DWORD i = 0; i < dwSize - dwPatternLength; i++)
{
bool bFound = true;
// Loop through the pattern caracters
for (DWORD j = 0; j < dwPatternLength; j++)
bFound &= szMask[j] == '?' || szPattern[j] == *(char*)(dwBase + i + j);

// If found return the current address
if(bFound)
return dwBase + i;
}
// Return null
return NULL;
}

我想知道:

  1. 这个函数具体是做什么的?
  2. 应该在哪里使用?
  3. 这个函数/方法的工作原理是什么?
  4. 我们要传递什么以及为什么要传递给“char *szPattern”?

最佳答案

首先,看一下忘记所有模块内容的代码。如果仔细观察,您会发现嵌套的 for 循环基本上是一个(相当低效的)子字符串搜索。它在特定内存区域中搜索给定的 szPattern 作为子字符串。 szMask 是该模式的扩展,因此您可以使用“通配符”进行搜索。

GetModuleInformation 部分只是获取主可执行模块的内存区域,因此您可以在可执行文件中搜索二进制字符串。 如果你将它编译到你的程序中会很有趣,FindPattern 调用很可能会在二进制文件中找到它们自己的常量

那这个东西是干什么用的呢?您可以通过机器代码搜索部分知名函数,因此您不必硬编码函数基地址。您甚至可以使用通配符来屏蔽变化的部分,例如具体变量或函数引用地址。

关于c++ - 签名扫描说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34248504/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com