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

partoftheworlD

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

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

  • Посещение

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

    172

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

  1. Ничего не понял ты как я погляжу... Ок объясню: там где процесс для трейнера выберается можно и руками ввести процесс это 1, 2 для игр в браузере процесс ищется с помощью combobox а для него нафиг не нужен работающий браузер. Достаточно иметь нужный и работающий скрипт!

    Забавно написано, либо я не понял что тут написано, либо не понимаю как работают скрипты с браузерными играми.

  2. Кто-нибудь пользовался radare 2 под виндой, а то все расхваливают этот фреймворк? И нет готовых сборок? А то не хочется виртуалку ставить ради сборки под win.

  3. partoftheworlD, пока не уловил, как это использовать, если сможешь, пример на моём скрипте сделай ПЖЛСТа

    Скажу глупость скорее всего, но вроде как тебе надо сделать проверку по ESP. в него записываются 4 байта которые и есть адрес возврата, если условие проверки не выполнится, то сделать переход или что-нибудь вывести. 

     

    Наверное будет проще написать на C++ программу которая проверяет исключения и выводит адрес и текущее значение, а потом уже подходящие значения добавить в СЕ.

  4. partoftheworlD, вроде мой, но ни чё к сожалению не понял. %)  

    partoftheworlD, интересно, а можно его переделать на LUA, чтобы вставить в СE-скрипт?

    Вот нашел, передача аргументов через стек наиболее часто используется для передачи аргументов при вызове процедур. Суть этого способа заключается в том, что вызывающая процедура самостоятельно заносит в стек передаваемые данные, после чего передает управление вызываемой процедуре. При передаче управления процедуре микропроцессор автоматически записывает в вершину стека 4 байта. Эти байты являются адресом возврата в вызывающую программу. Если перед передачей управления процедуре командой call в стек были записаны переданные процедуре данные или указатели на них, то они окажутся под адресом возврата.

    Стек обслуживается тремя регистрами:

    • ESS - указатель дна стека (начала сегмента стека);
    • ESP - указатель вершины стека;
    • EBP - указатель базы.
  5. Время для ночной статьи :-D .Последнее время, я заинтересовался не просто поиском значение и созданием трейнера, а тем как работает функция, которую я нашел. В этой статье я расскажу, как сделать использование телепорта без перезарядки и изменение дальности прыжка при телепортации. 

    Для поиска
    Перезарядка: 
    F3 0F 11 81 ? ? ? ? F3 0F 10 48 ? 0F 2F C1 76 0D F3 0F 11 89 ? ? ? ?

    Дальность   : D8 86 ? ? ? ? D9 9E ? ? ? ? D9 40 08 D9 9E ? ? ? ? D8 48 08 D8 86 ? ? ? ? D9 9E ? ? ? ?
     

    Сразу покажу коды.

     

     

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

     

    UAyxTOPXxNs.jpg

     

     

     

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

    1Q-D2zSOFv4.jpg

     

     

    Функция перезарядки для телепорта это значение типа float от 0 до 1.  На скриншоте можно увидеть, условие если Current_time больше, чем v1, то устанавливаем значение 1 и ждем пока перезарядится умение. Для того чтобы сделать телепорт без перезарядки установим 1 по адресу (BaseAddress + 0x138).

     

    Следующая функция выглядит куда интересней. Как я понял она отвечает, только за дальность использования телепорта и подсветку того места куда мы собираемся переместиться. По адресу [pBase + 0x90] храниться максимальное расстояние(1600), для телепорта которое загружается с загрузкой игры. [pBase + 0x104] реальное значение. Базовый адрес у перезарядки и дальности одинаковый. И так результаты.

     

     

     

     

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

     

     

    • Плюс 2
  6. вопрос к моему же взлому.ну в общем скрипты основаны на сравнении по смещению.

    как написать скрипт,чтобы было все в одном скрипте?

    у меня 3 отдельных скрипта,которые сравниваются с одной и той же инструкцией.

    как все это забацать в один скрипт?

    ну типо

    кмп с этим

    и

    кмп с тем 

    и

    кмп с этим

    то прыжок на хак

    хак:

    сам хак.

    пытался писать and,но не компилиться так.

     

    Почитай про условные переходы на ассемблере. Если не ошибаюсь, то должно выглядеть примерно так. Не силен в ассемблере)

    alloc(newmem,2048)label(returnhere)label(originalcode)label(check1)label(editvalue)label(exit)newmem:cmp ...je check1 //если значение равноcheck1:cmpjne editvalue //если значение не равноeditvalue:mov [eax+00], 1000
  7. Возможно, записываешь в экранное значение и из-за этого проблемы Или фильтр надо создать, чтобы другие функции работающие с этим адресом не крашились.

  8. Спасибо, попробую.

     

     

    У меня не CS:S, а в CS:GO, но в CS:S тоже должно работать. Я создавал новый поток для RCS, в нем уже все манипуляции с ViewAngles

    // C##region RCSif (rcs)                {                    if (localPlayer.m_iShotsFired > 0)                                       {                        Vector3 currentPunch = localPlayer.m_vecPunch - vecPunch;                        Vector3 viewAngles = Memory.Read<Vector3>((IntPtr)(setViewAnglesAddress), Vector3.Zero);                        Vector3 newViewAngles = viewAngles - (currentPunch * (2f / 100f * rcsval));                        newViewAngles = newViewAngles.ClampAngle();                        Memory.Write<Vector3>((IntPtr)(setViewAnglesAddress), newViewAngles);                    }                    //vecPunch = localPlayer.m_vecPunch;                                   }#endregion
    https://www.youtube.com/watch?v=Vl_jqBADp3s
    P.S. У меня external-чит, без инжекта, только чтение-запись памяти

     

     

    Кстати если надо, чтобы игроки отрисованные glow не лежали на земле сделай проверку

    if (entity->isDormant()){ mem->WriteMem<bool>((GlowBase + ((entity->getGlowIndex() * 0x38) + 0x24)), false);}else{ mem->WriteMem<bool>((GlowBase + ((entity->getGlowIndex() * 0x38) + 0x24)), true);}

    Спасибо, помог откорректировать значения и будет прекрасно работать. +Rep обязательно :-D

    • Плюс 1
  9. В С++ не силен, прошу не пинать если ошибка будет ^_^

    Если я не ошибаюсь, то Ang[2] всегда будет равно 0, ну в CS:GO аккаунт сразу банят, если Z-координата ViewAngles равна не нулю.

     

    Чтоб медленней двигался можно подавлять отдачу не на 100% (*2), а например на 80

     

    Вроде так должно работать нормально:

    Ang[0] -= Ang[0] + ((Punch[0] * 2)*RCSval); //RCSval = 1; - 100%   RCSval = 0.8; - 80% Ang[1] -= Ang[1] + ((Punch[1] * 2)*RCSval);

    По этому коду получается, что Ang будет всегда отрицательный и около нуля, анти-отдача будет работать, но тогда я не смогу двигать прицелом. Уже все что можно перепробовал, осталось только через центр экрана попробовать и с помощью CreateMove) Да Ang[2] всегда 0. Видел как в других читах работает, и как у меня, хотя код одинаковый, значения правильные, единственное где может быть ошибка это в записи Ang.

  10. Как хорошо, когда античит OpenSource  ^_^ 

    Если смотреть сорцы античита, то можно наоборот извлекать для себя идеи функций чита, хех

    Одно дело идеи, а другое ограничение со стороны сервера и VAC :-D

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

     

    • Плюс 1
  12. Часть 1 К 4 утра нашлось все-таки свободное время :-D 

     

     

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

    В этой статье нам понадобится найти адрес прыжка, базовый адрес игрока, смещение m_fFlags которое возвращает значение в каком положении находится игрок. Начнем со смещения открываем любой отладчик и ищем строку m_fFlags.

    74kOKyiJJ7M.jpg

     

    Видим push 350h это наше смещение, буква h значит, что смещение типа DWORD(HEX). Все закрываем отладчик.

     

    Wlkm73pWEzM.jpg

     

    Теперь найдем адрес прыжка, заходим в игру, создаем сервер. Все команды прописываются без кавычек. открываем консоль пишем “+jump” и enter в CE будем искать 5 типа int, дальше снова открываем консоль и пишем “-jump” в CE пишем 4 и сканируем. Продолжаем так пока не останется как можно меньше адресов. Если найдется статический(зеленый) используйте его, если нет, то придется искать поинтер.

     

    egwTmqi32rs.jpg

     

    Когда закончили пишем в консоль sv_cheats 1; cl_pdump 1. Находим строку m_iFlags integer() и переписываем только те значение пока игрок находится в воздухе. Они у всех одинаковые, так что можете переписать из статьи (256,258,260,262,1280).

     

    JF_MoV6gm18.jpg

     

     Остался базовый адрес, но как его находить можно посмотреть в видео-уроках keng’а. 

     

     

     

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

     

    Для начала напишем функцию по которой будем определять находимся мы в воздухе или нет. Используем для этого найденное ранее значение fFlags и LocalBase

    Теперь приступим к написанию Bunnyhop. Назначим клавишей активации пробел.

    Используем наш адрес прыжка, который мы искали в самом начале.

    Что делает у нас код и почему нас не банит SMAC? Из первой части мы узнали, что SMAC проверяет время от приземления игрока и до следующего прыжка, если время равно 0 и у вас 5 прыжков (идеальных прыжков) с таким результатом мы получим бан. Счетчик анти-чита работает таким образом, что счет идет от приземления до приземления, но наш прыжок в воздухе подходит под условие, при котором счетчик сбрасывается.

     

     

     

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

     

     

     

    int in_air(){
      int fFlag;
      ReadProcessMemory(hProcess, (LPCVOID)(LocalBase + 0x350), &fFlag, 4, 0);
      return fFlag == 256 || fFlag == 258 || fFlag == 260 || fFlag == 262 || fFlag == 1280;
    } 
    void Bunnyhop() {
      int on = 5;
      int off = 4;
      if (GetAsyncKeyState(VK_SPACE) & 0x8000 && !in_air) {
        WriteProcessMemory(hProcess, (LPCVOID)(ClientDLL + 0x4F3B3C), &on, 4, 0); //5
      } else if (GetAsyncKeyState(VK_SPACE) & 0x8000 && in_air)	{
        WriteProcessMemory(hProcess, (LPCVOID)(ClientDLL + 0x4F3B3C), &off, 4, 0); //4
        WriteProcessMemory(hProcess, (LPCVOID)(ClientDLL + 0x4F3B3C), &on, 4, 0); // 5
        WriteProcessMemory(hProcess, (LPCVOID)(ClientDLL + 0x4F3B3C), &off, 4, 0); //4
      } else {
        WriteProcessMemory(hProcess, (LPCVOID)(ClientDLL + 0x4F3B3C), &off, 4, 0); //4
      }
    }

     

    • Плюс 3
  13. В этот раз статья будет состоять из 2 частей, постараюсь дописать сразу как появится свободное время.
    В первой у нас будет теория о том как работает анти-чит и как можно его обмануть, во второй напишем простейший Bunnyhop.
     
    Часть 1. Теория.

    Немного теории о том как работает SMAC анти-чит на примере Bunnyhop.Ссылка на репозиторий анти-чита.
    SMAC это довольно не плохой анти-чит и к тому-же c исходным кодом.Как же анти-чит вычисляет читера? Ниже под спойлером функция обнаружения использования Bhop.

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

    Эта функция проверяет время от приземления игрока и до следующего прыжка, если время равно 0 и у вас 5 прыжков(идеальных прыжков) с таким результатом вы получаете бан.
    Как это можно обойти? Например, создать таймер который задает рандомное время простоя до следующего прыжка, но добавление дополнительного времени в выполнение функции сказывается на качестве распрыга.
    Так, что мы создадим двойной прыжок т.е. 1-й прыжок основной будет происходить когда мы на земле,2-й прыжок когда мы находимся в воздухе и это никак не влияет на основной распрыг, но путает анти-чит.

    
    /* BunnyHop */
    static Float:fCheckTime[MAXPLAYERS + 1]; // Игрок не прыгает сразу после последнего прыжка.
    if (!(buttons & IN_JUMP) && (GetEntityFlags(client) & FL_ONGROUND) && fCheckTime[client] > 0.0){
      fCheckTime[client] = 0.0;
    } // Игнорировать прыжок, если игрок находится в ограниченном пространстве или застрял в земле
    if ((buttons & IN_JUMP) && !(iPrevButtons[client] & IN_JUMP)) {	// Игрок находится на земле и выполняет прыжок.
      if (GetEntityFlags(client) & FL_ONGROUND)	{
        new Float:fGameTime = GetGameTime(); // Игрок прыгнул на точном кадре, что разрешено. Не уверен, что перевел правильно. Оригинал: Player jumped on the exact frame that allowed it.
        if (fCheckTime[client] > 0.0 && fGameTime > fCheckTime[client]) {
          AutoTrigger_Detected(client, METHOD_BUNNYHOP);
        } else {
          fCheckTime[client] = fGameTime + MIN_JUMP_TIME;
        }
      }	else {
        fCheckTime[client] = 0.0;
      }
    }

     

     

    • Плюс 3
  14. Надеюсь кому-нибудь это поможет. Несколько лет назад я делал RapidFire для Darksiders 2. и выкладывал таблицу под ником Alexander-mx. Но искал я очень долго значение, отвечающее за время между выстрелами, искал способом изменилось/не изменилось и тогда мне очень повезло, потому что повторить это я не смог.  :-D  Сегодня решил восстановить функцию выстрела для этой игры.Не полностью восстановленная функция, но для создания 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
  15. Я об этом уже давно говорил с Xipho, и насколько я помню - мы так ни к чему не пришли, по этому вопросу.Но чтобы было спокойнее, вот маленький спойлер: скоро все будет.

    Может сделать ограничение по размеру загружаемых картинок?

  16. Перед началом поиска прописываем в параметры запуска " -insecure".

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

    Нам нужно найти смещение максимального значения прозрачности во время взрыва флэш. Это делается в любом отладчике. Т.к. у меня сейчас нет Olly, я буду искать значение в IDA.
    Загружаем client.dll в любой отладчик. Ищем строку "m_flFlashMaxAlpha".

     
    MzLBgg965RQ.jpg
     
    Переходим к этой строке
     
    0tp7C7iDCds.jpg
     
    Перед строкой которую мы искали располагается смещение. 0x1450 Больше нам ничего не нужно. Закрываем отладчик.


     

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

    Для того чтобы использовать это смещение нам необходимо найти адрес начала структуры игрока т.е себя. Как это делать вы можете найти в видео keng'a по созданию ESP.

     

    Значение которое мы получим в игре статическое и всегда равно 255(float). Надо изменить его на 0. (Для лучше производительности кода, можно добавить проверку,чтобы просто так он не перезаписывался постоянно в цикле.)

     

     

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

     

     

     

     

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

     

     

    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);
    } 
    • Плюс 5
  17. (Впервые пишу статью, так что критика приветствуется. Многие наверное знают этот способ.)

     

    Итак, для начала нам нужно зайти в свойства игры в Steam Параметры запуска и прописать –insecure. «-insecure» отключает VAC, и мы можем спокойно начинать взлом, не боясь, что нас забанят. Не забудьте удалить это иначе не пустит на сервера.

    TANTyqv-LQ0.jpg

     

    В поиске мы должны будем найти игроков, которые отражаются на карте в момент приближения к ним. Искать лучше тип «Byte» 1 видим противника на радаре, 0 не видим.

     

    У меня нашелся 1 адрес.

    c9gZw_vLzsQ.jpg

     

     

    Выделяем адрес и нажимаем F5 или ПКМ по адресу и Find out what accesses this address.

     

     

    n9KMsDc4ANo.jpg

     

     

    Вызывается всего одна инструкция. Что же она делает? Она записывает в 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);
      }
    }

    mEBFthuChVM.jpg

    • Плюс 5
  18. Нашел свои старые проекты и решил закончить.Проблема заключается в том, что прицел опускается слишком быстро. Вдруг кто-нибудь делал и может подсказать в чем дело? Вроде все по туторам и должно работать прекрасно.

    Если не понятно объяснил в чем проблема, вот видео.

    https://www.youtube.com/watch?v=rybzAYAAUXk

    void RCS(){	float Punch[3],Ang[3];	if (GetAsyncKeyState(0x01) & 0x8000 && local_player->getShotsFired() > 1)	{		Punch[0] = local_player->getPunch()[0];		Punch[1] = local_player->getPunch()[1];		Punch[2] = 0;		Ang[0] = local_player->getAngles()[0];		Ang[1] = local_player->getAngles()[1];		Ang[2] = local_player->getAngles()[2];		Ang[0] -= Punch[0] * 2; //* 2 компенсация отдачи		Ang[1] -= Punch[1] * 2;		Ang[2] -= Punch[2] * 2;		engine->clampAngles(Ang);		local_player->setAngles(Ang);	}}
×
×
  • Создать...

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

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