1. Гость, мы просим Вас ознакомиться с Правилами Форума и Отказом от ответственности!

Результаты поиска

  1. int 3
  2. int 3
  3. int 3
  4. int 3
  5. int 3
  6. int 3
  7. int 3
  8. int 3
  9. int 3
  10. int 3
    Сообщение

    Забудем все :D

    [IMG]
    Сообщение от: int 3, 13 сен 2014 в разделе: Оффтоп
  11. int 3
  12. int 3
  13. int 3
  14. int 3
  15. int 3
    Описывай предь,пожалуйста до "ввода" своих таблиц и тд и указывай версию,на которой делал,ибо тестил на 1.5.0 : По поводу таблиц - у меня подредактированы только аргументы функции, это не должно влиять на смысл. Функция в любом случае есть (GLog::log()), её можно затереть. Версия 1.5.1, забыл дописать. 0x0811c8DA Это адрес строчки вызова функции, сама функция находится в [IMG] (0x811C8C4 - 0x811C8E1) 0x08122523 konec Это вычислено верно. Заходим в функцию GMCommandHandler и огорчаемся: [IMG] Смещение стало не 0x48, а 0x44 (пкм - hexadecimal), поэтому 6-й байт в коде изменится с 48 на 44. D48C4 - стираем 30 байт. Дописываем байты, вычисляем разность (у меня получилась 0x5C52). Результат: [IMG] Сохраняем и для надежности/проверки суём в иду. (Проанализировалось не до конца) [IMG] Зеленым указаны начальные команды, которые были перед/после затираемой функции (они не изменились, значит мы ничего не сломали), между ними наш код. Прыжок переходит на верный адрес. https://yadi.sk/d/BnY5l5qjZwF7f - пофикшенное ядро Для редактирования asm кода, рекомендую использовать http://hte.sourceforge.net/ Спасибо, попробую. По поводу вырезки "лишнего" кода, лучше делать по другому: Я практиковал такой способ, когда редактировал клиент, но тут функция была мелкая, а джампом всё равно пришлось бы затереть 5 байт. Когда-нибудь опишу в гайдах и такой вариант.
    Сообщение от: int 3, 18 авг 2014 в разделе: PW Документация
  16. int 3
    Мне потребовалось: IDA + Hex Rays, хекс редактор, Cheat Engine и немного знаний асма. Ахтунг! Все числа в статье - в 16-ричной системе счисления. Где-то есть 0x, где-то нет. Статья будет состоять из трёх частей: Итак, нужно запретить доступ к дебаг командам всем, кроме ГМов. Как? У меня не было опыта редактирования ядра, но я предположил, что нужно глянуть функции, которые отвечают за управление Debug командами (лвл ап - d 2000 и подобные) и GM командами (телепорт гма - d 19 1 1 1 и подобные). Открываем ядро IDA'ой, ждём полного анализа. Слева список функций: [IMG] Жмём Alt-T, вбиваем в поиск Debug. С помощью Ctrl-T можно переключать на следующий результат поиска. Через минуту я нашёл интересные функции (они были рядом): [IMG] Название говорит за себя. Выбираем GMCommandHandler, F5 (генерация псевдокода). Видим (у меня переименованы некоторые переменные): [IMG] Строчка if ( (param1 <= 200 || param1 > 222) && param1 != 19 ) палит всю функцию. Я вспомнил, что для гма доступны как раз команды d 19, d 201, d 202, .., d 222. Видно, что идёт запись в лог, если параметр неверный. Значит мы на верном пути. Смотрим дальше. Должна быть проверка на то, ГМ ли это вызывает. Тут одно из двух: либо проверка идёт перед вызовом функции (где-то в дебрях кода), либо внутри функции. Я безуспешно проверил все функции CheckGMPrivilege, HasGMPrivilege, которых оказалось полно в ядре, но ни одна не вызывалась при использовании этих команд. (Десктопная убунту + IDA, приаттаченная к процессу. Спасибо Максимиану за подсказку). Всё оказалось проще. Сразу после записи в лог идёт строчка if ( *(a1 + 0x48) ) Очевидно, что a1 - указатель на структуру перса, который юзает команду d num, а +0x48 - это смещение до GM флага или структуры с информацией о GM правах. В любом случае, если это значение 0, то идёт выход из функции. В асм коде эта проверка выглядит так: [IMG] Если 0, то прыжок не идёт (jnz - jump if not zero). Записали, назовём это IsCharGM() (просто для себя) Переходим к функции DebugCommandHandler, F5. Начало у неё такое: [IMG] Опять же, переменные переименованы, так как я вводил свои структуры. Красным выделена строчка, которая вызывает функцию GLog::log(), которая записывает куда-то что-то. Вроде и полезная.. Но нам ведь надо всунуть нашу найденную проверку IsCharGM(), а для неё еще место нужно. Поэтому я принял решение стереть эту функцию нафиг (ВОТ ЭТО ДЫРА!!1) Смотрим асм код: [IMG] Зеленое - махинации с указателями на локальный/глобальный стек, трогать нельзя ни в коем случае. Красным - функция GLog::log(). Смотрим адрес начала этой функции: 0x812527E и конец: 0x812529C минус один == 812529B. Аргументы функции DebugCommandHandler: [IMG] По счастливой случайности, первый параметр оказался как раз тем самым указателем на структуру перса, вызывающего команду (поверьте на слово, проверил бряками в иде). Это очень сильно упрощает задачу. Почему? Об этом во второй части. Что мы знаем? а) У нас есть 0x1E (30 штук) байт для проверки гм прав у перса (0x1E - вместо затёртой, в будущем, функции) б) В функцию DebugCommandHandler передаётся указатель на структуру перса Как должен примерно выглядеть код проверки? На си: if (*(a1+0x48)) return 0; На асме: mov eax, [ebp+8h] ; в регистр eax суём наш указатель на структуру. Он находится в [ebp+8], потому что http://i.imgur.com/h6Exx0z.png cmp [eax+48h], 00 ; сравниваем значение по адресу eax+48 с нулём jz %адрес выхода с функции% (jz %адрес% можно заменить на mov eax, %адрес% / jz eax, но мой "генератор" опкода отказался работать с "jz %регистр%") Теперь поэтапно: а) Адрес выхода с функции? Листаем функцию в самый низ, видим там: [IMG] Зеленое - адрес выхода с функции. 0x812B8D1 б) Теперь нужно этот асм-код преобразовать в опкод. Я делал это с помощью Cheat Engine. На первый взгляд нет проблем, просто преобразовать 3 команды в байт-код. Ан нет! Команда jz %ptr% на самом деле опознаётся компьютером, как jz +N, где N - разность между адресом назначения и адресом команды, следующей сразу за прыжком. Вот такая хитрая относительная адресная арифметика. Поэтому: I) Переводим первые две команды в опкод: [IMG] 8B 45 08 83 78 48 00 - 7 байт в сумме II) Возвращаемся к записанным ранее адресам: 0x812527E (адрес начала функции, которая будет стёрта). Прибавляем 7 байт. 0x812527E+7 == 0x8125285. Значит по адресу 0x8125285 будет лежать команда jz +N. Она занимает 6 байт (опкод самого jz + 4 байта на N). Значит 0x8125285 + 6 == 0x812528B. III) Теперь вычитаем из конечного адрес (выхода с функции 0x812B8D1) полученный адрес (0x812528B) == 0x6646. Вот и всё. Теперь спокойно переводим команду jz +6646 в байты: 0F 84 46 66 00 00 Весь код: 8B 45 08 83 78 48 00 0F 84 46 66 00 00 Открываем ядро в хекс редакторе (мой любимый - 010 Editor). В файле все адреса смещены на 0x8048000 относительно того, что в памяти, поэтому берём адрес функции для затирания: 812527E и вычитаем 8048000, получаем DD27E. Переходим по этому адресу (Ctrl-G), видим [IMG] Затираем 0x1E (30 в десятичной) байт. Не нулями, а байтами по 90 (nop - no operation). Вообще, код лучше не затирать нулями никогда. [IMG] Затёрли, теперь вбиваем наш код: [IMG] Сохраняем. Поздравляю, вы великолепны. 1. Скорее всего (это никак не меняет сути гайда), там не указатель на структуру персонажа, а указатель на объект. И функции - это просто методы класса, которые выполняют действия над этим объектом. С другой стороны, обычно указатель на объект передаётся в ecx, поэтому могу и ошибаться. 2. Дыр быть не может. Если вы прочитали гайд полностью, это должно быть очевидно. Если игрок не может использовать ГМ команды, то он не может использовать дебаг команды. 3. Минус - не будет функции, которая что-то там логгирует. 4. Возможно, я индус, и можно было сделать всё проще, но я привык редактировать код, а не копаться в каких-нибудь xml и искать нужные параметры. 5. Я не описал (и не буду) моменты, как я добывал значения переменных с помощью бряков в ИДЕ, иначе это не влезет в одно сообщение. Да и в гугле полно информации на эту тему. Материал можно копировать и использовать на своё усмотрение, но указание автора (int 3) приветствуется. Если есть вопросы - задавайте, с радостью отвечу.
    Автор темы: int 3, 18 авг 2014, ответов - 11, в разделе: PW Документация
  17. int 3
  18. int 3
  19. int 3
  20. int 3