《实力团队》诚招传奇私服类外挂技术 检测技术 登陆器技术 【2018】--接项目代理q:8427499 《实力团队》诚招传奇私服类外挂技术 检测技术 登陆器技术
收DXF和Steam平台大逃杀全套数据源码 诚邀端游,页游,手游作者合作。联系QQ:4700828 《实力团队》诚招传奇私服类外挂技术 检测技术 登陆器技术
《寻合作》300台E5-双路2670 内存128G 壹万个窗口 包年位置,先到先得,点击联系QQ190959022 《实力团队》诚招传奇私服类外挂技术 检测技术 登陆器技术
全国PPTP L2TP单地区ADSL 超级包机VPN QQ2413588810   【联盟网络】诚邀端游,页游,手游作者合作Q:65961219 《实力团队》诚招传奇私服类外挂技术 检测技术 登陆器技术
《实力团队》诚招传奇私服类外挂技术 检测技术 登陆器技术 《实力团队》诚招传奇私服类外挂技术 检测技术 登陆器技术 《实力团队》诚招传奇私服类外挂技术 检测技术 登陆器技术
全国PPTP L2TP单地区 混播 超级包机VPN QQ770762897 疾影NGS(BlackCipher) / XignCode3全球多开/过保护/检测 诚邀作者 长期合作 联系QQ:404023606(备战逆水寒)
【888团队】诚邀实力H1Z1绝地求生开发合作共赢QQ53147801 【绝地项目作者】招实力总代 量大开端 QQ9074992 稳定 452团队欢迎开发总代合作共赢
出最新绘制源码 编译可用 防检测 送驱动 QQ:535654037 ████████ 绝地项目 现招代理 超级稳定████████ 大量租售各种qq小号 1952087867
收PUBG游戏魔术子弹源码 联系QQ1018050996 稳定无后插件--秒打药--天卡2元 【CR销售团队】诚邀作者共赢 另招实力代理加盟QQ:598888006
【大逃杀工作室】绝地求生辅助官网 诚邀高端实力作者 绝地稳定项目内部版准备上线招量大代理 ■■绝地辅助招代理免费开端 出售撸号器源码+群73426587■■
【绝地作者招总代】量大开端【QQ124665801】稳定包赚钱 赞助广告位(点击查看报价)站长QQ190959022 赞助广告位(点击查看报价)站长QQ190959022
我们帮您结识本地工作室 点击加群 54【全国工作室交友】 我们帮您项目上线运作 点击加群 54【全国技术交友】 我们会不定期全国各地线下聚会 54【线下活动举办方】
【GK实力团队】(天使)绝地稳定项目 诚邀实力代理加入 【GK实力团队】(天使)绝地稳定项目 诚邀实力代理加入 【GK实力团队】(天使)绝地稳定项目 诚邀实力代理加入
【LK团队】绝地 堡垒之夜 稳定项目诚招实力代理 【LK团队】绝地 堡垒之夜 稳定项目诚招实力代理 【LK团队】绝地 堡垒之夜 稳定项目诚招实力代理
《寻合作》120台E5-双路2670 64G 800个IP  QQ345070110 《寻合作》120台E5-双路2670 64G 800个IP  QQ345070110 《寻合作》120台E5-双路2670 64G 800个IP  QQ345070110
《绝地、堡垒》实力市场团队诚邀高端作者合作qq503720112 《绝地、堡垒》实力市场团队诚邀高端作者合作qq503720112 《绝地、堡垒》实力市场团队诚邀高端作者合作qq503720112
绝地招收实力代理稳定项目多 量大开端QQ2399333129 绝地招收实力代理稳定项目多 量大开端QQ2399333129 绝地招收实力代理稳定项目多 量大开端QQ2399333129
██终结者2/荒野行动/狙击手辅助 透视 自瞄 锁头 显物██ ██终结者2/荒野行动/狙击手辅助 透视 自瞄 锁头 显物██ ██终结者2/荒野行动/狙击手辅助 透视 自瞄 锁头 显物██
██【全部游戏】招实力开发 合作共赢 QQ:87771094██ ██【全部游戏】招实力开发 合作共赢 QQ:87771094██ ██【全部游戏】招实力开发 合作共赢 QQ:87771094██
  • 60128阅读
  • 311回复

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

上一主题 下一主题
离线fh2002
 

发帖
319
金钱
289
威望
160
贡献值
40
社区警告
1
诚信值
100
热心值
1
协调
0
只看楼主 倒序阅读 0楼 发表于: 2010-02-11
— 本帖被 天使的翅膀 执行加亮操作(2010-06-18) —
研究了一天,初步写成。测试了几个没发现bug,如果有问题可以跟贴共同讨论 dQ_hlx!J  
代码如下: U>sEFzBup  
需要引入的头文件: 7'#_uA QR  
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
N<b~,[yCd>  
  1. union Base  
  2. {
  3.     DWORD   address;
  4.     BYTE    data[4];
  5. };
3 . K #,  
  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. }
HYL['B?Wid  
  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. }
j+rY  
m41%?uC/  
测试代码如下: B3pjli  
i]OEhB Y  
  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. }
&er,Wyc(  
[ 此帖被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 数据 选择更新后不会改变的就是特征码了。 pdJ]V`m  
具体的bpsend有一篇文章,可以去看看。 lv/im/]v  
[ 此帖被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
方法不错,测试程序计算机的时候定位不准确,原因未知 \!+-4,CbZY  
int main(int argc, char* argv[]) DR k]{^C~  
{ AIZW@Nq.5  
   Xh.+pJl,*  
xT9Yes&  
    //查找游戏窗口 T*h!d(  
    HWND hGame = ::FindWindow("SciCalc", NULL); Y%<`;wK=^  
    if(hGame == NULL) return FALSE; n,t6v5>88  
     ;yF[2P ;  
    DWORD processId; 5^)?mA  
    HANDLE process; JNh=fvO2i  
     blJIto '  
    ::GetWindowThreadProcessId(hGame, &processId); mJ)tHv"7  
    process = ::OpenProcess(PROCESS_ALL_ACCESS, false, processId); y^2#9\}K  
    //83C404C3CCCCA1              1           人物基址往下搜索 Vy]A,Rn7  
    //C3CCCCCCCCCCCCCCCCCCCC8B442404A3ECA72001      0       人物基址往上搜索 l`SK*Bm~<  
    //5557535152C6400801E8            1        打怪call  cp$.,V  
     DWORD addr; YzVN2f!n  
     //基址在特征码下面 g^1r0.Sp{8  
      addr = ScanAddress(process, "80744000807440"); BsKbn@'uC  
     printf("人物下基址:%08X\n",addr); Q/p(#/y#b  
     NdZ)[f:2  
     //基址在特征码上面 H ZPcd_(  
      addr = ScanAddress(process, "744000E07340", 4, 0); pjACFVMFX  
     printf("人物上基址:%08X\n",addr); _ j~4+ H  
TZ'aNcGg  
   // DWORD call = ScanCall(process, "5557535152C6400801E8"); R;r|cep  
    //printf("call的基址:%08X\n",call); VUp. j  
    ::CloseHandle(process); ?1CJf>B>  
    return 0; /u=aX  
} okz]Qc>G  
?~,JY  
输出: ~ 7}]  
人物下基址:00400180 6GzzG P^  
人物上基址:DB000300 //、、、、、、这里应该是00407409 `gI~|A4  
Press any key to continue >b>gr OX  
1aq2aLx  
VD/&%O8n  
离线无颜之月

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