Лидеры
Популярный контент
Показан контент с высокой репутацией 07.01.2016 во всех областях
-
Надеюсь кому-нибудь это поможет. Несколько лет назад я делал RapidFire для Darksiders 2. и выкладывал таблицу под ником Alexander-mx. Но искал я очень долго значение, отвечающее за время между выстрелами, искал способом изменилось/не изменилось и тогда мне очень повезло, потому что повторить это я не смог. Сегодня решил восстановить функцию выстрела для этой игры.Не полностью восстановленная функция, но для создания RapidFire этого хватит. Остается только найти WeaponBase через патроны. int *__thiscall m_Shoot(void *this, float Shot_Time){ int WeaponBase; // esi@1 int ReturnIdWeapon; // edi@1 DWORD IDKBase; // ecx@4 int ShootingState; // eax@6 unsigned int Recoil; // eax@9 int *result; // eax@12 bool BulletCountEqual_0; // zf@20 bool BulletCountLess_0; // sf@20 int v10; // eax@20 void *IDWeapon; // [sp+10h] [bp-14h]@1 int SetShootingState; // [sp+17h] [bp-Dh]@17 int v13; // [sp+20h] [bp-4h]@16 WeaponBase = this; ReturnIdWeapon = *sub_460D85(&IDWeapon); if ( IDWeapon ) sub_1017(IDWeapon); // //Проверка кончился выстрел или нет. Если кончился предыдущий выстрел (значение WeaponBase + 0x420 будет равно 0), то можно делать следующий if ( *(WeaponBase + 0x420) > 0.0 // IDKBase + 0xD8 типа bool, при значении 1 стрельба немного быстрее, чем при 0. Возможно при значении 1 функция игнорирует остальные проверки || (IDKBase = *(WeaponBase + 0x438), !*(IDKBase + 0xD8)) && flt_1177D60 < *(WeaponBase + 0x41C) || (ShootingState = *(IDKBase + 0xD4), ShootingState != -1) && *(WeaponBase + 0x418) >= ShootingState || *(IDKBase + 0x2C) > *(WeaponBase + 0x43C) // v6 не понятно что делает,значение типа int которое меняется при стрельбе побитовым сдвигом вправо на 6, максимальное значение которого 31 с включенным rapidfire и 27 при стандартной стрельбе || (Recoil = *(WeaponBase + 0x444), (*(WeaponBase + 0x444) >> 6) & 1) ) { result = *(WeaponBase + 0x438); if ( *(result + 0x30) && *(WeaponBase + 0x3F4) > -1 ) result = sub_35C641(*(*(WeaponBase + 0x400) + 32)); } else { *(WeaponBase + 0x43C) = 0.0; if ( *(ReturnIdWeapon + 0x384) && *(WeaponBase + 0x340) <= 0 ) { result = (Recoil >> 9); if ( result & 1 ) { if ( *(WeaponBase + 0x3F4) > -1 ) result = sub_35C641(*(*(WeaponBase + 0x400) + 0x54)); } } else { if ( !(v157A220 & 1) ) { v157A220 |= 1u; v13 = 0; sub_96CB1(&unk_121C4D4, 0); sub_9B886C(&unk_114544D); v13 = -1; } // Result Возможно зашифрованное значние result = sub_35BD87(WeaponBase, 0x157A218, &Shot_Time, &SetShootingState, 0); if ( !result ) LOBYTE(SetShootingState) = 1; if ( SetShootingState ) { BulletCountEqual_0 = *(WeaponBase + 0x418) == 0; BulletCountLess_0 = *(WeaponBase + 0x418) < 0; v10 = *(WeaponBase + 0x438); Shot_Time = *(v10 + 36); *(WeaponBase + 0x420) = Shot_Time; if ( !BulletCountLess_0 && !BulletCountEqual_0 ) // Установить значение 0 для времени между выстрелами [WeaponBase + 0x420] // v10 + 40 количество выстрелов *(WeaponBase + 0x420) = *(v10 + 40) * Shot_Time; (*(*WeaponBase + 0x30C))(WeaponBase); result = sub_361811(WeaponBase); } } } return result;}2 балла
-
(Впервые пишу статью, так что критика приветствуется. Многие наверное знают этот способ.) Итак, для начала нам нужно зайти в свойства игры в Steam Параметры запуска и прописать –insecure. «-insecure» отключает VAC, и мы можем спокойно начинать взлом, не боясь, что нас забанят. Не забудьте удалить это иначе не пустит на сервера. В поиске мы должны будем найти игроков, которые отражаются на карте в момент приближения к ним. Искать лучше тип «Byte» 1 видим противника на радаре, 0 не видим. У меня нашелся 1 адрес. Выделяем адрес и нажимаем F5 или ПКМ по адресу и Find out what accesses this address. Вызывается всего одна инструкция. Что же она делает? Она записывает в 8 битный регистр AL значение 1 или 0 в зависимости от того виден ли противник на радаре или нет. Так же видим регистры EDI и ESI.ESI используется как адрес источника. Значит это базовый адрес. EDI- адрес назначения в этой инструкции и по его значению видим, что это ID игрока. Структура инструкции выглядит следующим образом [Базовый адрес + ID игрока + 0xD8D] и пишется в нее значение типа BYTE. Что с этим можно сделать? Например запустить цикл с перебором всех игроков. void DrawingPlayers() { DWORD esi; bool enable = true; ReadProcessMemory(hProcess, (LPVOID)(ClientDll + 0x4CC068), &esi, sizeof(DWORD), 0); for (int index = 0; index < 64; ++index) { WriteProcessMemory(hProcess, (LPVOID)(esi + index + 0xD8D), &enable, sizeof(bool), 0); } }1 балл
-
Результат В CE появилась новая функция в классе DessectCode, которая позволяет получить список функций. -- 1. Поиск адресов функций и ссылок на них-- 2. Вывод результата на консольprocessName = 'test.exe' -- подключенный заранее процесс (у вас другой)function convert(T) local tmp={} for k,v in pairs(T) do tmp[#tmp+1]={k,v} end table.sort(tmp,function (a, return a[1]<b[1] end) return tmpendif (dissectCode == nil) then dissectCode = getDissectCode()enddissectCode.clear()dissectCode.dissect(processName)-- Получить таблицу адресов функцийtableReferencedFunctions = dissectCode.getReferencedFunctions()local is64Bit = targetIs64Bit()stringlist = createStringlist()for i = 1, #tableReferencedFunctions do -- Выводим адрес функции if(is64Bit) then stringlist.add(string.format('%016X:', tableReferencedFunctions[i])) else stringlist.add(string.format('%08X:', tableReferencedFunctions[i])) end tableRefData = dissectCode.getReferences(tableReferencedFunctions[i]) referencesConv = convert(tableRefData) -- Выводим адреса инструкций, которые ссылаются на адрес функции for j=1,#referencesConv do local ref = referencesConv[j][1] --local refhex = string.format('%X', ref) local type = referencesConv[j][2] -- type = 0 - jtCall, -- type = 1 - jtUnconditional (jmp dword ptr [00458014], jmp 00402DDC ...) -- type = 2 - jtConditional (je 0041F2D4, jae 00414B48, jl 00414428...) -- type = 3 - jtMemory ( mov [esi+30],00422950, mov eax,0040FD4C...) stringlist.add(string.format(' %s, type : %d', disassemble(ref), type)) end endstringlist.add('')stringlist.add(string.format('Найдено функций : %d', #tableReferencedFunctions))print(stringlist.Text)stringlist.destroy()1 балл
-
В этот раз статья будет состоять из 2 частей, постараюсь дописать сразу как появится свободное время. В первой у нас будет теория о том как работает анти-чит и как можно его обмануть, во второй напишем простейший Bunnyhop. Часть 1. Теория. Немного теории о том как работает SMAC анти-чит на примере Bunnyhop.Ссылка на репозиторий анти-чита. SMAC это довольно не плохой анти-чит и к тому-же c исходным кодом.Как же анти-чит вычисляет читера? Ниже под спойлером функция обнаружения использования Bhop.1 балл
-
Простите если что, но не путайте людей, это НЕ Darkness 2 , a Darksiders 2.1 балл
-
Перед началом поиска прописываем в параметры запуска " -insecure". void NoFlash() { DWORD LocalBase; float disable = 0; ReadProcessMemory(hProcess, (LPCVOID)(Client.dll + 0x4C6708), &LocalBase, sizeof(LocalBase), 0); WriteProcessMemory(hProcess, (LPCVOID)(LocalBase + 0x1450), &disable, sizeof(disable), 0); Sleep(1); }1 балл