《实力团队》诚招传奇游戏技术 检测技术 登陆器技术 【2018】--接项目代理q:8427499 高价收可单步TP调试驱动
诚邀端游,页游,手游作者合作。联系QQ:4700828 《实力团队》诚招传奇游戏技术 检测技术 登陆器技术 全国PPTP L2TP单地区ADSL 超级包机VPN QQ2413588810  
【天庭团队】诚招实力作者和出卡代理Q1916501075 《实力团队》诚招传奇游戏技术 检测技术 登陆器技术 ██████不知道为什么,突然想打个广告██████
██████不知道为什么,突然想打个广告██████ 《实力团队》诚招传奇游戏技术 检测技术 登陆器技术 全国PPTP L2TP单地区 混播 超级包机VPN QQ770762897
昌明科技 混拨 动态ip 动态vps 挂机宝 点击进入官网 诚邀端游,页游,手游作者合作共赢。联系QQ:25866957 ████卡盟Q群:2004219(www.wula56.cn)████
188卡盟团队邀各路总代铺货合作,联系QQ1031251900 寻硬件修改大师的虚拟硬件,无忧加速器招代理 独家单板透视自写绘制自定义颜色名称 联系QQ2656822684
收DXF自动作者稳定不追包日入过万(走内)QQ969443727 赞助广告位(点击查看报价)站长QQ190959022 赞助广告位(点击查看报价)站长QQ190959022
【GK实力团队】(天使)项目 诚邀实力代理加入 日出卡上百来 【GK实力团队】(天使)项目 诚邀实力代理加入 日出卡上百来 【GK实力团队】(天使)项目 诚邀实力代理加入 日出卡上百来
实力开发团队回归 寻大量出卡大牛 内详 实力开发团队回归 寻大量出卡大牛 内详 实力开发团队回归 寻大量出卡大牛 内详
  • 62277阅读
  • 311回复

根据特征码搜索基址,VC写的源码 [复制链接]

上一主题 下一主题
离线fh2002
 

发帖
319
金钱
289
威望
160
贡献值
40
社区警告
1
诚信值
100
热心值
1
协调
0
只看楼主 倒序阅读 0楼 发表于: 2010-02-11
— 本帖被 天使的翅膀 执行加亮操作(2010-06-18) —
研究了一天,初步写成。测试了几个没发现bug,如果有问题可以跟贴共同讨论 ts$UC $  
代码如下: tqC#_[~7  
需要引入的头文件: $QnfpM%+=  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
l0 _O<  
  1. union Base  
  2. {
  3.     DWORD   address;
  4.     BYTE    data[4];
  5. };
@SB+u+mOS  
  1. /************************************************************************/
  2. /* 函数说明:根据特征码扫描基址
  3. /* 参数一:process 要查找的进程
  4. /* 参数二:markCode 特征码字符串,不能有空格
  5. /* 参数三:特征码离基址的距离,默认距离:1
  6. /* 参数四:findMode 扫描方式,找到特征码后,默认为:1
  7. /*                  0:往上找基址(特征码在基址下面)
  8. /*                  1:往下找基址(特征码在基址上面)
  9. /* 参数五:offset 保存基址距离进程的偏移,默认为:不保存
  10. /************************************************************************/
  11. DWORD ScanAddress(HANDLE process, char *markCode,
  12.                   DWORD distinct = 1, DWORD findMode = 1,
  13.                   LPDWORD offset = NULL)
  14. {
  15.     //起始地址
  16.     const DWORD beginAddr = 0x00400000;
  17.     //结束地址
  18.     const DWORD endAddr = 0x7FFFFFFF;
  19.     //每次读取游戏内存数目的大小
  20.     const DWORD pageSize = 4096;
  21.     ////////////////////////处理特征码/////////////////////
  22.     //特征码长度不能为单数
  23.     if (strlen(markCode) % 2 != 0) return 0;
  24.     //特征码长度
  25.     int len = strlen(markCode) / 2;
  26.     //将特征码转换成byte型
  27.     BYTE *m_code = new BYTE[len];
  28.     for (int i = 0; i < len; i++){
  29.         char c[] = {markCode[i*2], markCode[i*2+1], '\0'};
  30.         m_code[i] = (BYTE)::strtol(c, NULL, 16);
  31.     }
  32.     /////////////////////////查找特征码/////////////////////
  33.     BOOL _break = FALSE;
  34.     //用来保存在第几页中的第几个找到的特征码
  35.     int curPage = 0;
  36.     int curIndex = 0;
  37.     Base base;
  38.     //每页读取4096个字节
  39.     BYTE page[pageSize];
  40.     DWORD tmpAddr = beginAddr;
  41.     while (tmpAddr <= endAddr - len){
  42.         ::ReadProcessMemory(process, (LPCVOID)tmpAddr, &page, pageSize, 0);
  43.         //在该页中查找特征码
  44.         for (int i = 0; i < pageSize; i++){
  45.             for (int j = 0; j < len; j++){
  46.                 //只要有一个与特征码对应不上则退出循环
  47.                 if (m_code[j] != page[i + j])break;
  48.                 //找到退出所有循环
  49.                 if (j == len - 1){
  50.                     _break = TRUE;
  51.                     if (!findMode){
  52.                         curIndex = i;
  53.                         base.data[0] = page[curIndex-distinct-4];
  54.                         base.data[1] = page[curIndex-distinct-3];
  55.                         base.data[2] = page[curIndex-distinct-2];
  56.                         base.data[3] = page[curIndex-distinct-1];
  57.                     }else{
  58.                         curIndex = i + j;
  59.                         base.data[0] = page[curIndex+distinct+1];
  60.                         base.data[1] = page[curIndex+distinct+2];
  61.                         base.data[2] = page[curIndex+distinct+3];
  62.                         base.data[3] = page[curIndex+distinct+4];
  63.                     }
  64.                     break;
  65.                 }
  66.             }
  67.             if (_break) break;
  68.         }
  69.         if (_break) break;
  70.         curPage++;
  71.         tmpAddr += pageSize;
  72.     }
  73.     if(offset != NULL){
  74.         *offset = curPage * pageSize + curIndex + beginAddr;
  75.     }
  76.     return base.address;
  77. }
1nmWL0  
  1. /************************************************************************/
  2. /* 函数说明:根据特征码扫描call地址
  3. /* 参数一:process 要查找的进程
  4. /* 参数二:markCode 特征码字符串,不能有空格
  5. /* 参数三:特征码离基址的距离,默认距离:1
  6. /* 参数四:findMode 扫描方式,找到特征码后,默认为:1
  7. /*                  0:往上找基址
  8. /*                  1:往下找基址
  9. /************************************************************************/
  10. DWORD ScanCall(HANDLE process, char *markCode,
  11.                DWORD distinct = 1, DWORD findMode = 1)
  12. {
  13.     DWORD offset;
  14.     DWORD call = ScanAddress(process, markCode, distinct, findMode, &offset);
  15.     call += offset;
  16.     if(findMode) call = call + 5 + distinct;
  17.     else call = call - distinct;
  18.     return call;
  19. }
2F{IDcJI\  
J6P Tkm}^  
测试代码如下: rJwJ5U  
X2Mj|_#u  
  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. }
MG>;|*$%  
[ 此帖被fh2002在2010-02-11 00:33重新编辑 ]
1条评分
jerrynpc 金钱 +10 优秀文章 2010-02-11
 
离线lsc0000

发帖
125
金钱
768
威望
106
贡献值
20
社区警告
0
诚信值
0
热心值
0
协调
0
只看该作者 1楼 发表于: 2010-02-11
     受教...
温馨提示:为确保交易资金安全,强烈建议您选择广海社区中介服务,私下交易造成损失的,本站概不负责,详情点击查看
 
离线wzhwzh

发帖
88
金钱
94
威望
96
贡献值
0
社区警告
0
诚信值
0
热心值
0
协调
0
只看该作者 2楼 发表于: 2010-02-11
我就在想这个特征码是怎么来的?!
站点帮助:验证问题答案举例,如验证问题:3+5=?,请输入中文答案:八
 
离线fh2002

发帖
319
金钱
289
威望
160
贡献值
40
社区警告
1
诚信值
100
热心值
1
协调
0
只看该作者 3楼 发表于: 2010-02-11
特征码在OD中能看见啊。。。下面这图中的这列 Hex 数据 选择更新后不会改变的就是特征码了。 i:8g3|JfMe  
具体的bpsend有一篇文章,可以去看看。 bwH l}3  
[ 此帖被fh2002在2010-02-11 09:11重新编辑 ]
离线niling

发帖
141
金钱
76
威望
0
贡献值
10
社区警告
0
诚信值
0
热心值
0
协调
0
只看该作者 4楼 发表于: 2010-04-28
搜索出来的地址不对呀!
离线ms78902
发帖
130
金钱
167
威望
108
贡献值
0
社区警告
0
诚信值
0
热心值
0
协调
0
只看该作者 5楼 发表于: 2010-06-08
学习学习
让我起来CALL

发帖
496
金钱
844
威望
469
贡献值
0
社区警告
0
诚信值
0
热心值
0
协调
0
只看该作者 6楼 发表于: 2010-06-18
很不错的一篇文章
耐得住寂寞,才守得住繁华。
离线无颜之月

发帖
165
金钱
78
威望
84
贡献值
0
社区警告
0
诚信值
0
热心值
0
协调
0
只看该作者 7楼 发表于: 2010-06-22
方法不错,测试程序计算机的时候定位不准确,原因未知 d*Dq=.F(  
int main(int argc, char* argv[]) X|t?{.p  
{ 0e9W>J9  
   9+U%k(9  
Sx+.<]t2A  
    //查找游戏窗口 "2(lgxhj  
    HWND hGame = ::FindWindow("SciCalc", NULL); DtG><g}[]  
    if(hGame == NULL) return FALSE; "AP'' XNi  
     {co(w 7  
    DWORD processId; j':Ybr>BR  
    HANDLE process; 3g9xTG);eA  
     S:/;|Dg  
    ::GetWindowThreadProcessId(hGame, &processId); ?~uTbNR  
    process = ::OpenProcess(PROCESS_ALL_ACCESS, false, processId); o{pQDI {R  
    //83C404C3CCCCA1              1           人物基址往下搜索 Yv }G"-=  
    //C3CCCCCCCCCCCCCCCCCCCC8B442404A3ECA72001      0       人物基址往上搜索 #P= rP=  
    //5557535152C6400801E8            1        打怪call |4aV~n[>#  
     DWORD addr; LOpn PH`  
     //基址在特征码下面 6 /gh_'&  
      addr = ScanAddress(process, "80744000807440"); !}|n3wQ  
     printf("人物下基址:%08X\n",addr); _Sy-&}c+ +  
      XWV )   
     //基址在特征码上面 j*n Z   
      addr = ScanAddress(process, "744000E07340", 4, 0); r-v ;A  
     printf("人物上基址:%08X\n",addr); =Ig'Aw$x  
f9u^/QVS&  
   // DWORD call = ScanCall(process, "5557535152C6400801E8"); `G&W%CHB  
    //printf("call的基址:%08X\n",call); 2Un~ Iy  
    ::CloseHandle(process); ,S E5W2a]  
    return 0; |F[E h ~  
} <h:>:%#k  
|ybW  
输出: WL$Ee=  
人物下基址:00400180 @-nCK Yj  
人物上基址:DB000300 //、、、、、、这里应该是00407409 EM!#FJh  
Press any key to continue H7n5k,  
U<{8nMB  
BTjfzfO"  
离线无颜之月

发帖
165
金钱
78
威望
84
贡献值
0
社区警告
0
诚信值
0
热心值
0
协调
0
只看该作者 8楼 发表于: 2010-06-22
中OD内存搜索744000E07340  可以找到00407409
离线天上2
发帖
307
金钱
174
威望
286
贡献值
0
社区警告
0
诚信值
0
热心值
0
协调
0
只看该作者 9楼 发表于: 2010-06-23
收藏起来。某天看看