郁金香外挂技术-郁金香灬老师

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 186|回复: 0

C,C++仿CE 特征码定位游戏所有基址偏移并保存到文件 带通...

[复制链接]
发表于 2021-12-30 02:21:38 | 显示全部楼层 |阅读模式

QQ 150330575
传奇4 找基址 找CALL
C,C++特征码定位所有基址偏移-保存到文件
          
           #include "CFind_Offset.h"
int  WriteToFile(const char* szLine);
int  定位所有基址并输入到文件()
{
        {        const char strline0[] = "\r\n//#pragma once\r\n";
        printf(strline0);
        WriteToFile(strline0);
        }
        {
        char sz特征码[] = "488D8FE0020000488B01FF5030"; //+0x1F
        CFind_Offset::MatchSearch("CALL02_OFFSET_取任务对象", sz特征码, 0x1F, 5, 1);
        CFind_Offset::MatchSearch("CALL01_RCX_OFFSET_取任务对象", sz特征码, 0x12, 5, 1);
        }
        //return 1;
        {
                char sz特征码[] = "41B888130000488D542430488B4808";
                {

                        char sz变量名[] = "CALL_OFFSET_明文包";
                        CFind_Offset::MatchSearch(sz变量名, sz特征码, 0x0F, 5, 1);

                }
                {

                        char sz变量名[] = "CALL_RCX_OFFSET_明文包";
                        CFind_Offset::MatchSearch(sz变量名, sz特征码, -0x7, 7, 3);

                }

        }
        //CALL_OFFSET_背包物品使用
        {
                char sz特征码[] = "440FB68710030000488B93B0000000488BCBE8"; // +0x12
                char sz变量名[] = "CALL_OFFSET_背包物品使用";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, 0x12, 5, 1);
        }
        {
                char sz特征码[] = "488BC8450FB6CD41B801000000488BD3E8"; // +0x10
                char sz变量名[] = "CALL_OFFSET_使用背包物品01";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, 0x10, 5, 1);
        }
        {
                char sz特征码[] = "488BC8450FB6CD41B801000000488BD3E8"; // -0x05
                char sz变量名[] = "CALL_RCX_OFFSET_使用背包物品01";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, -0x05, 5, 1);
        }
        //CALL_OFFSET_选怪
        {
                char sz特征码[] = "0F28B424F0000000488B8338030000"; //-5
                char sz变量名[] = "CALL_OFFSET_选怪CALL01";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, -0x05, 5, 1);
        }
        {
                char sz特征码[] = "0F28B424F0000000488B8338030000"; //-0x10
                char sz变量名[] = "CALL_OFFSET_选怪CALL02";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, -0x10, 5, 1);
        }
        //CALL_OFFSET_取控件对象
        {
                char sz特征码[] = "4C8B4310488BD7488BC8488B5C24304883C4205F49FFE0"; //-0x05
                char sz变量名[] = "CALL_OFFSET_取控件对象";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, -0x05, 5, 1);
        }
        //CALL_OFFSET_寻路
        {
                char sz特征码[] = "C6442428028944242CF20F10833C060000"; //+0x3C
                char sz变量名[] = "CALL_OFFSET_寻路";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, 0x3C, 5, 1);
        }
        //CALL_OFFSET_按键
        {
                char sz特征码[] = "33C04889BEF00100004889BEF8010000898611010000";
                char sz变量名[] = "CALL_OFFSET_按键";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, 0x30, 7, 3);
        }
        //CALL_OFFSET_采集
        {
                char sz特征码[] = "4488642428C7442420000000004533C941B001"; //-8
                char sz变量名[] = "CALL_OFFSET01_采集";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, -8, 5, 1);
        } {
                char sz特征码[] = "4488642428C7442420000000004533C941B001"; //+0x16
                char sz变量名[] = "CALL_OFFSET02_采集";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, 0x16, 5, 1);
        }
        //OFFSET_怪物人物采集物对象ID数组
        {
                char sz特征码[] = "32C04D85C07408410FB68080060000"; // -0x07
                char sz变量名[] = "OFFSET_怪物人物采集物对象ID数组";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, -7, 7, 3);
        }
        //OFFSET_所有对象数组
        {
                char sz特征码[] = "33C08B4008C1E81DA8010F85"; // -0x17
                char sz变量名[] = "OFFSET_所有对象数组";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, -0x17, 7, 3);
        }
        //OFFSET_人物属性对象A
        {
                char sz特征码[] = "488B01FF50283D5E240000"; //+11
                char sz变量名[] = "OFFSET_人物属性对象A";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, 0x11, 7, 3);
        }
        //OFFSET_人物角色坐标基址
        {
                char sz特征码[] = " 48 8B 05 ********48 85 C0  74 **80 B8 88 03 00 00 0D  "; //+9
                char sz变量名[] = "OFFSET_人物角色坐标基址";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, 0, 7, 3);
        }

        {
                char sz特征码[] = "488D3CD04885FF0F84A5"; //-07
                char sz变量名[] = "OFFSET_NPC_ID_LIST";
                CFind_Offset::MatchSearch(sz变量名, sz特征码, -7, 7, 3);
        }
         
        {
                const char strline0[] = "//>>完成所有遍历\r\n";
                printf(strline0);
                WriteToFile(strline0);
        }


        return 1;
}



#include "CFind_Offset.h"
#include "HexStrToBytes.h"

//相等时返回0
int MatchCmp(const BYTE* s1, const BYTE*s2,  const BYTE* star1, size_t len)
{
#ifdef _DEBUG
        if (!s1 || !s2 || !star1)
        {
                MessageBoxA(0,"Error指针参数为NULL","MatchCmp", 0);
        }
#endif

        size_t i = 0;
        for (i = 0; i < len; i++)
        {
           if (star1[i] || (s1[i] == s2[i])) //是通配符                 memcmp
           {   
                 //  printf("star1[%d]=%02X s1,s2<02X,%02X>\r\n", star1[i], s1[i], s2[i]);
                   continue;  

           }else
           {
                   break;
           }
        }

        //printf("i=%zd len=%zd\r\n",i,len);
    if (i==len)
    {
                return 0;        //相等
        }
        else
        {
                return(int)i+1; //不等
        }
         
}
INT_PTR  CFind_Offset::MatchSearch(IN const char*特征码带通配符, IN  INT_PTR 特征码偏移, IN  BYTE 指令长度, IN  BYTE 指令前缀长度)
{
        UINT_PTR base = GetExeBase();
        PBYTE pexebuf = 0;
        size_t nSizeExe = 0;
        GetExeData(pexebuf, nSizeExe);

        // // CFind_Offset_MatchSearch
        INT_PTR nOffset = 0;
        {
                //char 特征码带通配符[] = "48 8B 15ZZ**??**FF 90 48080000 48 83 BF C8040000 00";          //11223355667788AAXX88                  
                BYTE features[256];                          
                BYTE star1[256] = { 0 };                           
                size_t nsize1 = HexStrToBytesEx(特征码带通配符,OUT features, sizeof(features), OUT star1);
                 

                if (nSizeExe&&nsize1)
                {
                        for (size_t i = 0; i < nSizeExe- nsize1; i++)
                        {           //int MatchCmp(const BYTE* s1, const BYTE*s2,  const BYTE* star1, size_t len)
                                int iret = MatchCmp(pexebuf + i, features, star1, nsize1);
                                if (iret == 0)
                                {
                                        nOffset = i;
                                        break;
                                }
                        }
                }


        }



        //找到了特征码位置
        if (nOffset)
        {
                INT_PTR 指令地址 = nOffset + 特征码偏移;
                DWORD *偏移 = (DWORD*)(pexebuf + 指令地址 + 指令前缀长度);

                //printf("//nOffset=%zX 特征码偏移=%zX <%zX,%d,%X>=%zX\r\n", nOffset, 特征码偏移, 指令地址,指令长度 , 偏移[0]
                //, 指令地址 + 指令长度 + 偏移[0]);

                nOffset = (DWORD)(指令地址 + 指令长度 + 偏移[0]);        //会存在溢出的情况
//#ifdef _DEBUG
//                printf("//%s> 搜索结果<%zX,%zX>\r\n", 特征码带通配符, base + nOffset, nOffset);
//                printf("//指令地址=<%zX,%zX> nOffset=<%zX,%zX>\r\n", base + 指令地址, 指令地址, base + nOffset, nOffset);
//#endif // _DEBUG
        }



        return nOffset;
}

int  WriteToFile(const char* szLine)
{
        const char* sFilePath = "基址偏移.h";
        //printf("sFilePath=%s line=%d \n", sFilePath,__LINE__);
        //FileRename(sFilePath);

        FILE* fp = 0;
        fopen_s(&fp,sFilePath, "ab+"); //w+ 清新后写 a+ 在文件尾追加写
        if (fp == NULL)
        {
                return -1;
        }
        fwrite(szLine, strlen(szLine), 1, fp);
        fclose(fp);
        return 0;
}


INT_PTR  CFind_Offset::MatchSearch(
        IN const char *变量名,
        IN const char*特征码带通配符,
        IN  INT_PTR 特征码偏移,
        IN  BYTE 指令长度,
        IN  BYTE 指令前缀长度)
{
         char buf[512];
         UINT_PTR exeBase=GetExeBase();
         INT_PTR nOffset = MatchSearch(特征码带通配符, 特征码偏移, 指令长度, 指令前缀长度);
         sprintf_s(buf,"const UINT_PTR %s =0x%zX; // %zX >%s<%zd,%d,%d>\r\n",
                 变量名,
                 nOffset,
                 exeBase+nOffset,特征码带通配符 ,特征码偏移, 指令长度, 指令前缀长度);
         //写文件
         printf(buf);
         WriteToFile(buf);
         return nOffset;
}

          


#pragma once
const UINT_PTR CALL02_OFFSET_取任务对象 =0xF431D0; // 1400531D0 >488D8FE0020000488B01FF5030<31,5,1>
const UINT_PTR CALL01_RCX_OFFSET_取任务对象 =0x12072E0; // 1403172E0 >488D8FE0020000488B01FF5030<18,5,1>
const UINT_PTR CALL_OFFSET_明文包 =0x12FE530; // 14040E530 >41B888130000488D542430488B4808<15,5,1>
const UINT_PTR CALL_RCX_OFFSET_明文包 =0x5D29FE8; // 144E39FE8 >41B888130000488D542430488B4808<-7,7,3>
const UINT_PTR CALL_OFFSET_背包物品使用 =0x1178980; // 140288980 >440FB68710030000488B93B0000000488BCBE8<18,5,1>
const UINT_PTR CALL_OFFSET_使用背包物品01 =0x9C7010; // 13FAD7010 >488BC8450FB6CD41B801000000488BD3E8<16,5,1>
const UINT_PTR CALL_RCX_OFFSET_使用背包物品01 =0x6E4400; // 13F7F4400 >488BC8450FB6CD41B801000000488BD3E8<-5,5,1>
const UINT_PTR CALL_OFFSET_选怪CALL01 =0x8FDA40; // 13FA0DA40 >0F28B424F0000000488B8338030000<-5,5,1>
const UINT_PTR CALL_OFFSET_选怪CALL02 =0x8E7BC0; // 13F9F7BC0 >0F28B424F0000000488B8338030000<-16,5,1>
const UINT_PTR CALL_OFFSET_取控件对象 =0x1D67F00; // 140E77F00 >4C8B4310488BD7488BC8488B5C24304883C4205F49FFE0<-5,5,1>
const UINT_PTR CALL_OFFSET_寻路 =0xA06A60; // 13FB16A60 >C6442428028944242CF20F10833C060000<60,5,1>
const UINT_PTR CALL_OFFSET_按键 =0x1DA30E0; // 140EB30E0 >33C04889BEF00100004889BEF8010000898611010000<48,7,3>
const UINT_PTR CALL_OFFSET01_采集 =0x6E4400; // 13F7F4400 >4488642428C7442420000000004533C941B001<-8,5,1>
const UINT_PTR CALL_OFFSET02_采集 =0x9AE9D0; // 13FABE9D0 >4488642428C7442420000000004533C941B001<22,5,1>
const UINT_PTR OFFSET_怪物人物采集物对象ID数组 =0x5D2AF30; // 144E3AF30 >32C04D85C07408410FB68080060000<-7,7,3>
const UINT_PTR OFFSET_所有对象数组 =0x5E0FB30; // 144F1FB30 >33C08B4008C1E81DA8010F85<-23,7,3>
const UINT_PTR OFFSET_人物属性对象A =0x5D29B18; // 144E39B18 >488B01FF50283D5E240000<17,7,3>
const UINT_PTR OFFSET_人物角色坐标基址 =0x5D2A540; // 144E3A540 > 48 8B 05 ********48 85 C0  74 **80 B8 88 03 00 00 0D  <0,7,3>
const UINT_PTR OFFSET_NPC_ID_LIST =0x55A2CB0; // 1446B2CB0 >488D3CD04885FF0F84A5<-7,7,3>
//>>完成所有遍历-->>OK 2021.12.30


郁金香外挂教程,学习中...
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|郁金香外挂技术-郁金香灬老师 ( 苏ICP备10059359号 )

GMT+8, 2022-1-18 17:32 , Processed in 0.039866 second(s), 17 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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