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

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 171|回复: 0

带通配符的特征码 搜索 特征码

[复制链接]
发表于 2021-12-29 00:42:25 | 显示全部楼层 |阅读模式




  逆风MIR4课程   
  主讲:郁金香灬老师+逆风
  QQ 150330575

  本课知识点
        C,C++特征码定位基址偏移-通配符特征搜索优化
          
          
//#define OFFSET_人物属性对象A        0x5D29B18  // 48 89 05********BE 3F000000  80 78 08 000F84 //第一个地址
//#define OFFSET_人物角色坐标基址     0x5D02B40  // 48 8B 15********FF 90 48080000 48 83 BF C8040000 00 //第二个地址是


$-27        | 48 8B 05 01 3D 64 05     | mov rax,qword ptr ds:[145079B18]  |Mir4G.exe+5D29B18=145079B18 OFFSET_人物属性对象A
$-20        | 48 85 C0                 | test rax,rax                      |
$-1D        | 75 22                    | jne mir4g.13FA35E3E               |
$-1B        | 8D 48 20                 | lea ecx,dword ptr ds:[rax+20]     |
$-18        | E8 2C 86 04 00           | call mir4g.13FA7E450              |
$-13        | 48 89 44 24 30           | mov qword ptr ss:[rsp+30],rax     |
$-E         | 48 85 C0                 | test rax,rax                      |
$-B         | 74 09                    | je mir4g.13FA35E37                |
$-9         | 48 8B C8                 | mov rcx,rax                       |
$-6         | E8 8A 28 1B 00           | call mir4g.13FBE86C0              |
$-1         | 90                       | nop                               |
Mir4G.0+6E5E37 Mir4G.0+5D29B18
$ ==>       | 48 89 05 DA 3C 64 05     | mov qword ptr ds:[145079B18],rax  | 48 89 05********BE 3F000000  80 78 08 000F84 //第一个地址
$+7         | BE 3F 00 00 00           | mov esi,3F                        |  
$+C         | 80 78 08 00              | cmp byte ptr ds:[rax+8],0         |
$+10        | 0F 84 BF 00 00 00        | je mir4g.13FA35F0C                |
$+16        | 48 8B 40 10              | mov rax,qword ptr ds:[rax+10]     |
$+1A        | 48 8B 48 70              | mov rcx,qword ptr ds:[rax+70]     |
$+1E        | 48 85 C9                 | test rcx,rcx                      |
$+21        | 74 0C                    | je mir4g.13FA35E66                |
$+23        | 8B D7                    | mov edx,edi                       |
$+25        | E8 9F 7A 18 00           | call mir4g.13FBBD900              |
$+2A        | E9 46 01 00 00           | jmp mir4g.13FA35FAC               |
$+2F        | 48 C7 45 40 00 00 00 00  | mov qword ptr ss:[rbp+40],0       |
$+37        | C7 45 50 0E 00 00 00     | mov dword ptr ss:[rbp+50],E       |
$+3E        | 48 8D 44 24 40           | lea rax,qword ptr ss:[rsp+40]     |
$+43        | 48 89 45 48              | mov qword ptr ss:[rbp+48],rax     |
$+47        | 66 89 74 24 20           | mov word ptr ss:[rsp+20],si       |
$+4C        | 41 B9 0F 00 00 00        | mov r9d,F                         |
$+52        | 4C 8D 05 78 6F 74 03     | lea r8,qword ptr ds:[14317CE08]   | 14317CE08:"GetItemDataSet"


$-18        | 0F 2F D0                 | comiss xmm2,xmm0                      |
$-15        | 72 03                    | jb mir4g.13FAD197B                    |
$-13        | 0F 28 D0                 | movaps xmm2,xmm0                      |
$-10        | 0F 2E D1                 | ucomiss xmm2,xmm1                     |
$-D         | 74 18                    | je mir4g.13FAD1998                    |
$-B         | F3 0F 11 97 A8 04 00 00  | movss dword ptr ds:[rdi+4A8],xmm2     |
$-3         | 48 8B 01                 | mov rax,qword ptr ds:[rcx]            |
$ ==>       | 48 8B 15 C6 88 5A 05     | mov rdx,qword ptr ds:[14507A258]    48 8B 15********FF 90 48080000 48 83 BF C8040000 00 //第二个地址是
$+7         | FF 90 48 08 00 00        | call qword ptr ds:[rax+848]           |
$+D         | 48 83 BF C8 04 00 00 00  | cmp qword ptr ds:[rdi+4C8],0          |
$+15        | 0F 84 FB 01 00 00        | je mir4g.13FAD1BA1                    |
$+1B        | 48 83 BF 78 04 00 00 00  | cmp qword ptr ds:[rdi+478],0          |
$+23        | 0F 84 ED 01 00 00        | je mir4g.13FAD1BA1                    |
$+29        | 48 8B 0D 85 8B 5A 05     | mov rcx,qword ptr ds:[14507A540]      |OFFSET_人物角色坐标基址
$+30        | 48 85 C9                 | test rcx,rcx                          |
$+33        | 0F 84 DD 01 00 00        | je mir4g.13FAD1BA1                    |
$+39        | 48 8B 87 30 01 00 00     | mov rax,qword ptr ds:[rdi+130]        |
$+40        | 48 85 C0                 | test rax,rax                          |
$+43        | 74 2B                    | je mir4g.13FAD19FB                    |
$+45        | 0F 10 88 00 02 00 00     | movups xmm1,xmmword ptr ds:[rax+200]  |
$+4C        | F3 0F 11 4C 24 28        | movss dword ptr ss:[rsp+28],xmm1      |
$+52        | 0F 28 C1                 | movaps xmm0,xmm1                      |
$+55        | 0F C6 C1 55              | shufps xmm0,xmm1,55                   |
$+59        | F3 0F 11 44 24 2C        | movss dword ptr ss:[rsp+2C],xmm0      |
$+5F        | 0F C6 C9 AA              | shufps xmm1,xmm1,AA                   |
$+63        | F3 0F 11 4C 24 30        | movss dword ptr ss:[rsp+30],xmm1      |
$+69        | 48 8D 44 24 28           | lea rax,qword ptr ss:[rsp+28]         |





#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;
                                }
                        }
                }


        }

#ifdef _DEBUG
        printf("%s> 搜索结果<%zX,%zX>\r\n", 特征码带通配符, base+nOffset, nOffset);
#endif // _DEBUG

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

                nOffset = 指令地址 + 指令长度 + 偏移[0];
                printf("指令地址=<%zX,%zX> nOffset=<%zX,%zX>\r\n", base+ 指令地址, 指令地址, base+nOffset, nOffset);
        }


        return nOffset;
}


// FindBaseOffset.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include "CFind_Offset.h"
#include "HexStrToBytes.h"
void 测试带通配符的特征转换()
{
        {
                char s1[] = "0x11,0x22,0x33,0x44,0x55,0xFF,0x1A,0x1b,0x1c,0x330x66";          //11223355667788AAXX88
                char s2[] = "ABCD112233**55??66";
                BYTE b1[256];
                BYTE b2[256];
                BYTE star1[256] = { 0 };
                BYTE star2[256] = { 0 };
                size_t nsize1 = HexStrToBytesEx(s1, b1, sizeof(b1), star1);
                size_t nsize2 = HexStrToBytesEx(s2, b2, sizeof(b2), star2);
                printf("nsize1=%zd,nsize2=%zd\r\n", nsize1, nsize2);
                getchar();
        }
        {
                char s1[] = "48 8B 15ZZ**??**FF 90 48080000 48 83 BF C8040000 00";          //11223355667788AAXX88
                char s2[] = "48 89 05**??****BE 3F000000  80 78 08 000F84";
                BYTE b1[256];
                BYTE b2[256];
                BYTE star1[256] = { 0 };
                BYTE star2[256] = { 0 };
                size_t nsize1 = HexStrToBytesEx(s1, b1, sizeof(b1), star1);
                size_t nsize2 = HexStrToBytesEx(s2, b2, sizeof(b2), star2);
                printf("nsize1=%zd,nsize2=%zd\r\n", nsize1, nsize2);
                getchar();

        }

}
void  OFFSET_所有对象数组();
void  OFFSET_所有对象数组02();
int main()
{
        //OFFSET_所有对象数组();
        //OFFSET_所有对象数组02();
        //测试带通配符的特征转换();
        {
                char s1[] = "48 89 05********BE 3F000000  80 78 08 000F84";          //OFFSET_人物属性对象A
                char s2[] = "48 8B 15********FF 90 48080000 48 83 BF C8040000 00";          //-2C         
                INT_PTR OFFSET_人物属性对象A = CFind_Offset::MatchSearch(s1, 0, 7, 3);        getchar();
                INT_PTR OFFSET_人物角色坐标基址 = CFind_Offset::MatchSearch(s2, 0x29, 7, 3);  getchar();
        }
   getchar();
}







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

使用道具 举报

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

本版积分规则

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

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

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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