CELua[RU]
    • Категории
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Зарегистрироваться
    • Войти
    1. Главная
    2. Популярные
    Авторизуйтесь, чтобы написать сообщение
    • За всё время
    • За день
    • За неделю
    • За месяц
    • Все темы
    • Новые темы
    • Отслеживаемые темы
    • Неотвеченные темы

    • Все категории
    • PitronicP

      Предложение по информационному разделу "Я не автор"

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Решенные Обсуждения и предложения
      3
      0 Голоса
      3 Сообщения
      59 Просмотры
      PitronicP
      Пользователь @MasterGH написал в Предложение по информационному разделу "Я не автор": Я бы создал отдельный раздел статей и в нем раздел других авторов По статьям норм, но ещё также по файлам то же бы не мешало. Рядовой пользователь в инете что чаще ищет статьи или файлы? То что чаще ищут даёт больше трафика. Считаю что надо два аологичных раздела по статьям и по файлам. Главное условия автор темы обязан указать ссылку на ресурс автора. Тогда если в поисковике кто то ищет ресурс автора, будет видеть и наш ресурс который даст ссылку на ресурс который он ищет если зайдёт на наш форум.
    • MasterGHM

      Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Приёмы фишки breakpoint ce lua dbk
      3
      4
      0 Голоса
      3 Сообщения
      72 Просмотры
      MasterGHM
      Пользователь @Pitronic написал в Сделать большой брейкпоинт на структуру через dbk_useKernelmodeOpenProcess: Мы знаем что адрес таймера на выстрел во первых лежит в одной структуре с патронами, во вторых адрес в начале меняется в момент выстрела одновременно с уменьшением патронов и в пределах от одной до 100 миллисекунд возвращается в прежнее значение. может lua скрипт специальный можно сделать? Я бы сделал без скриптов. делаешь dessect structure Далее как обычно. Создаешь структуру. Затем вот это (следить за изменениями) ну а дальше воспроизводишь свой выстрел потом создаешь структуру из изменившихся данных (потому что их будешь очень много наверняка) затем делаешь lock на структуру, чтобы значения зафиксирвать затем рядом создаешь второй ряд по ctrl +a и смотрим изменения в реальном времени (игра должна быть в оконном режим, чтобы мы видели как цифры скачут) чтобы увидеть изменения менее 100мс нужно поставить интервал меньше По идее это должно сработать
    • MasterGHM

      Делаем EFLAGS таблицу

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Приёмы шаблоны фишки ce lua
      3
      2
      0 Голоса
      3 Сообщения
      49 Просмотры
      MasterGHM
      Ответил
    • MasterGHM

      Рубрика "Lua код сегодня" №5 (активирующий скрипт)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Обучающие примеры ce lua ce aa active rec ce memrec важно обучалка
      3
      3
      0 Голоса
      3 Сообщения
      76 Просмотры
      MasterGHM
      Update: Если скрипт не запускается, то вызывать reinitializeSymbolhandler(true) Пример здесь
    • MasterGHM

      Настройка частного DNS

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Linux linux dns server ubuntu
      3
      0 Голоса
      3 Сообщения
      58 Просмотры
      MasterGHM
      Ого Ну, спасибо
    • MasterGHM

      Обновление форума

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Новости
      3
      0 Голоса
      3 Сообщения
      2k Просмотры
      MasterGHM
      Да, нет, наверное. Вчера, что обсуждали.
    • MasterGHM

      Изобретение модели Трансформер (как это было кратко, и кто изобрел)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена AI-инструменты
      3
      0 Голоса
      3 Сообщения
      6 Просмотры
      MasterGHM
      Премии, связанные с Transformer и глубоким обучением 1. Премия Тьюринга (Turing Award) — «Нобелевка» в Computer Science - За что дают? За выдающийся вклад в области информатики. - Кто получил за Transformer и deep learning? В 2023 году премию получили: Йошуа Бенджио (Yoshua Bengio) Джеффри Хинтон (Geoffrey Hinton) Ян Лекун (Yann LeCun) (Но не авторы Transformer! Они получили её за более ранние работы по нейросетям.) Однако авторы Transformer (Васуани, Шейзер и др.) тоже могут её получить в будущем — их работа считается революционной. 2. ACL Test of Time Award (премия за долгосрочное влияние) - За что дают? Награждают статьи, которые сильно повлияли на NLP через 10+ лет после публикации. - Кто получил? Пока "Attention Is All You Need" (2017) ещё не получила (ей всего 7 лет), но, скорее всего, получит в 2027–2030 годах. 3. NeurIPS Best Paper (премия за лучшую статью на конференции NeurIPS) - За что дают? За самые значимые исследования в machine learning. - Получал ли Transformer? Нет, статья вышла в arXiv (2017), а не на NeurIPS. Но если бы подавали — точно бы выиграла. --- Почему авторы Transformer ещё не получили Тьюринга? Премию Тьюринга дают с задержкой (обычно через 10–20 лет после открытия). В 2023 наградили "отцов deep learning" (Хинтона и др.) — их работы 1980–2000-х сделали возможным появление Transformer. Transformer ещё "слишком молод" (2017), но его авторы — главные кандидаты на премию в 2030-х. --- Какие ещё награды получили авторы Transformer? - Google Research Awards (внутренние премии). - Упоминания в топ-конференциях (ICML, ACL, NeurIPS) как одна из самых влиятельных работ. - Цитирования (более 80 000+ ссылок на статью — это гигантский показатель). --- Вывод - Пока авторы Transformer не получили Тьюринга, но их работа изменила всю NLP-индустрию. - Скорее всего, их наградят в будущем — как Бенджио, Хинтона и ЛеКуна. - Сейчас они получают признание через цитирования и внедрение их идей в ChatGPT, Gemini и другие ИИ. Transformer — это как изобретение транзистора для ИИ: пока не всегда награждают, но без него ничего не работает.
    • PitronicP

      Предложения по дополнительному разделу

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Решенные Обсуждения и предложения
      2
      0 Голоса
      2 Сообщения
      58 Просмотры
      MasterGHM
      @Pitronic ок..
    • MasterGHM

      Пошаговая отладка Lua скриптов

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Приёмы debug ce lua фишки
      2
      1
      0 Голоса
      2 Сообщения
      129 Просмотры
      MasterGHM
      Открываем Lua консоль из дизассемблера Пишем Lua скрипт Дальше по шагам как на картинке Если мы пишем какую-то функцию и она дает сбой, то её можно отладить как на скриншоте. Это может быть и не функция. Например, код прочитал какой-то файл с текстом сохраненных параметров и подсмотрели в пошаговой Lua отладке что происходит дальше. *Действуют горячие клавиши. Например, F7— шаг, F9 — запуск без остановки.
    • MasterGHM

      Сравнение времени выполнения двух функций

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Обучающие примеры обучалка ce lua optimization
      2
      0 Голоса
      2 Сообщения
      44 Просмотры
      MasterGHM
      С точностью до тысячной доли секунды можно посчитать задержку выполнения кода, что можно применить как счет производительности. local x = os.clock() local s = 0 for i=1,100000 do s = s + i end print(string.format("elapsed time: %.3f\n", os.clock() - x)) После выполнения, показывает 2 тысячных секунды или 2 мс elapsed time: 0.002 Можно посчитать прошедшее время для другой цели. Например, если цикл в отладке выполняется более 3 секунд, то это вероятно корневой цикл, а если менее, то это вложенный цикл. На корневом цикле можно остановить трейслог. Об этом может быть потом напишу.
    • MasterGHM

      CE вывод списка записей и вывод свойств компонентов

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Плагин-строй ce lua ce plugin ce components userdata
      2
      2
      0 Голоса
      2 Сообщения
      64 Просмотры
      MasterGHM
      Ищем свойства userData. UserData в Lua это пользовательский тип. Точно не знаю, но я думаю в документации в CE Lua (celua.txt или здесь на офф. сайте) тип userData у всех классов или большинства классов. Например, проверим, что главная форма CE это userData тип local mainFormCE = getMainForm() print(type(mainFormCE)) > userdata (вывод из консоли) Выводим список свойств следующим образом через getmetatable функцию. Метатаблица — это особая таблица свойств Lua-переменной local mainForm = getMainForm() local listUserData = createStringlist() for k,_ in pairs(getmetatable(mainForm)) do listUserData.add(k) end local allowCustomInput = false local id, name = showSelectionList("Title", "Caption", listUserData, allowCustomInput) print ('Index: '..id..", Name: "..name) listUserData.destroy() Результат в виде списка свойство переменной mainForm Чтобы наглядно было. Свойства эти похожи на свойства из Дельфи. Можно загуглить, они поддробно описываются. Берем например свойство цвет. Прочитаем оригинальное и запишем свое любое local mainFormCE = getMainForm() print(mainFormCE.getColor()) > 536870912 -- в hex-е это 0x20000000. Можно перевести в калькуляторе или через print(string.format("%08X", 536870912)) Случайное свое впишем ради наглядного примера mainFormCE.setColor(546484)
    • MasterGHM

      CE Lua чистка памяти от утечек

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Плагин-строй ce lua ce plugin memory leak
      2
      0 Голоса
      2 Сообщения
      61 Просмотры
      MasterGHM
      Оптимизация CE Lua кода по сборке мусора Есть инструкции, которые добавляют мусора больше чем другие. Показываем объем памяти мусора print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) Ниже код того как попробовать узнать сколько мусора добавил код при парсинге ассемблерной строки двумя способами local s = " 0045464A - FF 05 A4B54500 - inc [0045B5A4] { [000003EA] }" function GetDebugString(address) return splitDisassembledString(s) end \-- address, bytes, opcode function GetDebugString2(address) local clearString = string.gsub(s, '%s','') return string.match(clearString, '^(.-)%-(.-)%-(.-)$') end function NoOptimizeCode() GetDebugString2() end function OptimizeCode() GetDebugString() end local countRepeat = 500000 -- add more cycle local x1 = 0 local x2 = 0 x1 = getTickCount() print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) for i = 1, countRepeat do NoOptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) x2 = getTickCount() for i = 1, countRepeat do OptimizeCode() end print(string.format('Lua memory usage %.1f MiB',collectgarbage('count')/1024)) print(string.format("%.2f", (x2 - x1)/(getTickCount() - x2)) ) Пример результатов могут отличаться. Фиг его знает почему. Возможно работает сборщик мусора в разные моменты времени Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB Lua memory usage 1.8 MiB 1.49 Lua memory usage 1.8 MiB Lua memory usage 2.3 MiB Lua memory usage 2.3 MiB 1.47 Lua memory usage 2.3 MiB Lua memory usage 2.8 MiB Lua memory usage 2.8 MiB 1.49
    • MasterGHM

      Функция autoAssemble

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Приёмы ce aa ce lua autoassemble
      2
      1 Голоса
      2 Сообщения
      2k Просмотры
      PitronicP
      Пользователь @MasterGH написал в Функция autoAssemble: // Скрипт похожий на таблицу АА Маленькое замечание. Два слеша используются для коментариев в асм. На луа используются пунктир не менее двух чёрточек. Если пользователь не разбирается, он не поймёт почему луа выдаёт ошибку. Тему поправил.
    • MasterGHM

      Заполнение разделов старыми постами

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Не решенные Новости todo
      2
      0 Голоса
      2 Сообщения
      45 Просмотры
      MasterGHM
      По плану перенести свои старые плагины CE с ссылками на репозитории. В том числе три преспектинвых плагина по большому брейкпоинту, дизассемблированию, и трейслогу с маркерами. Много планов по развитию форума. По различным фишкам и приемам.
    • MasterGHM

      Задачка по IDA и Python (старое)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена MasterGH
      2
      3
      0 Голоса
      2 Сообщения
      40 Просмотры
      MasterGHM
      Пост принадлежит автору partoftheworlD, GamehackLab[RU]. (ref) Подключение к питону происходит с помощью: import idc import idautils import idaapi У меня есть наработки некоторые, возможно что-то пригодится. import idc import idaapi class Func(object): def __init__(self): self.reg_value = re.compile(r'') self.stack_view = [] self.level = 1 def range_reverse(self, start, stop): for i in FuncItems(stop): if start > i >= stop: yield i def run(self): if self.stack_view: for j in self.stack_view: current_function = idaapi.get_func(j) level = "-" * self.level print("{} Jump into -> 0x{}".format(level, hex(current_function.startEA)[2:].replace("L", "").upper())) for j in [i for i in self.range_reverse(current_function.endEA, current_function.startEA)]: print("{} 0x{} -- {}".format(level, hex(j)[2:].replace("L", "").upper(), idc.GetDisasm(j))) self.level += 1 else: print "Please input addresses to stack view buffer" pass if __name__ == '__main__': f = Func() f.stack_view = [0x214FE, 0x20F30, 0x214E0, 0x13F00] f.run() В выводе получим \- Jump into -> 0x214E0 \- 0x214E0 -- push ebp \- 0x214E1 -- mov ebp, esp \- 0x214E3 -- lea esp, [esp-10h] \- 0x214E7 -- mov [ebp+var_C], eax \- 0x214EA -- mov [ebp+var_4], edx \- 0x214ED -- mov [ebp+var_8], ecx \- 0x214F0 -- mov eax, [ebp+arg_0] \- 0x214F3 -- test eax, eax \- 0x214F5 -- jnz locret_21589 \- 0x214FB -- mov eax, [ebp+var_8] \- 0x214FE -- cmp word ptr [eax], 1Bh \- 0x21503 -- jnz locret_21589 \- 0x21509 -- push 0 \- 0x2150B -- mov eax, [ebp+var_8] \- 0x2150E -- movzx ecx, word ptr [eax] \- 0x21511 -- mov eax, [ebp+var_4] \- 0x21514 -- mov edx, 0B01Eh \- 0x21519 -- call sub_8E870 \- 0x2151E -- test eax, eax \- 0x21520 -- jnz short locret_21589 \- 0x21522 -- push 0 \- 0x21524 -- mov eax, [ebp+var_4] \- 0x21527 -- mov ecx, 0 \- 0x2152C -- mov edx, 87h ; '‡' \- 0x21531 -- call sub_8E870 \- 0x21536 -- and eax, 4 \- 0x21539 -- jnz short locret_21589 \- 0x2153B -- mov eax, [ebp+var_C] \- 0x2153E -- test dword ptr [eax+160h], 4 \- 0x21548 -- jz short locret_21589 \- 0x2154A -- mov eax, [ebp+var_4] \- 0x2154D -- mov dl, 1 \- 0x2154F -- call sub_13F00 \- 0x21554 -- mov [ebp+var_10], eax \- 0x21557 -- test eax, eax \- 0x21559 -- jz short locret_21589 \- 0x2155B -- mov eax, [ebp+var_10] \- 0x2155E -- cmp dword ptr [eax+378h], 0 \- 0x21565 -- jz short locret_21589 \- 0x21567 -- mov eax, [ebp+var_10] \- 0x2156A -- mov eax, [eax+378h] \- 0x21570 -- mov edx, [ebp+var_10] \- 0x21573 -- mov edx, [edx+378h] \- 0x21579 -- mov edx, [edx] \- 0x2157B -- call dword ptr [edx+2E8h] \- 0x21581 -- mov eax, [ebp+var_8] \- 0x21584 -- mov word ptr [eax], 0 \- 0x21589 -- leave \- 0x2158A -- retn 4 \-- Jump into -> 0x20F30 \-- 0x20F30 -- push ebp \-- 0x20F31 -- mov ebp, esp \-- 0x20F33 -- lea esp, [esp-10h] \-- 0x20F37 -- mov [ebp+var_C], eax \-- 0x20F3A -- mov [ebp+var_4], edx \-- 0x20F3D -- mov [ebp+var_8], ecx \-- 0x20F40 -- mov eax, [ebp+var_8] \-- 0x20F43 -- cmp word ptr [eax], 0 \-- 0x20F48 -- jz locret_20FCF \-- 0x20F4E -- mov edx, [ebp+var_4] \-- 0x20F51 -- mov eax, 5C29B4h \-- 0x20F56 -- call sub_C910 \-- 0x20F5B -- test al, al \-- 0x20F5D -- jz short loc_20FC3 \-- 0x20F5F -- mov eax, [ebp+var_4] \-- 0x20F62 -- mov [ebp+var_10], eax \-- 0x20F65 -- mov eax, [ebp+var_C] \-- 0x20F68 -- cmp word ptr [eax+150h], 0 \-- 0x20F71 -- jz short locret_20FCF \-- 0x20F73 -- mov eax, [ebp+var_C] \-- 0x20F76 -- mov edx, [ebp+var_8] \-- 0x20F79 -- mov ax, [eax+150h] \-- 0x20F80 -- cmp ax, [edx] \-- 0x20F83 -- jnz short locret_20FCF \-- 0x20F85 -- mov eax, [ebp+var_C] \-- 0x20F88 -- mov eax, [eax+154h] \-- 0x20F8E -- cmp eax, [ebp+arg_0] \-- 0x20F91 -- jnz short locret_20FCF \-- 0x20F93 -- mov eax, [ebp+var_C] \-- 0x20F96 -- mov eax, [eax+14Ch] \-- 0x20F9C -- cmp eax, [ebp+var_10] \-- 0x20F9F -- jnz short locret_20FCF \-- 0x20FA1 -- push [ebp+arg_0] \-- 0x20FA4 -- mov ecx, [ebp+var_8] \-- 0x20FA7 -- mov edx, [ebp+var_10] \-- 0x20FAA -- mov eax, [ebp+var_C] \-- 0x20FAD -- call sub_21590 \-- 0x20FB2 -- push [ebp+arg_0] \-- 0x20FB5 -- mov ecx, [ebp+var_8] \-- 0x20FB8 -- mov edx, [ebp+var_10] \-- 0x20FBB -- mov eax, [ebp+var_C] \-- 0x20FBE -- call sub_214E0 \-- 0x20FC3 -- mov eax, [ebp+var_C] \-- 0x20FC6 -- mov word ptr [eax+150h], 0 \-- 0x20FCF -- leave \-- 0x20FD0 -- retn 4 \--- Jump into -> 0x214E0 \--- 0x214E0 -- push ebp \--- 0x214E1 -- mov ebp, esp \--- 0x214E3 -- lea esp, [esp-10h] \--- 0x214E7 -- mov [ebp+var_C], eax \--- 0x214EA -- mov [ebp+var_4], edx \--- 0x214ED -- mov [ebp+var_8], ecx \--- 0x214F0 -- mov eax, [ebp+arg_0] \--- 0x214F3 -- test eax, eax \--- 0x214F5 -- jnz locret_21589 \--- 0x214FB -- mov eax, [ebp+var_8] \--- 0x214FE -- cmp word ptr [eax], 1Bh \--- 0x21503 -- jnz locret_21589 \--- 0x21509 -- push 0 \--- 0x2150B -- mov eax, [ebp+var_8] \--- 0x2150E -- movzx ecx, word ptr [eax] \--- 0x21511 -- mov eax, [ebp+var_4] \--- 0x21514 -- mov edx, 0B01Eh \--- 0x21519 -- call sub_8E870 \--- 0x2151E -- test eax, eax \--- 0x21520 -- jnz short locret_21589 \--- 0x21522 -- push 0 \--- 0x21524 -- mov eax, [ebp+var_4] \--- 0x21527 -- mov ecx, 0 \--- 0x2152C -- mov edx, 87h ; '‡' \--- 0x21531 -- call sub_8E870 \--- 0x21536 -- and eax, 4 \--- 0x21539 -- jnz short locret_21589 \--- 0x2153B -- mov eax, [ebp+var_C] \--- 0x2153E -- test dword ptr [eax+160h], 4 \--- 0x21548 -- jz short locret_21589 \--- 0x2154A -- mov eax, [ebp+var_4] \--- 0x2154D -- mov dl, 1 \--- 0x2154F -- call sub_13F00 \--- 0x21554 -- mov [ebp+var_10], eax \--- 0x21557 -- test eax, eax \--- 0x21559 -- jz short locret_21589 \--- 0x2155B -- mov eax, [ebp+var_10] \--- 0x2155E -- cmp dword ptr [eax+378h], 0 \--- 0x21565 -- jz short locret_21589 \--- 0x21567 -- mov eax, [ebp+var_10] \--- 0x2156A -- mov eax, [eax+378h] \--- 0x21570 -- mov edx, [ebp+var_10] \--- 0x21573 -- mov edx, [edx+378h] \--- 0x21579 -- mov edx, [edx] \--- 0x2157B -- call dword ptr [edx+2E8h] \--- 0x21581 -- mov eax, [ebp+var_8] \--- 0x21584 -- mov word ptr [eax], 0 \--- 0x21589 -- leave \--- 0x2158A -- retn 4 \---- Jump into -> 0x13F00 \---- 0x13F00 -- push ebp \---- 0x13F01 -- mov ebp, esp \---- 0x13F03 -- lea esp, [esp-0Ch] \---- 0x13F07 -- mov [ebp+var_4], eax \---- 0x13F0A -- mov [ebp+var_8], dl \---- 0x13F0D -- jmp short loc_13F33 \---- 0x13F10 -- cmp [ebp+var_8], 0 \---- 0x13F14 -- jnz short loc_13F27 \---- 0x13F16 -- mov edx, [ebp+var_4] \---- 0x13F19 -- mov eax, 59ECF0h \---- 0x13F1E -- call sub_C910 \---- 0x13F23 -- test al, al \---- 0x13F25 -- jnz short loc_13F45 \---- 0x13F27 -- mov eax, [ebp+var_4] \---- 0x13F2A -- mov eax, [eax+1F8h] \---- 0x13F30 -- mov [ebp+var_4], eax \---- 0x13F33 -- cmp [ebp+var_4], 0 \---- 0x13F37 -- jz short loc_13F45 \---- 0x13F39 -- mov eax, [ebp+var_4] \---- 0x13F3C -- cmp dword ptr [eax+1F8h], 0 \---- 0x13F43 -- jnz short loc_13F10 \---- 0x13F45 -- mov edx, [ebp+var_4] \---- 0x13F48 -- mov eax, 59ECF0h \---- 0x13F4D -- call sub_C910 \---- 0x13F52 -- test al, al \---- 0x13F54 -- jz short loc_13F5E \---- 0x13F56 -- mov eax, [ebp+var_4] \---- 0x13F59 -- mov [ebp+var_C], eax \---- 0x13F5C -- jmp short loc_13F65 \---- 0x13F5E -- mov [ebp+var_C], 0 \---- 0x13F65 -- mov eax, [ebp+var_C] \---- 0x13F68 -- leave \---- 0x13F69 -- retn Надо будет поправить пару строк, чтобы выводилась не функция целиком, а как при трассировке: for j in [i for i in self.range_reverse(current_function.endEA, current_function.startEA)]: https://raw.githubusercontent.com/EiNSTeiN-/idapython/master/examples/ex_graph.py
    • MasterGHM

      Создать структуру программно

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Программирование ce structure ce lua
      2
      2
      0 Голоса
      2 Сообщения
      49 Просмотры
      MasterGHM
      Решил попробовать написать CE Lua скрипт, который прочесывает структуру и в Dissect data/structures окне создавал бы структуру только со смещениями, с которыми код работает, т.е. читает или пишет. Например, мой персонаж прогуливается по городу, а каждые 200 мс ставится брейкпоинт на смещение +1 до гипотетической N границы структуры (например до 4096). Я не успел сделать определение типа, но смещения внутри структуры получить я успел. Итак, находим начало структуры любой. Запускаем Lua скрипт и просто что-то делаем в игре. Потом вылазит текст с дизассемблированными инструкциями и смещениями. Уже по этим логам можно определить вручную к каким смещением было обращение (адреса по ним мы и будем менять или сравнивать структуры между собой позже) по виду инструкции и соседнему смещению уже примерно можно определить тип данных и их размер Осталось сделать определение типа, а это не так уж долго сделать и осталось взять код из предыдущих записей в блоге формирования структуры в окне dessect data. Так мы получим структуру только с активными смещениями, (а зачем нам пассивные?) и определим в них тип, я надеюсь определим правильно Пример кода, который я использовал addressStructure1 = 0x412E0200 --> адрес начала структуры в любой игре sizeStructure = 100 --> гипототический размер структуры 100 для быстрых поисков, по умолчанию 4096 indexStructure = 0 --> индекс внутри структуры, который будет перемещаться вместе с breakPointAddress breakPointAddress = 0 --> адрес, на который сейчас постален брейкпоинт waitTimeTillBreak = 300 --> частота активности смещеиня resultText = '' --> конкатенация частей текста в этой переменной \-- Функция пытается поставить брейкпоинт на следующий байт в структуре function TryNextSetBreakPointToAddress() debug_removeBreakpoint(breakPointAddress) indexStructure = indexStructure + 1 if indexStructure > sizeStructure then debugTimer.Interval = 1000 debugTimer.Enabled = false debugTimer.destroy() debug_continueFromBreakpoint(co_run) print(resultText) --> вывод результата с завершением отладки return end breakPointAddress = addressStructure1 + indexStructure debug_setBreakpoint(breakPointAddress, 1, bptAccess, bpmDebugRegister) debug_continueFromBreakpoint(co_run) end \-- Любимая функция снятия отладочных данных function debugger_onBreakpoint() -- проверить обращение к структуре prevAddress = getPreviousOpcode(RIP) resultText = resultText..string.format('Offset: + %X : %s', indexStructure, disassemble(prevAddress)) .. '\r\n' TryNextSetBreakPointToAddress() return 1 end \-- Простой таймер debugTimer = createTimer(nil, false) debugTimer.OnTimer = function(timer) TryNextSetBreakPointToAddress() end debugTimer.Interval = waitTimeTillBreak debugTimer.Enabled = true breakPointAddress = addressStructure1 + indexStructure debug_setBreakpoint(breakPointAddress, 1, bptAccess, bpmDebugRegister)
    • MasterGHM

      CE Compact View

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Плагин-строй
      2
      0 Голоса
      2 Сообщения
      67 Просмотры
      MasterGHM
      Ниже находится обучающий пример плагина для CE Lua с установкой компактного режима применяя парадигму ООП — инкапсуляции. Для программирования плагинов на Lua могут пригодится приемы ООП. Это касается сущностей, их поведений и взаимодействий между ними. В данном примере CECompactView — описание класса на основе мета-таблицы и оно является сущностью. Функции класса — uncompact() и compact(), которые реализуют поведения этой сущности. Основной скрипт с описанием сущности можно поместить в отдельный файл .lua и далее можно кратко инициализировать сущность и управлять ей Например \-- Создание экземпляра класса через new() функцию, где аргументом является состояние компактный или некомпактный ce_compact_view = CECompactView:new(true) \-- Проверить состояние \--print(ce_compact_view:get_state() and 'Compact View Mode' or 'Full View Mode') \-- Установить компактный режим \--ce_compact_view:compact() \-- Установить не компактный режим \--ce_compact_view:uncompact() Сам класс или мета-таблица. \-- Класс инкапсулирующий поведения компактного состояния окна CE CECompactView = {} function CECompactView:new(state) local obj = {} -- Состояние компактное или нет: true или false obj.compact_mode = state -- Форма CE, где getMainForm — поддерживаемая функция CE и возвращает главную форму CE obj.form_ce = getMainForm() -- Получение элементов контекстного меню главной формы local menu_items = obj.form_ce.menu.items -- Создание нового контекстного меню с названием CompactView и именем ItemCompact obj.menu_item_compact = createMenuItem(menu_items) obj.menu_item_compact.name = 'ItemCompact' obj.menu_item_compact.caption = 'CompactView' -- Добавление контекстного меню на главную форму menu_items.add(obj.menu_item_compact) -- Сменить состояние окна CE: компактное или нет function obj:set(state) -- view_components состояния скрытия компонентов obj.compact_mode = state -- видимость компонентов обратна компактному режиму local view_components = not state obj.form_ce.panel1.visible = view_components obj.form_ce.panel4.visible = view_components obj.form_ce.panel5.visible = view_components obj.form_ce.Splitter1.visible = view_components -- Записать имя по состоянию obj.menu_item_compact.caption = state and 'Full View Mode' or 'Compact View Mode' -- Поставить обработчик по состоянию obj.menu_item_compact.onClick = state and obj.compact or obj.uncompact print(state and 'Compact View Mode' or 'Full View Mode') end -- Некопактное окно CE function obj:uncompact() obj:set(true) end -- Компактное окно CE function obj:compact() obj:set(false) end -- Состояние окна CE: компактное или нет function obj:get_state() return obj.compact_mode end -- Связь таблицы (смотрим докуметацию по Lua) setmetatable(obj, self) obj.__index = self -- Активировать состояние obj:set(state) -- Возвращает ссылку на экземпляр return obj end \------------ \-- Создание экземпляра класса ce_compact_view = CECompactView:new(true) \-- Проверить состояние \--print(ce_compact_view:get_state() and 'Compact View Mode' or 'Full View Mode') \-- Установить компактный режим \--ce_compact_view:compact() \-- Установить не компактный режим \--ce_compact_view:uncompact() Скрипт можно сохранить в Lua файл и добавить в папку autorun.
    • MasterGHM

      CE Tool Lua Regular expressions 2

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Плагин-строй ce plugin
      2
      5
      0 Голоса
      2 Сообщения
      73 Просмотры
      MasterGHM
      Lua поиск элемента до и после строки Была задача получить два списка из документа, в котором было с пару десятков тысяч строк. На практике выяснилось, что искать текст после ключевого слова легче чем искать текст до ключевого слова. Об этом и будет дальше В утилите "Lua Regular Expressions (v. 1.0)" Текст во вкладке "gmatch" Game1 gameCompany DAU 53.21k -20% Game2 gameCompany DAU 20.35k -20% Поиск элемента после строки: "DAU "DAU%c%c(.-)%c%c" 53.21k;20.35k; Поиск элемента до строки: "%c%c(.-)gameCompany%c%c" (паттерн со двигом скобок для поиска предыдущей фразы) не прокатит для вывода списка игр над фразой gameCompany ;53.21k -20% Game2 ; Очевидно, можно сделать поиск по похожим фрагментам, которые идут последовательно сверху вниз. Cначала добавим первую пустую строку и видим повторяющиеся фрагменты "%c%cGame1%c%cgameCompany%c%c" пишем шаблон ".*%c%c(.-)%c%cgameCompany%c%c" и опять мимо Game1;53.21k -20% Game2; Потому что текст над Game2 пошел выше Game2. Тогда делаем захват, только первой фразы и дальше не идем "%c%c(%w-)%c%cgameCompany%c%c" Game1;Game2; И тогда все ок. Но это еще не все. Осталась первая пустая строка, которую добавили, если её удалить, тогда "%c%c(%w-)%c%cgameCompany%c%c" Game2; Не видит Game1. Значит мы можем убрать %c%c, и будет "(%w-)%c%cgameCompany" Game1;Game2; Дальше название игры может быть таким "My Game: my Game". Здесь и пробел и двоеточие. В таком случае текст уже будет My Game1: my Game gameCompany DAU 53.21k -20% My Game2: my Game gameCompany DAU 20.35k -20% Пробуем "(%w-)%c%cgameCompany" Game;Game; Что не верно, т.к. захват одним (%w-) Мы должны в скобках развернуть фразу имени игры. В ней могут быть пробелы, числа, текст и двоеточие '([%w%s]-)%c%cgameCompany' my Game; my Game; Затем ([:%w%s]-)%c%cgameCompany My Game1: my Game; My Game2: my Game; Затем %c?%c?([:%w%s]-)%c%cgameCompany My Game1: my Game; My Game2: my Game; Вот и все. Если попариться один раз, то тексты уже парсить будет гораздо быстрее. Так я вывел столбы DAU и названий игр в таблицу, что было в районе 500 строк из пару десятков тысяч строк p.s. Текст в консоли Lua отличается %c%c, а %с p.s.p.s. Можно раcсплитить текст по "/n/r" или "/n" в таблицу строк и по индексам данных находить предыдущую или последующую фразу. Но мне проще две строки ввести "%c?%c?([:%w%s]-)%c%cgameCompany" и "DAU%c%c(.-)%c%c"
    • MasterGHM

      Ветвления кода связанные с адресом (старые записи)

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена MasterGH
      2
      2
      0 Голоса
      2 Сообщения
      61 Просмотры
      MasterGHM
      Трассеровка по ретам ------- На скриншоте 22 ветви трассеровки от адреса патронов не входя в call-ы до корневого цикла. Корневой цикл определяется, когда поиск происходит более трех секунд и не находит ничего. Вполне хватает этого времени. Буду еще повторно тестить и проверять доходит ли он цикла или надо еще что-то придумывать. Желтым выделяется точка, вертикальная полоса ветви и связи с такими же узлами. Узел это адрес выхода из ret Внизу ряд счетчиков от 00 до 99. Если более 99 то отсчет заного. Показывает дианамику обращения к ветвям после нахождения корневого цикла Есть еще несколько функций, которых не видно на скриншоте — в контекстном меню. Анализ можно запустить из окна CE из главной таблицы, выделив адрес и опцию либо на чтение, либо на доступ. При тестах увидел, что логи неполные. Например, первый кружок это инструкция читающая патроны очень часто. От этой инструкции идут вверх множество вариантов ветвей,а у меня один вариант — вертикальная полоска с кружками. От первого круга надо сделать ветвление влево и вправо. Занялся модернизацией этого рисования и оптимизацией. Например, чтобы определить является ли проход по ret, то не нужен дизассемблер. Залез в доки и посмотрел опкоды function IsRet(address) local value = readBytes(address,1, false) return value == 0xC3 or value == 0xCB or value == 0xC2 or value == 0xCA end Скорость трассеровки должна в несколько раз увеличиться. К сожалению, смогу это узнать, когда перепишу текущий плагин. Там были уже сделаны изменения (все еще сырое для публикации плагина, пока не публикую) Нумерация ветвей Клик на круг — переход в дефоттный дизассемблер Подсвечивать выбранный круг Перерасчет позиций, когда поменялся размер окна Счетчики выполнений инструкций срабатывающих к обращению на адрес Изменен способ рисования связей между ветвями Контекстное меню Показать ветку Контекстное меню Скрыть ветку На скрытой ветви не показываются связи упрощая обзор. Код поднимается снизу вверх. Если одна ветвь ниже другой, то можно её скрыть. Ориентируемся по счетчикам хитов на инструкции Контекстное меню Сброс хитов Оптимизация поиска корневого цикла Выделение связей Оптимизация рисования новых свзей Контекстное меню пауза/продолжение Запуск из контекстного меню при выделеии адреса в главной таблице При закрытии окна снимаются все брейкпоинты Возможность ставить логи на запись из контекстного меню и на чтение в главной таблице CE
    • MasterGHM

      CE Tiny Dumper

      Отслеживается Игнорируется Запланировано Прикреплена Закрыта Перенесена Плагин-строй
      2
      1
      0 Голоса
      2 Сообщения
      56 Просмотры
      MasterGHM
      Пошаговое руководство по Tiny Dumper В этом руководстве по шагам описано как снять дамп со стека и раструктуризовать его. Если лень читать, то предлагаю посмотреть хотя бы последний скрин. Там можно увидеть результат. Это самый важный скрин. Перед запуском CE устанавливаем файлы плагина в папку autorun (frmTinyDumper.xml и TinyDumper.lua) Запускаем игру например "Painkiller - Battle out of Hell 1.64" поставленная в оконный режим через 3DAnalyze. Оконный режим ставить обязательно, т.к. будет пошаговая отладка. В противном случае игра зависнет, а с CE рабтать нельзя будет Запустить CE с установленным плагином и подключиться к игре Ищем адрес здоровья (или брони, или патронов), тип Double (8 байт) 0x24571EA8 = 99.2900238037109 Ставим бряк на доступ или на запись на адрес 0x24571EA8 Идем в игру и встаем под удар персонажем Появляются инструкции и там же нажимаем на кнопку Stop, чтобы бряки не мешались в окне бряков Берем например инструкцию 1015C194 - 89 53 08 - mov [ebx+08],edx По ней идем в дизассемблер и на инструкции жмем F5 - установка бряка на доступ Открываем окно бряков, выделяем инструкцию и пишем условие на прерывание с остановкой процесса EBX==0x24571EA0 (это условие взяли, потому что ebx находится в инструкции, а значение взяли EBX из отладчика) Нажимаем Ок, идем в игру 9. Видим, что произошла остановка игры 10. Открываем окно ТиниДампера Пишем значение регистра esp и название будущей зарегенной метки Нажимаем "Dump and Close" и CTRL+U чтобы видеть под рукой зареганные ваши метки Открываем окно расструктуризации CTRL+D и пишем метку в свободное поле Далее следуем действия как на рисунках Наконец результат Не только сохраняются данные, которые пропадут на следующий такт процессора, но и расструктуризовали и можем сравнивать эти данные с другими дампами стека. Зачем, как и для чего это выходит за рамки этого руководства. Сейчас процесс игры остановлен на бряке кода. Чтобы продолжить игру. Удаляем бряк из окна бряков и отпускаем игру по F9. Теперь снимаем другие дампы на том же адресе для адресов здоровья врагов на предмет отличиях их или для поиска указателей... Во всяком случае сохраненный дамп может дать какие-то подсказки и зацепки. Главное не начать новый уровень игры или не загружать сохранения, т.к. обычно при переходе на новый уровень данные могут измениться... На этом пока все ----- Tiny dumper 1.2 Сравнение структур после перезагрузки. Поиск фильтра свой-чужой-дружественый Запускаем игру, запускаем CE и присоединяем процесс игры к CE Сохраняем игровой слот перед тем как искать структуры Находим три структуры игроков: свой игрок, дружественный, враг Дампим три структуры из пункта 3 указывая: базовый адрес структуры, уникальную метку Игру закрываем, снова открываем, загружаем слот, присоединяем процесс игры к CE В Tiny dumper 1.2 вызываем контекстное меню правой кнопки мышки и вызываем опцию "Rewrite dumps" - дампы из кеша перезаписываются в память в процесса игры Снова находим три структуры игроков: свой игрой, дружественный, враг В окне расструктуризации создаем три группы Группа1 "Свой игрок": -адрес после перезагрузки -метка из тини дампера своего игрока до перезагрузки Группа2 "Чужой игрок": -адрес после перезагрузки -метка из тини дампера чужого игрока до перезагрузки Группа3 "Дружественный игрок": -адрес после перезагрузки -метка из тини дампера дружественного игрока до перезагрузки Если повезет, то находим фильтр - фиолетового цвета строка. Если филетовых строк несколько, то запоминаем их смещения и значения на всякий случай Пишем АА-скрипт со смещением фильтра. Правильно написанный АА-скрипт не будет крешить игру. Активируем АА-скрипт и проверяем в игре, что свой и дружественный игроки не получают урон, а вражеские получают урон. Если это не так, то берем другие смещения из пункта 9 и повторяем 10. Если фильтр найти не удалось, то ищем 3 многоуровневых указателя до верхего статического адреса для своего, для 2-х врагов. Открываем Structure Spider. Указываем в поиске уровень вложенности указателей. Попеременно вводим два статических адреса - начала структур своего и чужих игроков. Правило поиска выбираем исходя из типов игроков. Если это свой и чужой, то искать отличные. Если это чужой и чужой, то искать одинаковые. Перезапускам игру и опять проделываем эти действия. Если не нашлось ничего, то что-то делали не так или отличия между группами игроков нет. Однако графический интерфейс обычно связан только с нашим героем и не связан с другими. Поэтому по связи GUI как минимум фильтр свой-чужой можно сделать всегда. Что касается дружественных игроков, то нужно будет исследовать более углубленно.
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 2 / 8