进程特征码遍历VC版

  1. //需要引入的头文件:  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4. #include <windows.h>  
  5. union Base     
  6. {  
  7.     DWORD   address;  
  8.     BYTE    data[4];  
  9. };  
  10. /************************************************************************/  
  11. /* 函数说明:根据特征码扫描基址 
  12. /* 参数一:process 要查找的进程 
  13. /* 参数二:markCode 特征码字符串,不能有空格 
  14. /* 参数三:特征码离基址的距离,默认距离:1 
  15. /* 参数四:findMode 扫描方式,找到特征码后,默认为:1 
  16. /*                  0:往上找基址(特征码在基址下面) 
  17. /*                  1:往下找基址(特征码在基址上面) 
  18. /* 参数五:offset 保存基址距离进程的偏移,默认为:不保存 
  19. /************************************************************************/  
  20. DWORD ScanAddress(HANDLE process, char *markCode,   
  21.                   DWORD distinct = 1, DWORD findMode = 1,   
  22.                   LPDWORD offset = NULL)  
  23. {  
  24.     //起始地址  
  25.     const DWORD beginAddr = 0x00400000;  
  26.     //结束地址  
  27.     const DWORD endAddr = 0x7FFFFFFF;  
  28.     //每次读取游戏内存数目的大小  
  29.     const DWORD pageSize = 4096;  
  30.   
  31.     处理特征码/  
  32.     //特征码长度不能为单数  
  33.     if (strlen(markCode) % 2 != 0) return 0;  
  34.     //特征码长度  
  35.     int len = strlen(markCode) / 2;  
  36.     //将特征码转换成byte型  
  37.     BYTE *m_code = new BYTE[len];  
  38.     for (int i = 0; i < len; i++){  
  39.         char c[] = {markCode[i*2], markCode[i*2+1], '\0'};  
  40.         m_code = (BYTE)::strtol(c, NULL, 16);  
  41.     }  
  42.   
  43.     /查找特征码/  
  44.     BOOL _break = FALSE;  
  45.     //用来保存在第几页中的第几个找到的特征码  
  46.     int curPage = 0;  
  47.     int curIndex = 0;  
  48.     Base base;  
  49.     //每页读取4096个字节  
  50.     BYTE page[pageSize];  
  51.     DWORD tmpAddr = beginAddr;  
  52.     while (tmpAddr <= endAddr - len){  
  53.         ::ReadProcessMemory(process, (LPCVOID)tmpAddr, &page, pageSize, 0);  
  54.         //在该页中查找特征码  
  55.         for (int i = 0; i < pageSize; i++){  
  56.             for (int j = 0; j < len; j++){  
  57.                 //只要有一个与特征码对应不上则退出循环  
  58.                 if (m_code[j] != page[i + j])break;  
  59.                 //找到退出所有循环  
  60.                 if (j == len - 1){  
  61.                     _break = TRUE;  
  62.                     if (!findMode){  
  63.                         curIndex = i;  
  64.                         base.data[0] = page[curIndex-distinct-4];  
  65.                         base.data[1] = page[curIndex-distinct-3];  
  66.                         base.data[2] = page[curIndex-distinct-2];  
  67.                         base.data[3] = page[curIndex-distinct-1];  
  68.                     }else{  
  69.                         curIndex = i + j;  
  70.                         base.data[0] = page[curIndex+distinct+1];  
  71.                         base.data[1] = page[curIndex+distinct+2];  
  72.                         base.data[2] = page[curIndex+distinct+3];  
  73.                         base.data[3] = page[curIndex+distinct+4];  
  74.                     }  
  75.                     break;  
  76.                 }  
  77.             }  
  78.             if (_break) break;  
  79.         }  
  80.         if (_break) break;  
  81.         curPage++;  
  82.         tmpAddr += pageSize;  
  83.     }  
  84.     if(offset != NULL){  
  85.         *offset = curPage * pageSize + curIndex + beginAddr;  
  86.     }  
  87.     return base.address;  
  88. }  
  89.   
  90. /************************************************************************/  
  91. /* 函数说明:根据特征码扫描call地址 
  92. /* 参数一:process 要查找的进程 
  93. /* 参数二:markCode 特征码字符串,不能有空格 
  94. /* 参数三:特征码离基址的距离,默认距离:1 
  95. /* 参数四:findMode 扫描方式,找到特征码后,默认为:1 
  96. /*                  0:往上找基址 
  97. /*                  1:往下找基址 
  98. /************************************************************************/  
  99. DWORD ScanCall(HANDLE process, char *markCode,   
  100.                DWORD distinct = 1, DWORD findMode = 1)  
  101. {  
  102.     DWORD offset;  
  103.     DWORD call = ScanAddress(process, markCode, distinct, findMode, &offset);  
  104.     call += offset;  
  105.     if(findMode) call = call + 5 + distinct;  
  106.     else call = call - distinct;  
  107.     return call;  
  108. }  


测试代码如下:

[cpp]  view plain copy
  1. int main(int argc, char* argv[])  
  2. {  
  3.     //查找游戏窗口  
  4.     HWND hGame = ::FindWindow("DxFirst", NULL);  
  5.     if(hGame == NULL) return FALSE;  
  6.       
  7.     DWORD processId;  
  8.     HANDLE process;  
  9.     ::GetWindowThreadProcessId(hGame, &processId);  
  10.     process = ::OpenProcess(PROCESS_ALL_ACCESS, false, processId);  
  11.     //83C404C3CCCCA1              1           人物基址往下搜索  
  12.     //C3CCCCCCCCCCCCCCCCCCCC8B442404A3ECA72001      0       人物基址往上搜索  
  13.     //5557535152C6400801E8            1        打怪call  
  14.        
  15.      //基址在特征码下面  
  16.      DWORD addr = ScanAddress(process, "83C404C3CCCCA1");  
  17.      printf("人物基址:%X\n",addr);  
  18.        
  19.      //基址在特征码上面  
  20.      DWORD addr = ScanAddress(process, "C3CCCCCCCCCCCCCCCCCCCC8B442404A3ECA72001", 3, 0);  
  21.      printf("人物基址:%X\n",addr);  
  22.     DWORD call = ScanCall(process, "5557535152C6400801E8");  
  23.     printf("call基址:%X\n",call);  
  24.     ::CloseHandle(process);  
  25.     return 0;  
  26. }  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值