Перейти к содержанию

partoftheworlD

Пользователи+
  • Постов

    2 687
  • Зарегистрирован

  • Посещение

  • Победитель дней

    172

Сообщения, опубликованные partoftheworlD

  1. 5 часов назад, MasterGH сказал:

    А вот мне программа ReClass не понравилась

    CE было бы достаточно, просто привычка которая генерирует класс найденных значений. Удобно если пишешь трейнер или ленивый, чтобы выписывать значения руками.:-D

  2. 15 минуту назад, SER[G]ANT сказал:

    На Win10 x64 всё нормально

    Только пробовал не могу присоединить VEH отладчик к 64 битному процессу, тоже вин10 х64. На 6.5 работает.

  3. Используемые плагины: REtypedef

    Берем любое автоматическое оружие и находим количество патронов.

    Ставим бряк на доступ, переходим в игру и стреляем.

    rE5yaXwGChs.jpg

    Нам нужна инструкция, отнимающая патроны, так мы выйдем на функцию выстрела.

    7FFBCE59564A - FF 8F 98000000  - dec [rdi+00000098] <<

    Дальше делаем дамп Disrupt_b64.dll, запускаем IDA и ждем пока завершится анализ.

    Переходим по адресу 7FFBCE59564A, мы находимся в функции, которая отнимает патроны, значит нам надо посмотреть откуда она вызывается.

    UHJ5Bo_CBSw.jpg

    Поднимаемся к началу функции видим надпись CODE XREF: переходим по ней дважды кликнув.

    0gmhBIIIQu0.jpg

    Теперь мы находимся в функции выстрела.

    Нажимаем F5, чтобы декомпилировать функцию в псевдокод.

    6GD6LfarIAo.jpg

    Видим, что переменная v1 очень часто используется, скорее всего это базовый адрес. Можно его реконструировать в структуру, для повышения читабельности псевдокода.

    wyDGAVB80eQ.jpg

    Для того чтобы найти скорострельность, надо найти все условия, работающие с типом float, как их проверить? Лучше всего использовать ReClass. Где взять базовый адрес? использовать адрес регистра rdi в нем будет находится базовый адрес текущего оружия.

    Я нашел всего 2 условия которые бы нам подходили:

    if ( a3 <= *&WeaponBase->field_34 && *&WeaponBase->field_56 <= 0.0 )
    if ( WeaponBase->field_152 && *&WeaponBase->field_904 > 0.0 )

    После реконструкции типа базового адреса, автоматически дописывается смещение т.е

    Field_34 это 0x34 и т.д. Значит нам надо проверить 0x34, 0x56, 0x152 , 0x904.

    e5gm8d-5v_Q.jpg

    Единственное смещение, которое реагировало на выстрелы оказалось 0x34.
     

    Теперь добавляем в таблицу базовый адрес оружия + 0x34, ставим бряк на доступ выбираем

    F3 41 0F11 4C 24 34  - movss [r12+34],xmm1 <<

    И пишем на нее скрипт.

    cmp [r12+98],#10 //фильтр свой-чужой
    jne code
    mov [r12+34],(float)99 //любое значение больше 5

     

    Скрытый текст

     

     

     

    • Плюс 2
  4.  

    Наконец-то появилось время и желание что-нибудь поломать, но раз в игре почти все взломано, хочется чего-то веселого. В общем, если будет кому интересно, могу написать тутор как искал. Скорострельность работает, пока только на автоматическом оружии, есть желание сделать все оружие автоматическим и анти-отдачу иначе играть не возможно:-D .

    Ладно хватит слов, приятного просмотра.

     

     

     

    Скрипты:

    1.Rapidfire

    2.Анти-отдача

    3.Автострельба

    Rapidfire
    
    { Game   : watch_dogs.exe
      Version: 
      Date   : 2016-05-13
      Author : partoftheworlD
    
      This script does blah blah blah
    }
    
    [ENABLE]
    //code from here to '[DISABLE]' will be used to enable the cheat
    
     
     
    aobscanmodule(rapidf,Disrupt_b64.dll,F3 41 0F 11 4C 24 34 76) // should be unique
    alloc(newmem,$1000,"Disrupt_b64.dll"+183A812)
    
    label(code)
    label(return)
    
    newmem:
      push r13
      mov r13,[r12+60]
      cmp byte ptr [r13+20],07
      pop r13
      jne code
      mov [r12+34],(float)99
      jmp return
    code:
      movss [r12+34],xmm1
      jmp return
    
    rapidf:
      jmp newmem
      nop
      nop
    return:
    registersymbol(rapidf)
    
    [DISABLE]
    //code from here till the end of the code will be used to disable the cheat
    rapidf:
      db F3 41 0F 11 4C 24 34
    
    unregistersymbol(rapidf)
    dealloc(newmem)
    
    {
    // ORIGINAL CODE - INJECTION POINT: "Disrupt_b64.dll"+183A812
    
    "Disrupt_b64.dll"+183A7D3: E8 98 2D FF FF              -  call Disrupt_b64.dll+182D570
    "Disrupt_b64.dll"+183A7D8: 4C 8B 7C 24 70              -  mov r15,[rsp+70]
    "Disrupt_b64.dll"+183A7DD: F3 41 0F 10 44 24 38        -  movss xmm0,[r12+38]
    "Disrupt_b64.dll"+183A7E4: 0F 28 CE                    -  movaps xmm1,xmm6
    "Disrupt_b64.dll"+183A7E7: 0F 2F 05 72 33 4C 01        -  comiss xmm0,[Disrupt_b64.dll+2CFDB60]
    "Disrupt_b64.dll"+183A7EE: F3 41 0F 58 4C 24 34        -  addss xmm1,[r12+34]
    "Disrupt_b64.dll"+183A7F5: 4C 8B 74 24 78              -  mov r14,[rsp+78]
    "Disrupt_b64.dll"+183A7FA: 4C 8B AC 24 80 00 00 00     -  mov r13,[rsp+00000080]
    "Disrupt_b64.dll"+183A802: 48 8B BC 24 88 00 00 00     -  mov rdi,[rsp+00000088]
    "Disrupt_b64.dll"+183A80A: 48 8B 9C 24 C0 00 00 00     -  mov rbx,[rsp+000000C0]
    // ---------- INJECTING HERE ----------
    "Disrupt_b64.dll"+183A812: F3 41 0F 11 4C 24 34        -  movss [r12+34],xmm1
    // ---------- DONE INJECTING  ----------
    "Disrupt_b64.dll"+183A819: 76 0B                       -  jna Disrupt_b64.dll+183A826
    "Disrupt_b64.dll"+183A81B: F3 0F 5C C6                 -  subss xmm0,xmm6
    "Disrupt_b64.dll"+183A81F: F3 41 0F 11 44 24 38        -  movss [r12+38],xmm0
    "Disrupt_b64.dll"+183A826: 0F 28 C6                    -  movaps xmm0,xmm6
    "Disrupt_b64.dll"+183A829: F3 41 0F 58 44 24 3C        -  addss xmm0,[r12+3C]
    "Disrupt_b64.dll"+183A830: F3 41 0F 11 44 24 3C        -  movss [r12+3C],xmm0
    "Disrupt_b64.dll"+183A837: 0F 2F 0D 22 E6 CC 01        -  comiss xmm1,[Disrupt_b64.dll+3508E60]
    "Disrupt_b64.dll"+183A83E: 76 19                       -  jna Disrupt_b64.dll+183A859
    "Disrupt_b64.dll"+183A840: 49 C7 44 24 40 00 00 00 00  -  mov [r12+40],00000000
    "Disrupt_b64.dll"+183A849: 0F 28 74 24 60              -  movaps xmm6,[rsp+60]
    }

     

     

    Анти-отдача
    
    { Game   : watch_dogs.exe
      Version: 
      Date   : 2016-05-13
      Author : partoftheworlD
    
      This script does blah blah blah
    }
    
    [ENABLE]
    
    aobscanmodule(norecoil_y,Disrupt_b64.dll,49 89 44 24 08 48 8D 45 A0) // should be unique
    aobscanmodule(norecoil_x,Disrupt_b64.dll,4D 89 5C 24 08 4C 89 1A) // should be unique
    alloc(newmem_x,$1000,"Disrupt_b64.dll"+18445BD)
    alloc(newmem_Y,$1000,"Disrupt_b64.dll"+1844542)
    
    label(code_y)
    label(code_x)
    
    label(return_y)
    label(return_x)
    
    newmem_Y:
      jmp return_y
    code_y:
      mov [r12+08],rax
      jmp return_y
    newmem_x:
      jmp return_x
    code_x:
      mov [r12+08],r11
      jmp return_x
    
    norecoil_x:
       jmp newmem_x
    return_x:
    registersymbol(norecoil_x)
    
    norecoil_y:
      jmp newmem_Y
    return_y:
    registersymbol(norecoil_y)
    
    [DISABLE]
    
    norecoil_y:
      db 49 89 44 24 08
    norecoil_x:
      db 4D 89 5C 24 08
    
    unregistersymbol(norecoil_y)
    unregistersymbol(norecoil_x)
    dealloc(newmem_Y)
    dealloc(newmem_x)
    
    
    {
    // ORIGINAL CODE - INJECTION POINT: "Disrupt_b64.dll"+1844542
    
    "Disrupt_b64.dll"+184451A: 8D 4A 50              -  lea ecx,[rdx+50]
    "Disrupt_b64.dll"+184451D: 4D 8B E1              -  mov r12,r9
    "Disrupt_b64.dll"+1844520: 49 8B D8              -  mov rbx,r8
    "Disrupt_b64.dll"+1844523: E8 28 62 90 FE        -  call Disrupt_b64.dll+14A750
    "Disrupt_b64.dll"+1844528: 48 8B 55 30           -  mov rdx,[rbp+30]
    "Disrupt_b64.dll"+184452C: F3 0F 10 4B 14        -  movss xmm1,[rbx+14]
    "Disrupt_b64.dll"+1844531: 4C 8B D8              -  mov r11,rax
    "Disrupt_b64.dll"+1844534: 48 8D 45 A0           -  lea rax,[rbp-60]
    "Disrupt_b64.dll"+1844538: F3 0F 11 4D C4        -  movss [rbp-3C],xmm1
    "Disrupt_b64.dll"+184453D: F3 0F 10 4B 1C        -  movss xmm1,[rbx+1C]
    // ---------- INJECTING HERE ----------
    "Disrupt_b64.dll"+1844542: 49 89 44 24 08        -  mov [r12+08],rax
    // ---------- DONE INJECTING  ----------
    "Disrupt_b64.dll"+1844547: 48 8D 45 A0           -  lea rax,[rbp-60]
    "Disrupt_b64.dll"+184454B: F3 0F 11 4D CC        -  movss [rbp-34],xmm1
    "Disrupt_b64.dll"+1844550: 48 89 02              -  mov [rdx],rax
    "Disrupt_b64.dll"+1844553: 48 8B 43 20           -  mov rax,[rbx+20]
    "Disrupt_b64.dll"+1844557: 8B 4B 04              -  mov ecx,[rbx+04]
    "Disrupt_b64.dll"+184455A: F3 0F 10 43 08        -  movss xmm0,[rbx+08]
    "Disrupt_b64.dll"+184455F: F3 0F 11 45 B8        -  movss [rbp-48],xmm0
    "Disrupt_b64.dll"+1844564: F3 0F 10 43 10        -  movss xmm0,[rbx+10]
    "Disrupt_b64.dll"+1844569: 44 8B 03              -  mov r8d,[rbx]
    "Disrupt_b64.dll"+184456C: 48 89 45 D0           -  mov [rbp-30],rax
    }

     

    Скрытый текст
    
    { Game   : watch_dogs.exe
      Version: 
      Date   : 2016-05-13
      Author : partoftheworlD
    
      This script does blah blah blah
    }
    
    [ENABLE]
    
    aobscanmodule(Autoshot,Disrupt_b64.dll,C6 43 49 01 0F 28 BC 24 D0 00 00 00) // should be unique
    alloc(newmem,$1000,"Disrupt_b64.dll"+1838C67)
    
    label(code)
    label(return)
    
    registersymbol(Autoshot)
    
    newmem:
      mov byte ptr [rbx+49],00
      movaps xmm7,[rsp+000000D0]
      jmp return
    code:
      mov byte ptr [rbx+49],01
      movaps xmm7,[rsp+000000D0]
      jmp return
    
    Autoshot:
      jmp newmem
      nop
      nop
      nop
      nop
      nop
      nop
      nop
    return:
    
    [DISABLE]
    
    Autoshot:
      db C6 43 49 01 0F 28 BC 24 D0 00 00 00
    
    unregistersymbol(Autoshot)
    dealloc(newmem)
    
    {
    // ORIGINAL CODE - INJECTION POINT: "Disrupt_b64.dll"+1838C67
    
    "Disrupt_b64.dll"+1838C3E: 80 78 5C 00                 -  cmp byte ptr [rax+5C],00
    "Disrupt_b64.dll"+1838C42: 74 09                       -  je Disrupt_b64.dll+1838C4D
    "Disrupt_b64.dll"+1838C44: 8B 40 60                    -  mov eax,[rax+60]
    "Disrupt_b64.dll"+1838C47: 89 83 90 00 00 00           -  mov [rbx+00000090],eax
    "Disrupt_b64.dll"+1838C4D: 4C 8D 44 24 40              -  lea r8,[rsp+40]
    "Disrupt_b64.dll"+1838C52: 48 8D 54 24 30              -  lea rdx,[rsp+30]
    "Disrupt_b64.dll"+1838C57: 41 B1 01                    -  mov cl,01
    "Disrupt_b64.dll"+1838C5A: 48 8B CB                    -  mov rcx,rbx
    "Disrupt_b64.dll"+1838C5D: 44 89 74 24 20              -  mov [rsp+20],r14d
    "Disrupt_b64.dll"+1838C62: E8 D9 D1 FF FF              -  call Disrupt_b64.dll+1835E40
    // ---------- INJECTING HERE ----------
    "Disrupt_b64.dll"+1838C67: C6 43 49 01                 -  mov byte ptr [rbx+49],01
    "Disrupt_b64.dll"+1838C6B: 0F 28 BC 24 D0 00 00 00     -  movaps xmm7,[rsp+000000D0]
    // ---------- DONE INJECTING  ----------
    "Disrupt_b64.dll"+1838C73: 0F 28 B4 24 E0 00 00 00     -  movaps xmm6,[rsp+000000E0]
    "Disrupt_b64.dll"+1838C7B: 44 0F 28 84 24 C0 00 00 00  -  movaps xmm8,[rsp+000000C0]
    "Disrupt_b64.dll"+1838C84: 48 8B B4 24 28 01 00 00     -  mov rsi,[rsp+00000128]
    "Disrupt_b64.dll"+1838C8C: 48 8B BC 24 30 01 00 00     -  mov rdi,[rsp+00000130]
    "Disrupt_b64.dll"+1838C94: 49 8B 5D 00                 -  mov rbx,[r13+00]
    "Disrupt_b64.dll"+1838C98: 4C 8B B4 24 F0 00 00 00     -  mov r14,[rsp+000000F0]
    "Disrupt_b64.dll"+1838CA0: 4C 8B A4 24 00 01 00 00     -  mov r12,[rsp+00000100]
    "Disrupt_b64.dll"+1838CA8: FF 4B 18                    -  dec [rbx+18]
    "Disrupt_b64.dll"+1838CAB: 4C 8B AC 24 F8 00 00 00     -  mov r13,[rsp+000000F8]
    "Disrupt_b64.dll"+1838CB3: 75 10                       -  jne Disrupt_b64.dll+1838CC5
    }

     

     

    • Плюс 1
  5. Скрытый текст
    
    #include <windows.h>
    #include <vector>
    #include <algorithm>
    
    typedef struct _PEB_LDR_DATA {
    	UINT8 _PADDING_[12];
    	LIST_ENTRY InLoadOrderModuleList;
    	LIST_ENTRY InMemoryOrderModuleList;
    	LIST_ENTRY InInitializationOrderModuleList;
    } PEB_LDR_DATA, *PPEB_LDR_DATA;
    
    typedef struct _PEB {
    #ifdef _WIN64
    	UINT8 _PADDING_[24];
    #else
    	UINT8 _PADDING_[12];
    #endif
    	PEB_LDR_DATA* Ldr;
    } PEB, *PPEB;
    
    typedef struct _LDR_DATA_TABLE_ENTRY {
    	LIST_ENTRY InLoadOrderLinks;
    	LIST_ENTRY InMemoryOrderLinks;
    	LIST_ENTRY InInitializationOrderLinks;
    	VOID* DllBase;
    } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
    
    typedef struct _UNLINKED_MODULE
    {
    	HMODULE hModule;
    	PLIST_ENTRY RealInLoadOrderLinks;
    	PLIST_ENTRY RealInMemoryOrderLinks;
    	PLIST_ENTRY RealInInitializationOrderLinks;
    	PLDR_DATA_TABLE_ENTRY Entry;
    } UNLINKED_MODULE;
    
    #define UNLINK(x)					\
    	(x).Flink->Blink = (x).Blink;	\
    	(x).Blink->Flink = (x).Flink;
    
    #define RELINK(x, real)			\
    	(x).Flink->Blink = (real);	\
    	(x).Blink->Flink = (real);	\
    	(real)->Blink = (x).Blink;	\
    	(real)->Flink = (x).Flink;
    
    std::vector<UNLINKED_MODULE> UnlinkedModules;
    
    struct FindModuleHandle
    {
    	HMODULE m_hModule;
    	FindModuleHandle(HMODULE hModule) : m_hModule(hModule)
    	{
    	}
    	bool operator() (UNLINKED_MODULE const &Module) const
    	{
    		return (Module.hModule == m_hModule);
    	}
    };
    
    void RelinkModuleToPEB(HMODULE hModule)
    {
    	std::vector<UNLINKED_MODULE>::iterator it = std::find_if(UnlinkedModules.begin(), UnlinkedModules.end(), FindModuleHandle(hModule));
    
    	if (it == UnlinkedModules.end())
    	{
    		return;
    	}
    
    	RELINK((*it).Entry->InLoadOrderLinks, (*it).RealInLoadOrderLinks);
    	RELINK((*it).Entry->InInitializationOrderLinks, (*it).RealInInitializationOrderLinks);
    	RELINK((*it).Entry->InMemoryOrderLinks, (*it).RealInMemoryOrderLinks);
    	UnlinkedModules.erase(it);
    }
    
    void UnlinkModuleFromPEB(HMODULE hModule)
    {
    	std::vector<UNLINKED_MODULE>::iterator it = std::find_if(UnlinkedModules.begin(), UnlinkedModules.end(), FindModuleHandle(hModule));
    	if (it != UnlinkedModules.end())
    	{
    		return;
    	}
    
    #ifdef _WIN64
    	PPEB pPEB = (PPEB)__readgsqword(0x60);
    #else
    	PPEB pPEB = (PPEB)__readfsdword(0x30);
    #endif
    
    	PLIST_ENTRY CurrentEntry = pPEB->Ldr->InLoadOrderModuleList.Flink;
    	PLDR_DATA_TABLE_ENTRY Current = NULL;
    
    	while (CurrentEntry != &pPEB->Ldr->InLoadOrderModuleList && CurrentEntry != NULL)
    	{
    		Current = CONTAINING_RECORD(CurrentEntry, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
    		if (Current->DllBase == hModule)
    		{
    			UNLINKED_MODULE CurrentModule = { 0 };
    			CurrentModule.hModule = hModule;
    			CurrentModule.RealInLoadOrderLinks = Current->InLoadOrderLinks.Blink->Flink;
    			CurrentModule.RealInInitializationOrderLinks = Current->InInitializationOrderLinks.Blink->Flink;
    			CurrentModule.RealInMemoryOrderLinks = Current->InMemoryOrderLinks.Blink->Flink;
    			CurrentModule.Entry = Current;
    			UnlinkedModules.push_back(CurrentModule);
    
    			UNLINK(Current->InLoadOrderLinks);
    			UNLINK(Current->InInitializationOrderLinks);
    			UNLINK(Current->InMemoryOrderLinks);
    
    			break;
    		}
    
    		CurrentEntry = CurrentEntry->Flink;
    	}
    }

     

    Одно время пришлось долго искать, так что вдруг кому пригодится.

    Для использования добавить в DllMain:

    UnlinkModuleFromPEB(hInstDll);
    • Плюс 1
  6. https://www.easyanticheat.net/features/
    Во втором абзаце написано как он определяет "чит".

    А в общем, то:

    • забыть про dll, если не обойтись, то позаботиться об изменении хеша и скрытии заголовков dll.
    • не менять .rdata и .text секции.
    • не менять значения консольных команд.
    • если будешь что-то рисовать, на всякий случай используй оверлей или cleanscreen пиши, вдруг анти-чит делает скриншоты как Punkbuster.

     

  7. Скрытый текст
    
    int getRandom()
      {
        return 98 + new Random(System.nanoTime()).nextInt(25);
      }
      
      String hasher(int paramInt)
      {
        String str1 = String.valueOf(paramInt);
        String str2 = new String();
        int i = 0;
        if (i >= str1.length()) {}
        for (String str3 = (char)getRandom() + str2 + (char)getRandom();; str3 = str3.substring(0, str3.length() / 2) + (char)getRandom() + str3.substring(str3.length() / 2, str3.length())) {
          if (str3.length() >= 15)
          {
            return str3;
            int j = str1.charAt(i);
            if (j == 48) {}
            for (str2 = str2 + 'a';; str2 = str2 + j * 3)
            {
              i++;
              break;
            }
          }
        }
      }
      
      String hasher(long paramLong)
      {
        String str1 = String.valueOf(paramLong);
        String str2 = new String();
        int i = 0;
        if (i >= str1.length()) {}
        for (String str3 = (char)getRandom() + str2 + (char)getRandom();; str3 = str3.substring(0, str3.length() / 2) + (char)getRandom() + str3.substring(str3.length() / 2, str3.length())) {
          if (str3.length() >= 15)
          {
            return str3;
            int j = str1.charAt(i);
            if (j == 48) {}
            for (str2 = str2 + 'a';; str2 = str2 + j * 3)
            {
              i++;
              break;
            }
          }
        }
      }

     

    Разобрал apk нашел шифровку сохранений, но ios-вский бинарник еще нужен.

  8. Нужна помощь, тех у кого джеилбрейк и кто может с помощью Clutch декомпилировать бинарник игры.

    В общем в игре Cимулятор Гаишника используется интересный способ защиты от изменения данных с помощью сравнивания хешей.

    Есть база данных(SQL Lite 3) со всеми значениями.
    wa9Z-5c0rRk.jpg

    Хочу найти функцию которая генерирует хэши и подменить на свои значения.

  9. Так

    у тебя будет вместо 12-ой виртуальной функции, 37 вроде бы точно сейчас не скажу. В IDA можно уточнить скачав плагин Class informer и игру под macos, там все функции с отладочной информацией идут т.е подписаны. 

    или искать C_BaseAnimating::SetupBones это будет начало функции и смотреть по коду, если в асме разбираешься, восстановишь функцию и быстро найдешь.(SDK в помощь) Инструкция будет выглядеть как-то так:

    mov [esi+смещение], eax(ecx было в соурс)

    EntityBase(esi) + смещение = C_BaseAnimating::SetupBones

  10. unsigned char* trampoline = nullptr;

    Попробуй закоментить эту строку , а вообще лучше отладчиком пройдись, чтобы найти проблему.
    По коду trampoline обнуляется в main и используешь уже 0, вместо расчета обратного прыжка

    trampoline = reinterpret_cast<unsigned char*> (HookHelper::Alloc(totalLen + 5, PAGE_EXECUTE_READWRITE));

    и скорее всего не там восстанавливается функция.

  11. Как на счет вырвать функцию работы с сохранениями из игры, а потом делать уже редактор. Например скинул сэйв в свою программу, открыл(расшифровал, если используется какой-нибудь алгоритм), изменил(зашифровал), сохранил. Или использовать сигнатуры для поиска нужных байт и с помощью memcpy изменять байты на нужные. 

  12. Можешь поискать структуру оружия обычно в ней все характеристики Если в игре есть улучшения, то можно попробовать улучшать скорострельность и искать неизвестное типа float (Изменилось/Неизменилось). Просто ты не расписал какими способами уже искал. Поиском может ничего и не найти в зависимости от игры, например в L4D2 там значение скорострельности подгружается с модулем и не меняется т.е всегда значение 0,35 для дробовика например.

×
×
  • Создать...

Важная информация

Находясь на нашем сайте, Вы автоматически соглашаетесь соблюдать наши Условия использования.