编写雷达教程

2020-01-18 / 无评论

您需要:
visual studio
内存搜索器(我使用Cheat Engine)
调试器(我使用OllyDbg和x64dbg)

1.启动本地游戏
2.加入团队
3.在对面团队中添加一个机器人
4.设置sv_cheats 1和bot_stop 1
5.步行到机器人,以便在雷达上看到它
6.以类型1字节的形式搜索值1。
7.转身或走一点,使机器人不再显示在雷达上。
8.搜索0
9.重复步骤5至8,直到剩下几个值
然后尝试冻结其中一些,离开机器人,它应该在雷达上保持可见。
这样做直到剩下1个值。

好了,现在我打开调试器,转到我先前找到的地址。
右键单击它,然后单击断点->内存断点,然后访问
它将命中如下所示的指令:
14C41803 |> 8A8437 1D0D0000 MOV AL,BYTE PTR DS:[EDI + ESI + D1D]

删除您的内存断点并放一个常规的断点就可以了。

再添加一些机器人并在找到的1个字节之后添加地址,如果找到了例如12345030,则添加12345031 12345032 12345033 12345034等。
尝试将它们全部冻结为1,并且应该看到所有雷达上的敌人时间。

好了,现在看一下EDI和ESI中的内容。

如果我们运行/中断几次,我们会看到EDI与此类似:
EDI 00000002
EDI 00000003
EDI 00000006
很明显,它是数组中的玩家索引。

ESI 20A428A8
ESI 2725AE10
ESI应该看起来与此类似(地址的变化取决于模块的分配基础)

在内存扫描器(CE)中搜索第一个ESI值20A428A8为4个字节(请记住在十六进制框中打勾) 。

我们找到它。
断开服务器并新建一个。

现在,当我们中断
14C41803 |> 8A8437 1D0D0000 MOV AL时,BYTE PTR DS:[EDI + ESI + D1D]
检查ESI的值(我们的指针),并在CE中查看我们之前发现的某些地址是否包含新的ESI。

我发现2个静电场所此:
client.dll + 4CE070
client.dll + 4D4BA4

所以现在我们知道:
*(client.dll + 4CE070)= ESI
*(ESI +指数+ D1D)设置为1,显示在雷达上

要一定要在下次更新时找到东西。我搜索client.dll + 4CE070的地址,发现它的位置为静态的:
14B02E70 / $ A1 70E0F614 MOV EAX,DWORD PTR DS:[14F6E070]
14B02E75 |。85C0 TEST EAX,EAX
14B02E77 |。74 06 JE ​​SHORT client.14B02E7F
14B02E79 |。05 A8040000添加EAX,4A8
14B02E7E |。C3 RETN
14B02E7F |> 33C0 XOR EAX,EAX
14B02E81 。C3 RETN

因此,我们为此创建了一个字节签名,因此我们可以轻松找到它:
A1 ?? ?? ?? ?? 85 C0 74 06 05

好吧,现在让我们用C ++编写代码。

#include <Windows.h>
 
// FindPattern & DataCompare by dom1n1k
BOOL DataCompare( BYTE* pData, BYTE* bMask, char * szMask )
{
    for( ; *szMask; ++szMask, ++pData, ++bMask )
        if( *szMask == 'x' && *pData != *bMask )
            return FALSE;
 
    return ( *szMask == NULL );
}
 
DWORD FindPattern( DWORD dwAddress, DWORD dwLen, BYTE *bMask, char * szMask )
{
    for( DWORD i = 0; i < dwLen; i++ )
        if( DataCompare( (BYTE*)( dwAddress + i ), bMask, szMask ) )
            return (DWORD)( dwAddress + i );
 
    return 0;
}
 
DWORD MainThread( LPVOID lpArgs )
{
    HMODULE hClient = GetModuleHandleA( "client.dll" );
    while(hClient == NULL) { hClient = GetModuleHandleA( "client.dll" ); }
    
    DWORD dwDrawOnRadar = FindPattern((DWORD)hClient, 0x005E5000, (BYTE*)"\xA1\x00\x00\x00\x00\x85\xC0\x74\x06\x05", "x????xxxxx") + 1;
    dwDrawOnRadar = *(DWORD*)dwDrawOnRadar;
    
    while(1)
    {
        // Loop through all indexes in the array
        for(int i = 0;i < 0x4F;i++) // at 0x50 seems to be start of clan name
        {
            // Short explanation, in the code we reversed,
            // ESI is dwDrawOnRadar (pointer)
            // EDI is i (player index)
            BYTE* pDrawOnRadar = (BYTE*)((*(DWORD*)dwDrawOnRadar) + 0xD1D + i);
            
            // 1 = draw on radar
            *pDrawOnRadar = 1;
        }
 
    }
 
    return 0;
}
 
BOOL APIENTRY DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved)
{
    if(dwReason == DLL_PROCESS_ATTACH)
    {
        DWORD dwThreadID = 0;
        HANDLE hThread = CreateThread( NULL, NULL, (LPTHREAD_START_ROUTINE)MainThread, NULL, NULL, &dwThreadID );
    }
    
    return TRUE;
}

无回应:“编写雷达教程”

发表评论

电子邮件地址不会被公开。 必填项已用*标注