《实力团队》诚招传奇游戏技术 检测技术 登陆器技术 接手游、端游工作室项目,另邀请工作室 qq:8427499 诚邀端游,页游,手游作者合作。联系QQ:4700828
《实力团队》诚招传奇游戏技术 检测技术 登陆器技术 全国PPTP L2TP单地区ADSL 超级包机VPN QQ2413588810   【天庭团队】诚招实力作者和出卡代理Q1916501075
《实力团队》诚招传奇游戏技术 检测技术 登陆器技术 ██████不知道为什么,突然想打个广告██████ ██████不知道为什么,突然想打个广告██████
《实力团队》诚招传奇游戏技术 检测技术 登陆器技术 全国PPTP L2TP单地区 混播 超级包机VPN QQ770762897 昌明科技 混拨 动态ip 动态vps 挂机宝 点击进入官网
诚邀端游,页游,手游作者合作共赢。联系QQ:25866957 500双路E5 48G倒闭边缘,出租 合作 都可以QQ809020754 长期收DXF读写驱动,价格好谈,另招出卡大牛Q:1051201352
JD太阳神招大小代理 QQ:1175106622 ██翱翔团队技术合作╋╋有心者点击进入██ 堡垒最新稳定项目,招实力出卡代理 QQ2663113162
诚邀端游,页游,手游作者总代合作。联系QQ:871161552 诚邀端游,页游,手游,技术,作者合作。联系QQ:67880293 赞助广告位(点击查看报价)
【GK实力团队】(天使)项目 诚邀实力代理加入 日出卡上百来 【GK实力团队】(天使)项目 诚邀实力代理加入 日出卡上百来 【GK实力团队】(天使)项目 诚邀实力代理加入 日出卡上百来
  • 63836阅读
  • 312回复

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

上一主题 下一主题
离线fh2002
 

发帖
319
金钱
289
威望
160
贡献值
40
社区警告
1
诚信值
100
热心值
1
协调
0
只看楼主 倒序阅读 0楼 发表于: 2010-02-11
— 本帖被 天使的翅膀 执行加亮操作(2010-06-18) —
研究了一天,初步写成。测试了几个没发现bug,如果有问题可以跟贴共同讨论 afY~Y?PJ<  
代码如下: iW\cLp "  
需要引入的头文件: tpp. 9  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
6FuZMasr*  
  1. union Base  
  2. {
  3.     DWORD   address;
  4.     BYTE    data[4];
  5. };
P}B{FIpNG  
  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. }
Zhb) n  
  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. }
FTvFtdY  
RL0,QC)e#@  
测试代码如下: D0Cs g39  
mD @#,B7A  
  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. }
Cz@[l=-T7  
[ 此帖被fh2002在2010-02-11 00:33重新编辑 ]
1条评分
jerrynpc 金钱 +10 优秀文章 2010-02-11
广海社区为中立第三方平台,相关产品及服务均由合作方(推广方)提供,本站无法保证合作方(推广方)单方面终止提供相关产品及服务的可能,由此带来的风险及损失,本站概不承担,亦不承担相关法律责任。文中内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。如有交易行为,为确保交易资金安全,强烈建议申请广海中介服务,私下交易造成损失的,本站概不负责。广海社区唯一联系人QQ190959022,谨防假冒!
 
离线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 数据 选择更新后不会改变的就是特征码了。 X`bN/sI  
具体的bpsend有一篇文章,可以去看看。 =au7'i|6  
[ 此帖被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
方法不错,测试程序计算机的时候定位不准确,原因未知 -wvrc3F  
int main(int argc, char* argv[]) NcZ6!wWdE  
{ )/HSt%>  
   D0v!fF ~  
P7&a~N$T6W  
    //查找游戏窗口 %L=ro qz  
    HWND hGame = ::FindWindow("SciCalc", NULL); ow:c$Zq  
    if(hGame == NULL) return FALSE; iSUn}%YFz!  
     Q 6{2@  
    DWORD processId; wWko9h=|mQ  
    HANDLE process; rOm )s'  
     BLgmF E2  
    ::GetWindowThreadProcessId(hGame, &processId); "S(m1L?  
    process = ::OpenProcess(PROCESS_ALL_ACCESS, false, processId); mLd=+&M  
    //83C404C3CCCCA1              1           人物基址往下搜索 F6dm_Oq&  
    //C3CCCCCCCCCCCCCCCCCCCC8B442404A3ECA72001      0       人物基址往上搜索 bqJL@!T  
    //5557535152C6400801E8            1        打怪call I;qeDCM  
     DWORD addr; GC?\GV  
     //基址在特征码下面 36,qh.LKn  
      addr = ScanAddress(process, "80744000807440"); 9`f]Rf"  
     printf("人物下基址:%08X\n",addr); T)6p,l  
     J!3 X}@_N  
     //基址在特征码上面 .t.H(Q9  
      addr = ScanAddress(process, "744000E07340", 4, 0); H2 5Mx>|d  
     printf("人物上基址:%08X\n",addr); w 6+X{  
\|BtgT*$b  
   // DWORD call = ScanCall(process, "5557535152C6400801E8");  poGF  
    //printf("call的基址:%08X\n",call); 0V`s 3,k  
    ::CloseHandle(process); {(U?)4@  
    return 0; EpB2?XGA  
} y-m<&{q  
;f#%0W{":  
输出: FU kO$jnO  
人物下基址:00400180 7pH(_-TF  
人物上基址:DB000300 //、、、、、、这里应该是00407409 cq>{  
Press any key to continue =hxj B*")  
zPEx;lO$  
0+jR,5 |  
离线无颜之月

发帖
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
收藏起来。某天看看