开启左侧

C++特征码定位算法(字符匹配)

[复制链接]
发表于 2022-3-11 22:34:14 | 显示全部楼层 |阅读模式
本帖最后由 领会 于 2022-3-11 22:58 编辑
  1. // BaseAddrTools.cpp : Defines the entry point for the DLL application.
  2. //

  3. #include <windows.h>
  4. #include <tlhelp32.h>
  5. #include <stdio.h>
  6. BOOL GetProcessModuleHandle(DWORD PID,const char*szModuleName,MODULEENTRY32 *pModule);//获取模块信息的
  7. BOOL StringToByte(const char *InBuff,unsigned char *OutBuff);//字符串转换为字节数组
  8. BYTE *MemoryFind(BYTE *Buff1,BYTE *Buff2,DWORD Buff1Size,DWORD Buff2Size);//查找数组地址
  9. void FindCallAddr(const char *Buff,int OffsetSize,const char *ModuleName,char *Regexp);//查找CALL地址
  10. void FindFunctionAddr(const char *Buff,int OffsetSize,const char *ModuleName,char *Regexp);//查找函数头地址
  11. void FindConstAddr(const char *Buff,int OffsetSize,const char *ModuleName,char *Regexp);//查找常量的值

  12. BOOL WINAPI DllMain( HANDLE hModule,
  13.                        DWORD  ul_reason_for_call,
  14.                        LPVOID lpReserved
  15.                                          )
  16. {
  17.         
  18.         FindConstAddr("558B??83????5356578D????B9????????B8????????F3??",0XD,"BaseAddrTools.exe","0x%08X\n");
  19.         return TRUE;
  20. }

  21. void FindConstAddr(const char *Buff,int OffsetSize,const char *ModuleName,char *Regexp)
  22. {
  23.         MODULEENTRY32 Module32;
  24.         if (GetProcessModuleHandle(GetCurrentProcessId(),ModuleName,&Module32) == FALSE)
  25.                 return ;//如果没找到该模块则返回
  26.         DWORD BuffLen = strlen(Buff)/2;//保存传入字符串的长度
  27.         BYTE *OutBuff = new BYTE[BuffLen];//零时变量保存转换后的数组,+3是因为
  28.         if(!StringToByte(Buff,OutBuff))
  29.         {//如果转换失败则释放内存返回
  30.                 delete []OutBuff;
  31.                 return ;
  32.         }
  33.         BYTE *Temp = MemoryFind(Module32.modBaseAddr,OutBuff,Module32.modBaseSize,BuffLen);//保存一个零时变量来保存返回值的
  34.         while (Temp)
  35.         {
  36.                 char DbgOutBuff[MAX_PATH] = {0};
  37.                 sprintf(DbgOutBuff,Regexp,*(DWORD *)((int)Temp+OffsetSize));
  38.                 OutputDebugString(DbgOutBuff);
  39.                 Temp = MemoryFind(Temp+1,OutBuff,Module32.modBaseSize - (Temp - Module32.modBaseAddr),BuffLen);
  40.         }
  41.         delete []OutBuff;
  42. }

  43. void FindFunctionAddr(const char *Buff,int OffsetSize,const char *ModuleName,char *Regexp)
  44. {
  45.         MODULEENTRY32 Module32;
  46.         if (GetProcessModuleHandle(GetCurrentProcessId(),ModuleName,&Module32) == FALSE)
  47.                 return ;//如果没找到该模块则返回
  48.         DWORD BuffLen = strlen(Buff)/2;//保存传入字符串的长度
  49.         BYTE *OutBuff = new BYTE[BuffLen];//零时变量保存转换后的数组,+3是因为
  50.         if(!StringToByte(Buff,OutBuff))
  51.         {//如果转换失败则释放内存返回
  52.                 delete []OutBuff;
  53.                 return ;
  54.         }
  55.         BYTE *Temp = MemoryFind(Module32.modBaseAddr,OutBuff,Module32.modBaseSize,BuffLen);//保存一个零时变量来保存返回值的
  56.         while (Temp)
  57.         {
  58.                 char DbgOutBuff[MAX_PATH] = {0};
  59.                 sprintf(DbgOutBuff,Regexp,(int)Temp+OffsetSize);
  60.                 OutputDebugString(DbgOutBuff);
  61.                 Temp = MemoryFind(Temp+1,OutBuff,Module32.modBaseSize - (Temp - Module32.modBaseAddr),BuffLen);
  62.         }
  63.         delete []OutBuff;
  64. }
  65. void FindCallAddr(const char *Buff,int OffsetSize,const char *ModuleName,char *Regexp)
  66. {
  67.         MODULEENTRY32 Module32;
  68.         if (GetProcessModuleHandle(GetCurrentProcessId(),ModuleName,&Module32) == FALSE)
  69.                 return ;//如果没找到该模块则返回
  70.         DWORD BuffLen = strlen(Buff)/2;//保存传入字符串的长度
  71.         BYTE *OutBuff = new BYTE[BuffLen];//零时变量保存转换后的数组,+3是因为
  72.         if(!StringToByte(Buff,OutBuff))
  73.         {//如果转换失败则释放内存返回
  74.                 delete []OutBuff;
  75.                 return ;
  76.         }
  77.         BYTE *Temp = MemoryFind(Module32.modBaseAddr,OutBuff,Module32.modBaseSize,BuffLen);//保存一个零时变量来保存返回值的
  78.         while (Temp)
  79.         {
  80.                 DWORD CallAddr = *(DWORD*)(Temp+OffsetSize+1) + (int)Temp+OffsetSize + 5;
  81.                 char DbgOutBuff[MAX_PATH] = {0};
  82.                 sprintf(DbgOutBuff,Regexp,CallAddr);
  83.                 OutputDebugString(DbgOutBuff);
  84.                 Temp = MemoryFind(Temp+1,OutBuff,Module32.modBaseSize - (Temp - Module32.modBaseAddr),BuffLen);
  85.         }
  86.         delete []OutBuff;
  87. }
复制代码



游客,如果您要查看本帖隐藏内容请回复

回复

使用道具 举报

发表于 2022-3-24 19:14:25 | 显示全部楼层
回复一下
回复

使用道具 举报

发表于 2022-6-5 13:14:25 | 显示全部楼层
学习一下下 谢谢
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表