Вы видите копию треда, сохраненную 19 июля 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.
Вы пишите на ассемблере или собираетесь начать на нём писать? Программируете микроконтролёры, пишете драйвера для ОС, а то и саму ОС? Вам сюда.
Вы изучаете алгоритмы работы закрытого софта, пишите патчи бинарников? Вам тоже сюда.
Попрошайки с "решите лабу по асме за меня" идут в общий тред, а лучше нахуй.
Шапка треда в процессе пополнения, пока так.
Сайты по RE:
http://wiki.yobi.be/wiki/Reverse-Engineering
https://www.reddit.com/r/ReverseEngineering/comments/hg0fx/a_modest_proposal_absolutely_no_babies_involved/
http://www.program-transformation.org/Transform/ReengineeringWiki
http://blog.livedoor.jp/blackwingcat/
https://yurichev.com/blog/
Список книг по RE:
https://www.goodreads.com/shelf/show/reverse-engineering
Все книги и статьи Криса Касперски (R.I.P.)
https://yadi.sk/d/CxzdM1wyea4WP
Книги по ассемблеру:
"Архитектура компьютера" Э. Таненбаум
С.В. Зубков: Assembler. Язык неограниченных возможностей.
Сайты по ассемблеру:
Замена почившему wasm.ru- https://wasm.in/
https://www.unknowncheats.me/wiki/Assembly
http://asmworld.ru/
https://software.intel.com/en-us/articles/intel-sdm
http://www.nasm.us/doc/
https://sourceware.org/binutils/docs/as/index.html#Top
https://msdn.microsoft.com/en-us/library/afzk3475.aspx
Для ковыряющих винду и софт под неё, сайты с описанием структур со смещениями и разными версиями оных:
http://geoffchappell.com/
http://msdn.moonsols.com/
http://terminus.rewolf.pl/terminus/
Пополнения и исправления приветствуются.
Препод задал написать на ассемблере 2 проги: одна складывает двоичные числа размером 1 байт без учёта знака, другая - с. Либо всё это в одном, я хз. Может помочь кто-нить?
А чому сам не можешь? Ведь вы всего лишь учитесь. Сиди, пробуй, эксперементируй. На время учёбы в универе ты должен самостоятельно делать подобные вещи, ибо из тебя даже червя-пидора не выйдет
>>960670 - анон
sign*
Спрошу тут может кто знает как в VS2017 С++ проект скомпилить в исполняемый файл с одной секцией. в 2013 получалось в 2017 всегда создает .rdata и .text
В шапке отсутствуют https://beginners.re/ (да Юричев есть, но стоило бы сделать акцент) и http://wiki.xentax.com/index.php/DGTEFF что несколько странно.
Спасибо. Не знал про эту книгу.
в vs2013 если не использовать внешних библиотек и указать точку входа получалось + оптимизация на минамальный размер, интересно почему .rdata всегда вставляется перед .text если использовать #pragma comment(linker, "/MERGE:.rdata=.text") и причем она генерится одинаковая для разного кода.
Я имею ввиду, они-то объединяются в одну, но данные секции вставляются перед .text, причем её можно просто удалить(.rdata) и работоспособность программы будет в норме. Мне интересно зачем vs2017 вставляет эту херню в каждый исполняемый файл.
Как вы думаете реально ли быть профессионалом в программировании(неважно на каком языке) не работая нигде и никогда, но имея образование. И какое больше направление подходит для людей который не хотят(или не могут) с этим иметь дело?
Реально если пишешь что-то нужное для себя хотябы. Образование в снг курам на смех.
В смысле нужно или не нужное для себя? Просто заметил на собеседованиях неуважительное отношение когда узнавали, что не работал, а проекты мои личные. Ребята которые сидят на работе мнят себя спецами.
2. Когда сработало исключение PAGE_NOACCESS, что делать дальше? Как разрешить чтение/запись только одной инструкции? Дизассемблировать и смотреть, какие регистры участвуют и самому копировать необходимые данные?
3. Как действовать после брекпойнта (программа не под отладчиком, брекпойнты мои)? Как отладчик делает, когда останавливается на брекпойнте? Ведь один байт затёрт, нужно восстановить его и заново выполнить инструкцию. А после как устанавливают брекпойнт? Отладчик включает пошаговую трассировку и после одного шага устанавливает байт?
1) Очень вряд ли.
2) Проверяешь тип исключения, возвращаешь родной доступ к странице, выставляешь TF в Eflags в сохраненном контексте, говоришь continue execution, получаешь исключение, проверяешь тип, восстаналвиваешь NO_ACCESS, ну ты понял (как вариант, можно ставить PAGE_GUARD вместо NO_ACCESS, тогда будет одним системным вызовом меньше). Если ты про совет из прошлого треда, то да, немного дизасма понадобится: табличка с типами инструкций (можно спиздить из опенсорсных движков) и разбор всяких SIB/ModRM/displacement (можно взять опенсорсный движок целиком).
3) Да. Алсо, есть хардварные точки останова, с ними жизнь проще.
1. Проверил, для каждого потока свой вызов. Поэтому не потокобезопасен.
2. Видимо, это самый простой способ. Неужели в отладчиках так же сделано? Ведь между тем, когда доступ разрешён и повторным исключением пройдёт много времени, хитро настроенный второй поток может успеть между этими событиями прочитать или запись данные и останется незамеченным. Тут нужен бы эмулятор.
>тогда будет одним системным вызовом меньше
Ты про то, что PAGE_GUARD сбрасывается? А то смотрю, что возвращает VirtualProtect, а этот бит уже сброшен.
>можно взять опенсорсный движок целиком
Взял дизассемблер от OllyDbg, а он XMM инструкций не понимает. Краем глаза посмотрел на x64dbg, так там враппер вокруг дизассемблера больше по размеру, чем сам дизассемблер. Надо от qemu ещё посмотреть.
Как и ожидал, после установки TF бита отладчик сам останавливается на следующей инструкции. Не очень удобно.
3. Слишком много мест, их не хватит.
В x64dbg capstone вроде. capstone жирный (там овердохуя таблиц для скорости), но весьма неплохой.
>В x64dbg capstone вроде.
Одуреть, это ты по памяти помнишь, какой дизассемблер в отладчике. Сам только вчера смотрел, но, тем не менее, не вспомнил бы названия. Меня отпугнуло то, что очень большой враппер был вокруг него, хотя и не смотрел, что там, думал, что заставить работать его будет трудно. А оказалось, что пользоваться им очень легко. И главное, он XMM понимает, чего мне не хватало.
Может подскажешь какой-нибудь эмулятор х86. Очень бы не хотелось писать самому, долго будет очередной велосипед делать. Нужен достаточно простой, но с установкой своих начальных значений регистров и некоторых обработчиков типа записи и чтения памяти. Как в плагине к ida x86 emulator.
Антохи а как можно с дженерик говнокода на асме сделать специфический для моего процессора?
Чего-то запутался уже с исключениями. Если, попав в VEH обработчик, взвести бит TF, то после выхода из него и возобновления работы программы будет исключение EXCEPTION_SINGLE_STEP. Но флаг остаётся взведённым? Потому что у меня никак не получается поймать это исключение. Как только управление передаётся в юзер спейс, опять будет это исключение? И так до STATUS_STACK_OVERFLOW.
Читаю про dr-регистры. Их-то можно поймать в VEH обработчике? Или надо отдельный процесс делать? Первая попытка не удачная.
Компилятор из C может собирать что угодно. Тебе надо сделать дизассемблер с asm, перевести его в промежуточный опкод, а потом конвертировать в ассемблер твоего специфичного кода. В llvm есть что-то подобное с возможностью переводить из одного языка программирования в другой. Тебе нужно будет написать соответственно для асма x86 и своего языка.
Они нужны для работы malloc/realloc вестимо.
Ну судя по названию, ты прав, это exception filter и finally handler. Что-то /EHsc с собой тащит, может быть?
Да, так и есть, воткнул в except вызов функции- этот самый RtlZeroHeap_filt_0 объявился сам.
Правда не очень понимаю, как мой код трансформируется в эту фигатень. Ладно, буду экспериментировать и читать про структурированную обработку исключений.
Нашёл, XMM_SAVE_AREA32. Почему-то они только для 64 битной ОС определены.
А что тебе пояснять? Мануалы есть в сети. Сам по себе он 16-битное говно мамонта, про многие инструкции не знает. Если есть конкретная проблема - спрашивай.
Да, OllyDbg намного лучше. А возможно, стоит сразу на x64dbg посмотреть.
> Есть ли какие нибудь задачки
Как же вы заебали. Придумай сам себе задачу. Отлаживай собственные программы. Возьми коллекцию крякми и взломай их все.
Отслеживать вызовы подпрограмм, смотреть, какие регистры заполняются, какие структуры в памяти заполняются.
Статьи на экзелаб, не плагодари.
Когда скомпилировал через gcc hello.s -o hello вышло 8200 байтов. Почему?
>Написал небольшую программку для линукса (хеловорлд) https://pastebin.com/d6Zfm8Rn
>Когда скомпилировал через gcc hello.s -o hello вышло 8200 байтов. Почему?
А почему ты GCC юзал?
Есть as(часть gcc), и другие ассемблеры.
strip -s helloworld не забудь.
gcc code.c -o code. "-O2" не меняет ситуацию. Смотрю через objdump -d. Что я не так делаю?
>Смотрю через objdump -d.
Поэтому люди и пользуются продвинутыми средствами типа IDA, которые пропускают лишний код и показывают сразу точку входа, минуя библиотечные функции.
>IDA Starter Licenses start at 589 USD or 529 EUR. IDA Professional Licenses start at 1129 USD / 1019 EUR.
gcc -S есть. Простыни остаются, но читать легче.
Возможно ли даемону в фоне с правами 0й сессии отслеживать такие штуки как
-открытие процесса(OpenProcess)
-чтение(ReadProcessMemory)
-запись(WriteProcessMemory)
-выделение памяти (VirtualMemoryAlloc)
-создание потока выполнения (CreateRemoteThread)
И прочие штуки. Должны же как-то работать антивирусные и античит системы, информации в сети мало.
Читал, например, что VAC использует динамически загружаемые с их сервера тесты для памяти и на основе статистик принимают решения.
Когда придёт прошаренный человек, он тебе разъяснит. А у меня такие мысли.
>с правами 0й сессии
Что это означает? Из третьего кольца? Если из нулевого, то всё понятно. Значит юзерспейс. Да, можно. И без даемона (просто не знаю, как по другому). Подгружаешь свою dll во все процессы (с помощью реестра, загуглишь) и ставишь переходы на интересующие тебя вещи. Учитывай, что многие защиты не любят, когда на системных функциях стоит jmp в самом начале, добавь мусорных команд.
>Должны же как-то работать антивирусные
Они работают на нулевом кольце.
>и античит системы
А у этих такие же возможности, как и у тебя, если в тихую не устанавливают драйвер.
>Читал, например, что VAC использует динамически загружаемые с их сервера тесты для памяти и на основе статистик принимают решения.
Тоже читал, что VAC ищет читы по сигнатурам. Изменил опции компиляции - изменилась сигнатура. Учитывая, что существует столько читов - это очень ненадёжная система.
Но вайршарк слушает то, что проходит через сетевую карту. А у меня веб приложение уже запущено, я туда уже зашел, и теперь оно взаимодействует с сервисом напрямую локально.
>Ты поехавший?
Что не так? Все лаунчеры ммо, которые запускаются с сайта, так работают. Или у тебя другие сведения? Изложи их тогда. тогда.
>Алсо в этой вашей балмерне есть свои замуты с WinPcap и loopback
Ничего об этом не слышал.
С каким сервисом он работает? С апачем? Я скачал игру сиськи письки онлайн от мейлру и они мне апач поставили?
Какой апач, ты что несёшь? Сервисом (daemon), а не сервером.
Во всех игрушках это работает так: у тебя есть игра, клиент которой запускается через обычный экзешник; авторизируешься на сайте -> сервер сайта в бекенде выдаёт шифрованный ключ, который передаётся в сервис, который постоянно его мониторит -> если ключ правильный, сервис запускает экзешник клиента с параметрами, вроде этого ключа. Я хочу прослушать, чем сервис на пекарне обменивается с веб приложением, и потом с самым клиентом.
Смотри, либо ты нормальным человеческим языком описываешь все части этой системы и все протоколы, по которым они взаимодействуют, либо ты официально признаешься поехавшим, у которого демон мониторит шифрованные ключи.
>все части этой системы и все протоколы
Если бы у меня был доступ к исходникам, так бы и сделал. А сейчас мне как раз нужно в них разобраться, я хочу сделать обход запуска с сайта.
>либо ты официально признаешься поехавшим, у которого демон мониторит шифрованные ключи
Папики пришли учить, не давая никаких ответов на конкретные вопросы. Я тебя сразу спросил, если у тебя есть другая информация, говори, каким образом кнопка на сайте запускает экзешник клиента.
То есть от того, что я пропустил по незнанию аддон в списке сайт -> сервис -> клиент, я и стал поехавшим в твоих глазах, ясно.
Мой вопрос остается в силе, каким образом я должен влезть между сайтом (аддоном) и сервисом, чтобы прослушать их обмен? И если такой вариант тебе не нравится, то вариант номер два - какие образом прослушать, с какими конкретно параметрами запускается клиентский экзешник?
>каким образом кнопка на сайте запускает экзешник клиента
Быстрое гугление выдало такие ссылки:
https://toster.ru/q/89523
https://toster.ru/q/3704
Это так же, как магнет-ссылки и прочие приложения, которые можно запустить из браузера.
>>971159
И будь спокойнее.
>каким образом я должен влезть между сайтом (аддоном) и сервисом
MIMT-прокси.
Простейший вариант - Fiddler, хотя сам пишу велосипеды под свои нужды: чистый C + libevent + OpenSSL и свой доверенный корневой сертификат.
Внезапно на винде удобнее. Но если хочешь стать годным специалистом, без погружения в ядро линукса ты не обойдешься, и это погружение даст тебе много знаний и скиллов.
Да.
Можно ли в IDA настроить нормальное отображение регистров периферии? Мне бы для начала разобраться с тем как там настроена периферия.
Делаешь структуру для каждого периферийного устройства, скриптом или руками втыкаешь эту структуру по соответствующему адресу.
Их сертификат генерируется, когда в опциях разрешишь перехват SSL трафика. При этом создаётся новый сертификат для каждого сайта (валидный год или даже больше) и он устанавливается в систему. Вот за последнее свойство и пишу сам наипростейший mitm-прокси, который не захламляет систему левыми сертификатами, а генерирует их налету и не сохраняет никуда.
>>971180
Простите, опечатался.
>Их сертификат генерируется, когда в опциях разрешишь перехват SSL трафика.
Тебе за софтину, которую ломают. Она может хуй класть на общесистемное хранилище.
Ещё раз. Клиент может:
1) Использовать свой сертификат, а не скачивать его по http
2) Скачивать его по http и проверять, например, что он выдан верисигном, а не вася-пупкин-ца
Сейчас 2017 год, даже хром что-то подобное делает. А тут речь идет о нативном клиенте который может извращаться с ссл как угодно.
>то вариант номер два
Проверил этот путь, все тухло. На остальных локализациях можно было выдрать отсюда параметры запуска клиента, но в даном случае ничего нет. При чем я точно знаю, что параметры передаются, так как экзешник клиента можно запустить вручную.
>>971201
Ну ты чего? Один из вариантов ему предложил. Пусть смотрит, как работает софт. Очень часто он использует движок IE или использует корневые сертификаты системы. Где-то же он берёт сертификат, которому доверяет.
>Использовать свой сертификат
Заменим на свой.
>Скачивать его по http и проверять, например, что он выдан верисигном
Создать свой самоподписанный сертификат со всеми полями верисигна и установить его в систему.
>даже хром что-то подобное делает
Он использует хранилище сертификатов Windows. Mitm работал на нём, сам лично проверял, все сайты, даже гугловские.
>А тут речь идет о нативном клиенте который может извращаться с ссл как угодно.
Особенно замечательно, когда есть две dll: libeay32.dll и ssleay32.dll, достаточно две функции изменить, чтобы писали весь трафик в лог.
Но всё, само собой, зависит от приложения. Оно может параноидально проверять всё, быть зашифрованным, закриптованным, использовать VM и прочее. А может и ничего из перечисленного.
>>971204
Запусти от администратора.
>Запусти от администратора.
Я и запускал. Но вот у их защитника параметры оказались очень похожы на те, что я вижу на других локализациях.
http://www.chromium.org/Home/chromium-security/security-faq#TOC-How-does-key-pinning-interact-with-local-proxies-and-filters-
У хрома там забавные правила, да. Но он защищается от недобросовестных ЦА, так что в этом плане все ок.
Знакомый параметр /username, как от Sony, одна из их игр FreeRealms, которую безуспешно пытался запустить ввиду отсутствия нужных файлов. Ты немного тупишь, тебе правильно написали. Запусти Wireshark и посмотри что и куда передаётся. А чтобы не было левого трафика, закрой все приложения, которые используют сеть. Там (возможно) должен запускаться загрузчик, который общается с сервером по UDP. Ты где пароль вводишь: на сайте или в клиенте?
Проблема только в том, что нужно знать шифрованный логин и пароль, в других локализациях этого не требовалось. Да и местный защитник Фрост тоже стартует.
Собственно, вот и всё. Достаточно один раз подсмотреть логин и пароль у фроста и потом можно запускать так. Как видно, фрост больше не является главным процессом.
Вот видишь, а ты все демоны, апач, веб-приложения. А оказалось что параметры через командную строку передаются. Алсо если ты запустишь без их античит поеботы ты можешь попасть в чорный список и твоего перса посадят на бутылку. А можешь и не попасть.
У меня нет перса, я не играю.
Разлогинился на сайте, заблокировал расширение в браузере, отключил сервис - приложение отказывается запускаться, неверный пароль. Блядь.
Может там не шифрованные логин-пароль, а одноразовые или сессионные логин-пароль?
This. Логин остался без изменений, а вот пароль сменился. Блядь, у этой проблемы решения нет.
Почему? Можно через curl на их веб-сервак ебануть свой логин-пароль и получить сессионный ключ. Скорее всего.
А в чем смысл изначально этого всего? Может тебе просто локализацию перенести если английский клиент взломан а ты делаешь русскую пираточку?
>смысл
Сделать нормальный ланчер без привязки к сайту, как это все и происходит на других локализациях.
Но это лаунчер для онлайн игры и если они хотят сессионный ключ то тебе придется его получать. Другой вопрос - хотят ли они его?
Вспомнил, что в запакованных файлах есть параметр use-web-launcher, перезапаковал со значением false. Теперь могу доходить до стандартного окна входа, как в других локализациях, вот только ни мыло, ни айди не подходят как логин. Мда уж, чего они наворотили там.
Под "легче" я имел в виду не эффективнее, а легче для ньюфага.
Кстати, насчет CE. Часто не могу найти текстовое значение, хотя на экране в дрочильне четко видно текст а значит он обязан где-то храниться. С чем может быть связано?
Хуй знает, но на экране никаких специальных символов, простой текст латиницей. Не должно же быть разницы, разве нет?
Ну нихуя себе нет! ASCII или UTF-8 для латиницы - один байт на символ, UTF-16 (UCS-16) - два байта на символ, UTF-32 (UCS-32) - четыре байта на символ. А еще могут быть шифрованные строки.
>UTF-16 (UCS-16) UTF-32 (UCS-32)
Да это никто и не использует в здравом уме.
>ASCII или UTF-8
Разница в поиске между этими кодировками есть?
В любом другом случае - да, но не с идой. Такому охуевшему долбоебу как ильфак могу только хуй под язык положить
> Да это никто и не использует в здравом уме.
Вся Windows API использует UTF-16 (прошлые версии - UCS-16). В крестах wstring использует UTF-16. В ресурсах PE-файлов строки хранятся как UTF-16. В андроиде нативные либы используют UTF-32. Я видел и виндовые приложения, в которых внутри UTF-32, им так проще - не нужно обрабатывать суррогатные пары.
> Разница в поиске между этими кодировками есть?
Для латиницы нет.
Ну окей, тогда просто ставить галку Unicode в следующий раз, если ничего не находит?
Да. Но если CE - это читенжин, то я им ни разу не пользовался, и не знаю, как там принято искать текст.
Не понимаю, что происходит после написания кода, но перед получением исполняемого файла. Компилю все клангом или gcc, и всегда получаю кучу левого кода в файл. Где почитать об этом?
Возьми gcc, погугли ключик "-save-temps". Ну и про ключик -v тоже не забывай.
Ещё погугли "Understanding and Writing Compilers" (Richard Bornat).
Мне кажется я решил, но не знаю правильно или нет. Проверьте, пожалуйста.
На винде строки хранятся в DATA-сегменте, а на линуксе в .rodata. В DATA можно писать, а в .rodata нельзя. Поэтому на винде все работает, а на линуксе нет.
> Поэтому на винде все работает
Какой-то странный челлендж. Вопрос уровня i += i++ + ++i. Особенности компилятора, которые могут изменяться от версии к версии, зачем их знать? В гцц строковые литералы ридонли по умолчанию, но у кого-то в системе зачем-нибудь может быть -fwritable-strings в CFLAGS, и тогда все будет работать. То же и с MSVC. По умолчанию строки доступны для записи (хуй знает насчет новых версий), но есть /GF, тогда будет как в гцц. А ответ простой: писать в строковый литерал - это undefined behavior, и все, что нужно про это знать - так делать нельзя.
Мега спасибо за развернутое объяснение
/bytesex/
Шенжен - 11/10, тис - говно/10, hrm - 5/10.
Изучаю системные вызовы линукса путём чтения менпейджей и экспериментов и не могу разобраться со вторым сискаллом, а именно с функцией open. А именно я не могу понять как ставятся флаги. Вот у меня получается создавать файл, но в нём всё запрещено. Я экспериментами нашёл что седьмой справа бит отвечает за создание файла, но как сделать так чтобы он был разрешён к читанию и писанию и выполнению я незнаю. Как это сделать?
Как это ты читаешь маны, но man open не читал и флагов там не увидел, и грепнуть/printf-нуть флаги или заинклудить соответствующий .h ты не можешь?
Смотри, у тебя есть аргумент flags. Каждый флаг, типа O_RDONLY расценивай как двоичное число типа 0000001000000. Разные флаги имеют единички в разных местах. Чтобы совместить два флага, типа O_RDWR и O_CLOEXEC, надо включить еденички с обоих позиций, то есть на позициях обоих флагов. Чтобы проставить единички с включением обоих флагов пиши так:
open(file, O_RDWR | O_CLOEXEC);
Побитовое ИЛИ проставит единички, как сумму всех флагов. Удачи в понимании этого сообщения
Так и есть. Я к тому, что не думай о них как о "32" или "16"
> А оно разве не таким и есть?
Существуют флаги с дублирующимися битами. Если сложить 0x11 и 0x09 - получится не то, что ожидается от флагов, а вот | отработает как положено.
>брейкдаун
Наверное, брейкпойнт.
>вылетает онлайн-игрушка
Какой дебаггер, как проявляется вылет. Плагины не помогают?
>я не хочу ничего редактировать, я просто хочу считывать значения
Можно через ReadProcessMemory попробовать, если знаешь точные адреса или можешь их найти.
Вангую использует olly для поиска указателей в играх , используй CE лучше для этого,(он не останавливает процесс что в итоге не дропает процесс.
С этого момента поподробней как при помощи readpm найти указатель
>Наверное, брейкпойнт.
Да, сорян.
>Какой дебаггер, как проявляется вылет. Плагины не помогают?
CE, выбираю пункт меню с брейкпоинтом на любой найденный адрес со значением, и игрушка моментально вылетает без ошибок. Каких heartbeat в игрушке нет, античит защита отключена разрабами.
>Можно через ReadProcessMemory попробовать, если знаешь точные адреса или можешь их найти.
Можно поподробнее? Не знаю адресов, как раз их и пытаюсь найти, ради этого и затевал.
>>973727
>Вангую использует olly для поиска указателей в играх , используй CE
А я и использую CE.
Запутанно ты пишешь. Если нет никакой защиты в приложении, тогда ничего и не должно срабатывать. Не знаю, как ведёт себя CE, он как отладчик присоединяется к процессу? Программа своим поведением на точку останова напоминает реакцию на исключение в каком-нибудь VEH, когда
else
{
ExitProcess(...);
}
Попробуй OllyDbg для разнообразия и поставь точку останова на ExitProcess, посмотри, кто её вызывает.
>Не знаю адресов, как раз их и пытаюсь найти
Что ты ищешь-то? Что за игра, дай немного информации, что уже сделал, что нужно сделать.
>как ведёт себя CE, он как отладчик присоединяется к процессу?
Ах если бы я знал. По внешним признакам НИЧЕГО не происходит, просто вылетает игрушка.
>Попробуй OllyDbg для разнообразия и поставь точку останова на ExitProcess, посмотри, кто её вызывает.
Попробую сегодня, как доберусь домой.
>Что ты ищешь-то? Что за игра, дай немного информации, что уже сделал, что нужно сделать.
Да ничего ещё не сделал. Есть группа из нескольких игроков, я хочу считывать их имена в string, а потом уже проводить с ними операции, которые не касаются этого треда. Ищу string, нахожу имя на экране, при перезапуске игрушки имени по тому адресу уже нет, очевидно. Поэтому мне и нужны указатели на эти надписи. Правой кнопкой мыши по найденному адресу и выбираю пункт меню для поиска поинтеров, игрушка моментально вылетает.
>при перезапуске игрушки имени по тому адресу уже нет, очевидно
Скорее всего, игра написана на C++. Нужно искать, где хранятся (создаются) имена, а по ним выходить по цепочке на глобальный класс. А когда найдёшь, уже с помощью ReadProcessMemory в обратном (в данном случае, прямом) направлении пройдёшь. Ну это в теории. Надо реверсить игру, искать, где, кто и что создаёт. Сам бы так делал. Возможно, можно проще.
>Нужно искать, где хранятся (создаются) имена, а по ним выходить по цепочке на глобальный класс. А когда найдёшь
Алло, это я и пытаюсь делать с первого поста.
Твои советы слишком абстрактные для ньюфага. Ты можешь сказать, что конкретно мне нужно делать для того, чтобы найти корневые адреса и офсеты?
> Ищу string, нахожу имя на экране, при перезапуске игрушки имени по тому адресу уже нет, очевидно.
В CheatEngine есть охуенный туториал, где на примерах показывается как искать статические адреса указателей.
https://youtu.be/5us6a9b2zDk
Вообще советую весь туториал самому прорешать.
ПРОГРАММИРУЕШЬ НА АССЕМБЛЕРЕ
@
НЕ МОЖЕШЬ РЕШИТЬ ЧЕМ ПОЖЕРТВОВАТЬ
@
СЭКОНОМИТЬ ОПЕРАТИВНУЮ ПАМЯТЬ, НО УМЕНЬШИТЬ СКОРОСТЬ ПРОГРАММЫ
@
ИЛИ УВЕЛИЧИТЬ СКОРОСТЬ, НО ЗАНЯТЬ ЕЩЁ ПАМЯТИ
@
ТВОЯ ПРОГРАММА ВЕСИТ 5 КБ
>ТВОЯ ПРОГРАММА ВЕСИТ 5 КБ
@
ТЫ ДОБАВЛЯЕШЬ ИКОНКУ
@
ДЛЯ ОТОБРАЖЕНИЯ В ПРОВОДНИКЕ ШИНДОФС
@
ПРОГРАММА НАЧИНАЕТ ВЕСИТЬ 30КБ
@
ПИШЕШЬ КОД НА АСМЕ ДЛЯ СЖАТИЯ ИКОНОК
https://habrahabr.ru/post/247425/
В ФОРМАТЕ PNG ПРИ ПОМОЩИ FASM
@
НАДЕЯЛСЯ УВИДЕТЬ РЕАЛИЗАЦИЮ DEFLATE НА МАКРОЯЗЫКА FASM
@
file 'icon16.png'
@
ОПЯТЬ ХЕЛЛОВОРЛД ДЛЯ НУБОВ
Перетолстил.
если рядом кинуть player.ini с соджержимым 800 600 32 0 BaseCMO.cmo
то игра запустится в окне и все хорошо (ну относительно, есть бага что свернуть развернуть и она растягивается в фулскрин)
Хочется сделать окно побольше, а то мелковато. спрятать курсор, рамку и т.д. это решается за счет ultimate-ASI-Loader
Вроде нашел место где проверяются значения. Файл открывается тут :0040437D
Но что то раскурить проверку не получается, вообще не пойму что она делает.
через читэнджи искать адреса где хранится значение для разрешения - дохлый номер, в игре нельзя переключать.
хелпплз.
п.с.: первые два значения в инишники вообще по барабану, что бы не написал окно всегда 800*600
>Список книг по RE:
в список однозначно стоит добавить раз уж блог его указали https://beginners.re/
демка - это ты про фри версию 5 давности?
>Хочется сделать окно побольше
Там ниже переписываются значения разрешения экрана. По адресам 00404413 и 00404423. nop'ами попробуй их заменить.
Как мне кажется, в этом месте баг. Вероятно, хотели значения присваивать до открытия файла, а то какой смысл после открытия и считывания переписывать.
занопил в ольке наживую, рендер разрешение изменил. А вот задники нет.
Не всё так просто похоже будет. Эх.
> А вот задники нет.
Как я и думал, это не глюк, как полагал >>974204-кун, а комментирование недописанного функционала.
или отключенного за ненадобностью. Типа не на чем запустить такое. хехе. Игра то старая.
в сибирии 2 так же, только там разрешение жестко забито в ехешнике.
Ндо андроид версию ковырнуть будет. Где то да должно быть масштабирование текстур.
Внезапно printf. Посмотри в примерах к фасму, там есть хелловорлд для линуксов, в том числе и с libc.
да, а фасм научился наконец то дебаг инфу в эксешники пихать? или все по старому, пилишь отдельно скомпиленое, отдельно листинг ?
только что экспериментальным путём узнал что syscall (по крайней мере тот, который write) в линуксе изменяет значение r11. Какие ещё регистры он изменяет?
Из того, что мне оч нравилось в ней, что просчитаные данные, хранятся как есть пока функцию не перезапустишь, и можно один раз обсчитав все, потом исопльзовать снова и снова.
удобно было что пишшеь функцию, и сразу видишь результат (так же с уже просчитаннми данными все можно сохранить)
нужно что нибудь подобное, и не оч громоздкое/
Пробовал LUA использовать для этого, не т само собой. Матлаб что ли? есть у кого идеи.
или пытаться вспомнить плюсы/QT и доводить https://sourceforge.net/projects/ggap/ до работы с актуальной версией?
Научился для COFF вроде как. Но отдельной утилитой. Плюс на fasmg можно сделать любой формат отладочной инфы, но надо понимать, что fasmg - это тормоза и костыли.
Хочу на ассемблере сделать консольную игру с аскии-графикой. Но как это сделать? С выводом разноцветных символов я уже разобрался. Как сделать так чтобы либо каждый раз символы стирались и заново писались либо чтобы курсор переходил на сколько-то строк и символов вверх и заново писал символы? Это чтобы добиться изменения изображения.
Может надо использовать сискалл, который переводит курсор в файле? Ведь у консольки есть свой файловый дескриптор
Привет, программач.
Пишу на NASM и сижу на Debian. Мне надо считать любой возможный сектор ЖД. С сделал INT 13h, на что получил закономерный Segmentation Fault. Попытался в гугл, а гугл говорит, что иди-ка ты нахуй с прерываниями к BIOS'у из под пинуса и пиздуй в DOS. Собственно вопрос. Можно ли мне, дегенерату, обойтись без DOS'а получить результат из Debian'а? Если нет, то помоги с материалом для дальнейшей работы. Что ставить, как сделать бочку работать и поставить свой кал NASM на на него?
В общий написал. Сюда на всякий тоже
> получить результат из Debian
Если тебе именно прочитать нужно, то лучше возьми Си, open(/dev/sdX) (где X - нужный тебе накопитель), seek, read, close (в принципе на асме то же самое, можно сисколлами, можно с libc линковаться). Если это какая-то лаба, ставь DOSBox.
Мне не надо самое простое. Я из тех кто любит изобретать велосипеды.
> С сделал INT 13h, на что получил закономерный Segmentation Fault.
А вот нехуй в защищенном режиме прерывания теребить.
> гугл говорит, что иди-ка ты нахуй с прерываниями к BIOS'у из под пинуса
Не только из под пинуса.
> Можно ли мне, дегенерату, обойтись без DOS'а получить результат из Debian'а?
Очевидная виртуалка очевидна.
Либо пили свой загрузчик, пиши его на загрузочный носитель и в нем еби свой жд хоть через порты. Только сначала лучше убедись, что на канале есть ответ от жд.
>символы E-SaFeNet LOCK
В гугл заглядывал? Там https://www.linuxquestions.org/questions/programming-9/how-to-decrypt-e-safenet-lock-source-files-4175455615/ мне предложили сходить по этой ссылке https://sentinel.gemalto.com/software-monetization/software-protection/
А если у тебя исходники на руках, посмотри в них, как с бинарными файлами работать. И что значит, пустые файлы? Нулями заполненные? Нули явно не разреверсишь.
>>976498
Берёшь любую программу и реверсишь. Если что-то не понятно, гуглишь, учишь и продолжаешь реверсить. Есть crackme разной степени сложности. Есть где-то руководство на русском языке по изучению OllyDbg. Есть "Образ мышления - дизассемблер Ida" для изучения, собственно, Ida.
Душевное.
>А если у тебя исходники на руках, посмотри в них, как с бинарными файлами работать
Это должны быть тексты на Си, при компиляции таких файлов компилятор выдает ошибку и сборка не идет.
Первые 256 байтов - литералы E-SafeNet LOCK и нулевые байты. После первого 256байт-сектора начинается шифрокаша.
Вот четвёртой ссылкой гугл выдал такое https://github.com/c3c/E-Safenet/blob/master/esafenet.py
Ты скинул бы куда-нибудь эти исходники. А то гадать приходится, что там у тебя уже есть, а чего нет, что в файлах, а что в исходниках.
Доки прочитал, и еще в нете навернул. И попробовал атаки по паттернам и известному тексту. Известный текст под рукой оказался, но не подходил из-за того, что файлы неодинаковые и это были сорцы с другого ведра. По паттернам не выдает адекватные ключи и не расшифровывает. А что с атакой по шифротексту - выдается текст, который нужно очень долго править. Хз что делать.
Тогда мой первый вопрос. Открываю exe в олли и ищу в string references строку, которую программа сохраняет в файл, а именно AuthnToken. Но в string references по какой-то причине этой строки нет. Что делать дальше? Я даже не знаю, как такую проблему гуглить.
Может файл пожат, может олька ссылку не распознала на строку. Ищи в памяти по Alt+M, ставь хардварный брейкпоинт на чтение, жди.
Я перед открытием проверил в PEiD не запакована ли программа, и там никаких подводных не оказалось. Пошёл пробовать твой вариант.
А на что ставить брейкпоинт?
Нашёл стринг! Только не в экзешнике основной программы, а там же в либах. Можно эту строчку как-то отредактировать?
А также сама олька. Или она не сохраняет релоки при редактировании длл? (никогда не пробовал)
https://pastebin.com/5FfBvp95
sector выходит с нулями и AH тоже равен нулю. Что я делаю не так?
https://pastebin.com/2FhtHes0
>Или она не сохраняет релоки при редактировании длл?
А кто-то их вообще сохраняет? Кроме как при редактировании ресурсов увеличивать строки никто не умеет, кмк.
Ну, во-первых, изменялку строк в .exe только ленивый не писал. Это совсем просто для длл и чуть посложнее (требует предварительного анализа в IDA, хотя бы автоматического) для exe без релоков.
Во-вторых, я думал, может быть, олька при сохранении дллки дропает релоки. Но если еще подумать, то ей незачем это делать.
Что-то не гуглится с ходу. Инсталятор у них упакован upx и этот первый шаг легко пройти. А дальше чем его открывать?
Вариант с запуском на виртуалке не подходит -- так как потом надо тратить неделю на чтение лога куда оно что писало и что делало с реестром.
>подскажите что нибудь типа GAP, раньше при разборе алгоритмов, на ней частенько вычисления гонял
А что ты там считал? Мне интересно, т.к. полгода где-то назад пару дней с ней игрался. Но я нуб в алгебре. И и не смог оценить.
Можно ли с помощью нее научиться Теории Галуа за короткий срок? Или она для чего-то другого?
Еще есть Magma, но там анальная лицензия. На рутрекере вроде есть пара ломанных версий. Но я не запускал.
>InstallAnywhere
>Anywhere
>эта цена
>Java-машина не найдена
>2017
До чего мы дожили.
Это не дожили, этой херне много лет уже, если я правильно помню.
Открой экзешник в хекс-редакторе, найди Hello, да поменяй. Если строчка короче, то проблем нет.
Сам отвечу на вопрос для архивача и гугла. Можно распаковать в два этапа:
1. upx.exe -d -o temp.exe ..\FooBar_install.exe
2. unzip.exe temp.exe -d .\unzip\
Unzip нужно взять отсюда (7-zip не подходит):
ftp://ftp.info-zip.org/pub/infozip/win32/
Я ссылки не дал, потому что это делается скриптом строк за 20 от силы. Длл и exe с релоками:
1) Идем по релокам, смотрим, не указывают ли адреса, к которым применяются поправки, на строку (без дизасма, тупо взяли адрес и сравнили). Собираем такие адреса. В качестве парсера можно взять pefile для питона.
2) Кладем куда-нибудь новую строку: в хвост существующей секции (если есть место), в заголовок, можно новую секцию создать и т. д.
3) Патчим адреса, собранные на шаге 1 новым адресом строки.
Для exe без релоков:
1) Натравливаем на бинарник IDA, а когда анализ завершится, скриптом выдираем все ссылки на строку (idc.DfirstB/idc.DnextB).
2-3) Аналогично.
Есть случаи, когда все это не работает (хитрые ссылки, ида не распознала весь код, не ссылки из секции данных или слажала еще как-то и т. д.), но чаще всего этого более чем достаточно.
>Я ссылки не дал, потому что это делается скриптом строк за 20 от силы.
Ага. И где готовый для тех, кто вообще не в теме, а просто проходил мимо и решил заменить пару строк в бинарнике?
> кто вообще не в теме, а просто проходил мимо
Скрипткиддисы нинужны. Но в виде исключения вот тебе самый простой случай для 32-битных бинарников с релоками. И это только патч ссылок, саму строку легко и вручную в хекс-редакторе воткнуть:
https://gist.github.com/anonymous/8deb02d068182119b344d30617c64030
>Скрипткиддисы нинужны.
Но ведь я именно он, сижу, венду ковыряю. Все мы когда-то были начинающими.
Ну так ты ведь мог и сам написать такое же по описанию на любом известном тебе языке. И написав сам, ты бы приобрел знания и навыки, которые иногда пригождаются. Например, я писал подобное, когда нужно было массово перемещать глобальные инстансы классов из одной секции длл в другую - хуй бы я готовый скрипт под это нашел.
S-box-ы ищи сигнатурно. Сам или каким-нибудь PEiD+kanal (что сейчас вместо PEiD модно, напомните?).
>S-box-ы ищи сигнатурно
Эээ... А можно ли так, чтобы я мог загуглить и найти какие-то туторталы или аналогичные кейсы?
Со своей стороны я глянул туторталы по ollydbg на ютубах, и ВО ВСЕХ они ищут текст из окошка в стиле "Ваш пароль неверный", подогрел с этого. У меня нет никаких окошек, я просто знаю, что где-то в коде есть мой AES ключ.
Ну сходи в вики, прочитай описание алгоритма для начала, потом почитай https://en.wikipedia.org/wiki/Rijndael_key_schedule. Потом ищи S-box-ы, потом ищи, кто на них ссылается, т.е., где развертывается ключ. А заодно почитай хотя бы что-нибудь обзорное про поля Галуа. Можешь вот этого дядьку глянуть: https://www.youtube.com/playlist?list=PL6N5qY2nvvJE8X75VkXglSrVhLv1tVcfy (лекции 7-8 или даже весь плейлист целиком). Алсо, по лекциям есть книжка.
> туториалы
Хуй знает. Тут чисто логически понятно, что нужно делать.
> загуглить
Я тебе уже дал кейворд: peid+kanal, ты поискал сигнатуры?
> формируется AES ключ
И вообще, ты весьма расплывчато расписал задачу. Может, тебе вообще не AES-ключ, а ключ для AES нужен? Какие-нибудь рандомные байты, которые используются в качестве входа для KDF?
>Ну сходи в вики, прочитай
Почитаю и посмотрю прямо сейчас.
>Хуй знает. Тут чисто логически понятно, что нужно делать.
Ну я вообще ничего не знаю про реверс, я просто пишу на разных языках всякую фигню как хобби.
>Я тебе уже дал кейворд: peid+kanal, ты поискал сигнатуры?
Я даже не знаю, что такое сигнатуры, лол. Вот про PEiD знаю, это тулза для просмотра не упакован ли экзешник (у меня как раз упакован, кстати, но судя потому, что я нагуглил, это не важно в моем случае).
>И вообще, ты весьма расплывчато расписал задачу. Может, тебе вообще не AES-ключ, а ключ для AES нужен?
Нужен именно AES ключ. Смотри, программка обменивается с серверами какими-то своими ключами, потом на основе этих ключей внутри себя формирует ключ, которым потом шифрует свои данные с помощью AES ECB. И чтобы расшифровать данные мне и нужен этот ключ.
>Какие-нибудь рандомные байты, которые используются в качестве входа для KDF?
Тут без понятия вообще.
Задача для меня очень сложная, но я хотел бы разобраться с реверсом на основе этого практического примера. Проблема ещё в том, что экзешник 64битный и в ollydbg не открывается.
> разобраться с реверсом на основе этого практического примера
Упаковщик, 64 бита, криптография (да не простая, а AES та же RSA гораздо понятнее для прогуливавших математику, сервер - все вместе это очень хуевый выбор для первой задачи.
> упакован, кстати, но судя потому, что я нагуглил, это не важно в моем случае
В IDA код смотреть гораздо проще, чем в отладчике. Упакованный бинарник смотреть в IDA бессмысленно. Поэтому как бы напрашивается задача "сначала распаковать, если возможно".
> ключ, которым потом шифрует свои данные с помощью AES ECB
Т.е., у программки есть реализация AES, или она использует CryptoAPI. Во втором случае все просто, в первом случае есть функция шифрования, и тебе ее надо найти - ей на вход придет блок данных и контекст с преобразованным ключом. Также есть функция, которая инициализирует контекст, ее тоже стоит найти, ей на вход придет исходный ключ. Функции эти, во-первых, более-менее рядом, а во-вторых, характерно выглядят (алгоритм гораздо проще найти в бинарнике, если ты уже реализовывал его сам).
> Я даже не знаю, что такое сигнатуры
Многие алгоритмы используют различные константы (например, у CRC32 будет полином) и массивы констант (табличка в табличной реализации CRC32 или S-box в том же Rijndael), могут быть какие-то общие для архитектуры куски кода. Все это позволяет определить алгоритм, называется сигнатурами. Ссылки на константы позволяют выйти на использующие их функции, но вручную все проверять заебешься, поэтому есть всякие скрипты и плагины, которые знают дохуя сигнатур, и показывают все, что найдется в указанном бинарнике.
Спасибо за пояснения, да выбор не очень, но мне бы хотелось именно этого. Ксати, есть и 32битный экзешник, так что за 64бита можно не парится. Точно известно, что как минимум два человека написал утилиты, которые этот ключ автоматически вытаскивают без распаковки (делиться, конечно же, не хотят). Пикрилейтед нашел про мой случай.
Проверил peid+kanal и ничего не нашел. Даже не знаю, как подступиться.
Ох лол, начал смотреть видео из лекций, что ты сбросил, оказалось что это лекции и преподаватель из моего университета.
>Ох лол, начал смотреть видео из лекций, что ты сбросил, оказалось что это лекции и преподаватель из моего университета.
Укачало с первых 10 сек видео.
Кто додумался это снимать ТАК. Там Филтифранк с смартфоном в качестве оператора?
Problems?
-rwxr-xr-x 1 2301552 Feb 8 2016 MathPlayer.dll
-rwxr-xr-x 1 534128 Feb 8 2016 MathPlayerBHO.dll
Можете скачать с сайта https://www.dessci.com/en/dl/MathPlayerSetup.exe и реверсить вместе со мной
Суть такая. Я несколько дней разбирался с интерфейсом OLE/COM для них и пришел к выводу, что нужную мне функцию снаружи не вызвать. Т.е. через публичный интерфейс там можно только менять параметры.
Какая функция мне нужна? Преобразование MathML в VoiceXML.
Работы этих либ выглядит так:
1. Они загружаются, как плагины для IE.
2. Открываешь html страничку, где есть формулы в виде тегов MathML.
3. Плагины сначала рендерят формулы.
4. По формуле можно кликнуть правой кнопкой мыши и нажать "прочитать выражение".
5. Либа запустит голосовой движек в отдельном потоке и прочитает его.
Непонятные моменты: когда они производят конвертацию MathML в VoiceXML -- в момент рендеринга страницы или после щелчка "прочитать выражение"?
Я поставил брейкпоинт на момент создания контекстного меню, но до обработки щелчка по нему еще очень много процессорных инструкций. Деббагинг какой-то не очень удобный, т.к. постоянно сыпятся исключения и то IE сдохнет, то IDA войдет вечный цикл.
Прошу любых советов по теме.
Моя цель такая: преобразовать эти либы в консольные утилиты, где можно запихнуть файл (строку) с MathML и получить в ответ VoiceXML. Для начала нужно понять как оно вообще работает.
Сам я нюфак.
.data
N equ 2
minuend db 10
carry db 0
deduction db 7
.code
sub_sign proc
mov al, deduction
sub minuend, al
jnc no_carry
neg minuend
jmp end_p
no_carry: jns no_sign
neg minuend
jmp end_p
no_sign: jno no_overflow
mov carry, 0ffh
call calc_abs
no_overflow:
end_p: ret
sub_sign endp
чувак, она не для учебы. Она для работы. С группами кольцами и т.д. Это полный бесплатный, кросплатформенная херовен для объемных вычислений. Более грубый аналог Maple. один из кучи вариантов (на википедии есть)
а еще есть группа программ для численных вычислений , матлаб и прочыее прочее. всё оно для своих целей.
Но не для обучения. Грубо говоря навароченные калькуляторы.
В математике научиться чему то можно только многократно прорешивая руками. чем больше тем лучше. В мое время препод матрицы 5х5 в квадрат умел возводить без проблем. А так же на ходу считать для адекватных размерностей определеители и прочую херь.
Хочешь научиться - берешь задачи и решаешь решаешь решаешь. Заебные места с вычислениями конечно можно в любой из софтин (хоть тупо самому написать) реализовать, чтоб время не тратить. но надо идею и ход мыслей всегда понимать.
по сути, смотришь чуть выше. ишешь где вызывается адрес начала строки. вконце где нибудт пишешь свое, и подменяешь в месте вызова адрес.
для полных нулей, качай с трекеров exelab dvd, там видеокурс, или гугли Нарваха Рикардо. Введение в крэкинг с нуля
вообще, в шапке инфы предостаточно, достаточно вечерок посидеть, и такие банальные задачи проблемой не будут.
.data
N equ 2
minuend db 10
carry db 0
deduction db 7
.code
sub_sign proc
mov al, deduction
sub minuend, al
jnc no_carry
calc_complement:
neg minuend
jmp end_p
no_carry: jns no_sign
neg minuend
jmp end_p
no_sign: jno no_overflow
mov carry, 0ffh
call calc_abs
no_overflow:
calc_abs proc
mov si, cx
dec si
test byte ptr [bx][si], 80h
jz @@exit
call calc_complement
@@exit: ret
end_p: ret
calc_abs endp
.data
N equ 2
minuend db 10
carry db 0
deduction db 7
.code
sub_sign proc
mov al, deduction
sub minuend, al
jnc no_carry
calc_complement:
neg minuend
jmp end_p
no_carry: jns no_sign
neg minuend
jmp end_p
no_sign: jno no_overflow
mov carry, 0ffh
call calc_abs
no_overflow:
calc_abs proc
mov si, cx
dec si
test byte ptr [bx][si], 80h
jz @@exit
call calc_complement
@@exit: ret
end_p: ret
calc_abs endp
>Как поставить брейкпоинт на именно этот момент?
CreateFileW с условием, что имя файла соответствует "data.dat".
>Для ковыряющих винду и софт под неё, сайты с описанием структур со смещениями и разными версиями оных:
Блин, они все ущербны.
Вот вижу я структуру, которая по смещению 0х30 содержит PFILE_OBJECT, а дальше что? Все эти сайты никак не помогают это найти. Это просто статические страницы.
Хочу написать нормальный сайт с возможностью поиска по списку смещений и их содержимому. То есть вводишь типа список используемых смещений "0x18 0x10 0x8", или например "0х10 POBJECT_TYPE 0х30 PFILE", а он тебе "Это возможно структура struct_name_1, struct_name_2". Кто со мной?
>Дали им windbg, дали команду dt, что еще нужно?
Как с помощью dt найти
>>978286
>То есть вводишь типа список используемых смещений "0x18 0x10 0x8", или например "0х10 POBJECT_TYPE 0х30 PFILE", а он тебе "Это возможно структура struct_name_1, struct_name_2".
???
>???
То есть мне нужен поиск названия структуры по частично известному содержимому, а то и вовсе частично известному списку смещений.
> по частично известному содержимому, а то и вовсе частично известному списку смещений
А, все, понял проблему. Тут windbg не поможет, да.
Ага. Записать, написать скрипты обработки, поиска и удобный интерфейс.
>Только данные подготавливать муторно и долго
Это как раз автоматизируется скриптами. Никто руками забивать все 9000 структур не будет.
Ctrl+F2
Погугли, как юникод-строку в OllyDbg проверять. Вроде надо UNICODE добавить перед строкой.
Мой план действий такой:
1. Гуглю список winapi функций, которые читают реестр. Кстати, их много там?
2. Ищу все их упоминания в dll.
Может эта задача как-то проще решается?
>Кстати, их много там?
Штук 10.
>Ищу все их упоминания в dll.
А потом придётся выяснять, какие параметры у функций реестра, чтобы понять, какие ключи читаются. А параметры могут (и будут) формироваться динамически, и не факт, что удастся понять из кода без его запуска.
>Может эта задача как-то проще решается?
Что за библиотека то?
это из вашей области?
>Что за библиотека то?
Для чтения формул. См. скриншоты выше. Правда, это уже другая версия. С другим COM интерфейсом.
Запустил под Sandboxie ее хост-программу. Анализирую куда оно писало. Чтобы понять есть ли там защита вообще или нет. В интерфейсе есть функции для работы с лицензиями, но пока не ясно используются ли они в данной версии.
С реестром dll'ка работает.
Морально готовься потратить на это пару месяцев.
> узнать какие ключи реестра она может читать?
1) Пишется минимальный хост, берется ProcMon/RegMon от SysInternals. Так оно быстрее всего будет.
2) Можно хукнуть RegQueryValueExW/RegSetValueExW и подобные, анализировать адрес возврата, проверяя, из длл ли оно вызвано. Есть готовые утилиты для трейса API.
Вот решение похожей задачи, но без сайта и вообще без каких-либо данных, только код
https://redplait.blogspot.fr/2011/02/partial-structs-matcher.html
https://github.com/alexhude/FRIEND
Осталось сделать к нему конфиг для Intel (ну или другой процессор, если вам надо). Не хотите со мной?
Автор захерачил только для ARMv8.
Ну а я попробую сделать. Заодно прочитаю 4700 страниц мануала Intel. Всегда мечтал.
Вот если бы оно чтение/изменение отдельных битов в memory-mapped-регистрах документировало - была бы сказка, а референс по инструкциям нахуй не нужен. Посмотреть документацию по регистру в мануале я и сам могу.
Блин, а ведь даже PDB дампить нечем. pdbdump пишет The specified module could not be found и вообще древний как говно мамонта, Dia2Dump выдаёт нечитаемую хуиту, pdbxtract гуевый и вообще проёбывает типы, pdbripper врлде норм, но тоже гуевый, pdbdump.py требует какой-то модуль winnt, который я не нагуглил. Везде хреново.
Эта фигня так и не стала показывать мне хинты. Если кто хочет потестить, то можете скачать отсюда билд:
https://github.com/kamino/FRIEND/tree/multios-port/bin
Но ни он, ни моя собственная версия так и не заработали. Плагин подгружается, в консоль пишет, гуи-настройки работают. А хинтов как не было, так и нет.
Разбираться в ее кишках лень.
Осталось разобраться в 400+ кб сорцов и переписать половину, чтобы выдавала правильно. Делов на пару дней, ага, один из которых я буду учить плюсы, на которых ни строки не написал.
Ах да, оно ещё и не компилится, о чём и написано в репозитории. Так что перед переписыванием его ещё дописать нужно. И это явно не на пять минут, иначе кто-нибудь эту задачу уже выполнил бы.
1. Когда ищешь значения в Cheat Engine и находишь адрес вида 00000000, то это адрес RAM, который занимает это знание, правильно?
2. Ollydbg в основном окне показывает дизасемблированный код экзешника не запуская его? То есть по сути это то же, что и открыть экзешник в текстовом редакторе и вручную перевести все в ассемблерный код?
3. Если всё же OllyDbg запускает экзешник, то как этот экзешник может работать правильно, когда в при настоящем запуске в него передаются команды вроде --command и подтягиваются библиотеки?
4. Если экзешник запускается, то зачем говорят, что нужно его распаковать перед дизасмом, если он в RAM находится в распакованном виде? Он же сам распаковывается при запуске, разве нет?
5. Если в запакованной программе есть ключ, то можно ли его вытащить без предварительной распаковки? Можно ли автоматизировать вытаскивание этого ключа при каждом запуске этой запакованной программы (написать небольшую утилиту)?
6. Ключ будет хранится в регистрах вроде EIX при выполнении какой-то строчки кода, правильно? А если программа запакована?
Ты почитай какую-нибудь книжку для начинающих. Много вопросов отпадёт. "Техника отладки программ без исходных текстов", например.
1. Да. Если придираться к словам, то это виртуальный адрес, он может быть и не в RAM.
2. Ollydbg запускает его, но останавливает выполнение программы (в зависимости от настроек). Поэтому нет, это не одно и тоже.
3. Экзешник запускает операционная система, Ollydbg здесь выступает как Explorer, то есть создаёт процесс, но Ollydbg запускает его как отладчик (такие опции есть при создании процесса, также можно подключиться к уже запущенному процессу). Поэтому операционная система уведомляет отладчик о событиях, таких как загрузка/выгрузка dll, создание/удаление потока, исключения в программе и некоторые другие. Это не эмулятор, это приложение запускается и работает так же, как и любое другое. С некоторыми нюансами, про которые уже написал.
4. Программа запаковывается для защиты от статического анализа, т.е. без запуска приложения (в Ida, например). При динамическом, т.е. когда программа запускается в реальной среде, проще противостоять отладке, поэтому и пакуют. Не каждая программа упакована, соответственно, не каждую надо распаковывать. Не уверен на счёт правильности терминов, но общая идея, надеюсь, понятна.
5. Нет, нельзя. Упаковка - это, с некоторыми оговорками, архив. Ты не сможешь даже узнать, что в нём, пока не распакуешь. Да, можно, даже в отладчике можно скрипт написать, есть соответствующий плагин для Ollydbg.
6. Где угодно. Зависит от того, как программист написал это. Может в секции, может в коде, в регистрах он будет, если этот участок кода написан на ассемблере, иначе как решит компилятор. Но в регистр попасть он откуда-то должен.
1. Не совсем правильно. Это виртуальный адрес. Виртуальные адреса создают для процесса иллюзию, что кроме него и куска системы в памяти больше ничего нет.
2. OllyDbg - отладчик, отладчики запускают код. Но OllyDbg останавливается еще в системных библиотеках, до того, как код из exe получит управление. И нет, если попросишь, олька тебе покажет дизасм хоть от аллаха, это не обязательно будет код из exe.
3. Это и есть настоящий запуск. Библиотеки подтягиваются, аргументы командной строки можно указать. Процесс точно так же работает и управляется системой, как и при запуске без отладчика (есть некоторые исключения, их используют для детекта отладчика).
4. Упакованный exe - это тебе не архив. Он запускается, выделяет память (или не выделяет), распаковывает или расшифровывает сам себя, копирует распакованные данные поверх себя (или не копирует). Поэтому чтобы увидеть настоящий дизасм, а не код упаковщика и мусор в виде упакованного кода, нужно распаковать или дождаться, пока само распакуется. Очевидно, что если ты хочешь начать отладку с самого первого байта распакованной программы, просто подождать не получится. Алсо, многие протекторы не держат код в рам целиком в распакованном виде, а распаковывают по требованию и/или выполняют код на вм.
5. Да можно, но чтобы узнать как там все устроено, тебе нужно видеть настоящий код.
6. Регистров EIX в x86 нет, в регистрах подолгу ничего не хранится, они нужны для выполнения операций над данными. Ключ будет лежать в памяти. А может и не будет.
Не перестаю проигрывать с треда. Скрипт-кидди и ньюфаг, полезший пилить читы.
Ну епт. Всю ночь пост висел, а мы одновременно написали почти одно и то же.
>Скрипт-кидди и ньюфаг, полезший пилить читы.
И сажа-фаг, который пилит полезные советы и зачем-то при этом сагает тред.
В общем нашёл нормальный проект, допиленное говно мамонта. Требует msdia120.dll, но не особо об этом распространяется, можно просто скачать её из интернета и кинуть рядом, так как с разными студиями ставится разная версия этой либы, у меня она была msdia80.dll, от чего программа и помирала с невнятным The specified module could not be found.
https://redplait.blogspot.fr/2010/09/patched-pdbdump.html
Что-нибудь такое:
findhex "F4CD5F10" c:\windows\system32\
Гуглится только софт для поиску внутри 1 файла. Не хочу начинать скрипты писать.
grep (но он под винду обычно без -P собран, а -P желательно иметь, чтобы паттерн писать без боли), bgrep (но он не умеет в glob, просто обходит указанную директорию рекурсивно). Поэтому проще всего все же написать примерно 4 строки на питоне под себя. А так, я обычно просто фаром ищу, он умеет в хексы.
Total Commander?
https://www.youtube.com/playlist?list=PL59fvn5FIiQG0CrnALLgXzdpDTOk0hrz2
Как мне кажется, это наихудший способ обучения. Лучше всего не видео, а текстовая статья. Гугл выдал мне это https://exelab.ru/f/index.php?action=vthread&forum=5&topic=14847
Можно погуглить автора этих статей Рикардо Нарваха (Ricardo Narvaja).
Не согласен, насчёт видео. Мне НАМНОГО легче заходит такой способ, даже с корявым диктором.
Но если нравится текстовая версия, то вот тут есть ещё более удобная в одном файле https://yadi.sk/d/EGv70o9F3ChD9N
Добавьте в шапку на перекате, для нуфагов самое то.
http://liveoverflow.com/
https://www.youtube.com/channel/UClcE-kVhqyiHCcjYwcpfj9w
У него там в видео по асму есть ссылки на какие-то сайты, сам я нихуя не понил, но вроде как игровые задачки по RE
Блин, а оно не умеет в безымянный union, то есть структуру типа
typedef struct _QUAD {
union {
__int64 UseThisFieldToCopy;
double DoNotUseThisField;
};
} QUAD;
Превращает в
struct _QUAD {
// non-static data --------------------------------
/<thisrel this+0x0>/ /|0x8|/ __int64 UseThisFieldToCopy;
/<thisrel this+0x0>/ /|0x8|/ double DoNotUseThisField;
};
// <size 0x8>
Окей, у них одинаковое смещение, нужно детектить по нему и впихивать в юнион. Заодно перепишу для дампа в базу данных напрямую (SQLite, а оттуда уж перелью в мускул).
Ещё одна проблема- проёб именованных union, она их записывает как union <unnamed-tag> u и всё, концов её не найти. pdbripper выдаёт им номера, хотя, как по мне, лучше их встроить, так как все встреченные мною такие объединения были встроены.
Какие ещё заумности есть в структурах, на которых может споткнутся утилита?
>какое?
Выясняй методом половинного деления. И лучше на тестовой доске.
По вопросу- многозадачность работает на прерываниях. Системный таймер генерирует прерывание, которое прерывает работу любого пользовательского потока и запускает системный код, который и определяет, можно ли дальше работать программе или ей уже хватит.
Как переделать программу одной ОС в программу другой ОС?
Вот, допустим, у меня программа gcc для линукса. Хочу я её перенести на мою собственную ОС. По сути надо не сильно изменить. Ведь да? Надо только поменять сигнатуру исполняемого файла, если надо, и заменить системные вызовы на вызовы специальных процедур, которые будут эмулировать системные вызовы в Линуксе. Я всё учёл?
Всё учёл, кроме того, что люнЮфъсь — это не операционная система, а прежде всего религия.
А так-то да, зделой POSIX API, купи торговую марку, догадайся как попадать в новостные ленты (это вот не так легко, как кажется) и вперёд, у тебя есть своя ОС.
>Вот, допустим, у меня программа gcc для линукса.
У неё есть исходные коды, изменяй @ компиляй.
>Надо только поменять сигнатуру исполняемого файла, если надо
Сами форматы исполняемых файлов отличаются, так что не всё так просто.
Целевую программу и ОС не назовёшь, или нам дальше давать общие советы?
Неофит ИТТ. Поясните пж за следующую вещь. В hex-редакторе при анализе структуры PE файла (pic 1) вижу, что VA OEP = 10212, а ImageBase = 4194304, тогда абсолютный адрес точки входа = 4194304 + 10212 = 4204516 = 0x004027E4, и вроде как в дебаггере именно это число я и должен увидеть помеченным как entry point, но чому то в ollyDbg2.01 я вижу (pic 2) 0х00CE27E6. Я неправильно считаю точку входа? Неправильно трактую значение адресов в левом столбце в ollyDbg? Или еще что то делаю не так?
Алсо, я понимаю, что в olly я вижу образ процесса, а не дизассемблированный исполняемый файл, и загрузчик может выравнивать образ по размеру страницы оперативной памяти, но не настолько много ж блеть. Или настолько?
И да, исполняемый файл не упакован/не зашифрован, т.к. написан мной.
Во-первых, в ольке ты видишь EP = 0xce27e4, а не 0xce27e6. Во-вторых, если в образе есть релоки, и линкер поставил в IMAGE_OPTIONAL_HEADER.DllCharacteristics флаг IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE (в современной студии /DYNAMICBASE у линкера по умолчанию), то система считает себя вправе использовать ASLR для образа, т.е., выбирать рандомный базовый адрес.
На первом пике: DllCharacteristics лежат по 0x15e, это 0x8140 = ...DYNAMIC_BASE, ...NX_COMPAT, ...TERMINAL_SERVER_AWARE.
Понял, спасибо.
Я давно догадывался, что тут сидит норот с форума RSDN.
Нахожу поинтер и смещение (здесь равно нулю), которые всегда правильно указывают на значение, даже после перезапуска программы (на скрине правильное значение 325). Решаю глянуть в память, перехожу по актуальному адресу (01892950) и что я вижу? А нихуя я не вижу.
1. Почему в памяти по адресу 01892950 нет значения 325?
2. Если прочитать значения оффсета 00634630 в какой-то левой программе, то в нем не будет адресса 01892950. Почему так?
3. 01892950 это значение, которое должно лежать в (00634630 + BaseAddress)?
>1. Почему в памяти по адресу 01892950 нет значения 325?
325 в hex это 0x145. А теперь смотри, что у тебя в памяти.
Ну охуеть! И правда.
Теперь остаются остальные вопросы. Я написал маленькую тулзу, которая читает память.
Пик1. Читаю значение по финальному адресу 017F29E0, вытаскиваю правильное 545. Тут всё ок.
Пик2. Читаю значение по оффсету 00634630 в надежде получить свой финальный адрес (в нем же должен храниться указатель, разве нет?), и получаю совсем не то значение. Что я делаю не так?
Всё, сам понял. Там правилольное значение, просто в десятичной системе.
Ой, иди нахуй, я только вкатился и пытаюсь разобраться.
В прошлом анон на асме на голом железе что-то рисовал, а в этом только шапку, если вдруг чего оттуда не читал.
ОП
Или мб есть какой нибудь другой ресурс с кучей crackme и мануалом по их прохождению? Язык можно русский или английский.
Всё, отбой. Это просто я тупой.
cmp eax, 0
на
cmp eax, ebx
Как мне это сделать в ida pro? Что то там по дабл клику только eax можно заменить на другой регистр, но вот константу никак. Или в ida pro нет такого функционала, потому что при некоторых заменах придётся учитывать появившиеся сдвиги, ведь в машинном коде размер команды может измениться? Тогда мне, я так понимаю, остаётся только вручную править байты в hex редакторе. И тут вопрос, как мне понимать, что писать, чтобы получить нужные команды, регистры и тд? Типа,
cmp eax, 0 === 83 f8 00, ага. Эмпирическим путём я установил, что cmp транслируется в 0x83f, 8 означает eax (9 уже почему то ecx), а 00 - константный байт, но из каких соображений мне вбивать необходимую команду?
Кажись нашёл онлайн конвертер. Втыкать NOP на место лишних байт нормальный подход, или плохой тон? И еще, Это сейчас мне повезло, и
cmp eax, eax занимает 2 байта, а cmp eax, 0 - 3. В другой ситуации мне придётся сдвигать машинный код на n байт вправо от места вставки? Я так понимаю, это может отразиться негативно, ведь в программе есть ссылки на константные переменные. Или если константные переменные в секции .data, а хуячу я в .text, то можно не ссать и вообще полный вперёд?
По даблклику там переименование регистров, просто для удобства чтения дизасма. Сам код от этого не меняется. А чтобы пропатчить код есть Edit->Patch program->Assemble, но это пропатчит только базу. Чтобы сохранить изменения, там же есть Apply patches to input file.
>>983826
Втыкать нопы норм. Единственная проблема с патчами - релоки. Если ты правишь код, на который есть релоки, нужно убирать соответствующую запись из релоков, если втыкаешь абсолютый адрес - добавляешь запись. Если релоков нет, и >>983230 ASLR отключен, то просто патчишь.
Всего 5 минут в этом вашем RE и эти релоки уже начинают мне надоедать. Чем чревато просто уебать в pe optional header в dll characteristics аргумент, в который не входит dynamic relocation? Зойчем он вообще нужен? Или в особо больших программах, которые потребляют много ОЗУ это будет полезно?
Для .exe можешь спокойно поставить флаг relocation stripped в IMAGE_FILE_HEADER. Для .dll без релоков никак.
Что обозначает такая запись "App.exe"+016751A0 ? Это значит базовый адрес "App.exe" плюс смещение, или просто смещение от нуля?
У нормальных людей да, это базовый адрес модуля со смещением. Что там в читенжине наворотили, смотри у них в мануале.
Да и в читенджине должно быть основа плюс смещение... Вот только у меня ничего не выходит, теперь уже в 64битном приложении. Основа у него 1400000000 и даже без смещения это уже больше, чем нужно.
Версия Ida 6.8, по понятным причинам.
Насколько я знаю, нельзя. Продолжай подглядывать в дизасм. Алсо, можешь набыдлокодить плагин для простых случаев.
PIC тоже содержит релоки, но только для секции DATA и по одному перемещению на каждую переменную (а не на каждое обращение).
PIC медленнее для 32-битного кода - приходится жертвовать регистром, а их и так мало.
> Для прыщей есть книжка Линкерс-анд-лоадерс, а для спермы что есть?
Книжка линкерс энд лоадерс (там PE вниманием не обходят, да и базовые принципы везде одинаковые), книжка виндоуз интерналс, спека формата PE и многочисленные статьи.
Нужно найти код, который работает с этими данными. Например, поставить на эти данные хардварную точку останова при чтении/записи.
У меня программа запакована. Допустим, я часть этих данных экспериментально могу узнать просто меняя данные. Например, я так вытащил имя пользователя, длину имени и еще пару значений. Но что с остальными, если доступа к нормальному коду нет?
Можно менять данные и смотреть поведение программы. Можно собрать больше таких данных, и на основе статистики что-то разбирать. Все же можно ставить бряки и смотреть код - обращаться к ним будет уже распакованная программа, если это не протектор, конечно. Можно разбирать частные случаи (как твоя длина имени) - искать длины/смещения, указатели, числа с плавающей точкой, круглые/известные/магические числа. Магии, которая позволит однозначно определить всю структуру на основании одного куска данных нет.
>Магии, которая позволит однозначно определить всю структуру на основании одного куска данных нет.
А жаль, именно это мне и нужно было. Игрушка онлайновая, размер огромный, библиотек тысячи, клиент запакован... тут брейкпоинты не помогут.
Я не понимаю, как бряк будет работать с онлайновым приложением. Если связь прервется, то оно просто упадет, это же ММО.
Если оно падает при каждом разъединении, то это лол.
Впрочем, никто не говорил, что будет легко.
Можно просто в журнал писать при брейкпоинте, а не останавливаться; можно трейс запускать на некоторое время. Олька умеет вроде.
>оно падает при каждом разъединении
Ну не просто обваливается, а культурно выдает красивую ошибку с кнопочкой ОК, после нажатия на которую процесс завершается.
>>986860
Чую, что это уже высший пилотаж, мне такое не понять без детальных пояснений.
Но суть в том, что я уже написал все то, что мне нужно - программку, которая из памяти итой игры выдирает нужный кусок, парсит его на состав группы, с сайтов собирает рейтинг по именам и выдает эту инфу в красивый списочек. Проблема только в том, что игра периодически, если долго ничего не происходит, начинает записывать поверх нужных адресов какую-то левую инфу, так что иногда в списке появляется что-то вроде OIUYaiq3q222ItGI_yG. Ну и похуй. А, еще работает только с 64битным клиентом, надо дописать 32битные оффсеты, но мне лень.
ЗА ЩО во многих исходных кодах используется синтаксис AT&T? Он же неудобный. Или авторы специально нам дают код в AT&T, а сами используют intelовский синтаксис?
дайте ссылку на код работающего кернеля, который переводит в 64-битный режим.
Убавил ntoswrk.lib на 520кб, вышло 922кб кода. Брал самое лёгкое, дальше сложнее. Видимо, работа эта непосильна для одного человека за разумное время. Продолжаю.
Ну примерно так и ставить, да. Только условный, на оконной процедуре, по сообщению WM_KEYDOWN и с проверкой wParam на нужную кнопку.
Пидорас, я знаю хот кеи. Ты дал очень точный, но абсолютно бесполезный ответ, как в анекдоте про неудачливого парашютиста и программиста. Я имел в виду, как мне в интерфейсе ollydbg найти кнопку (например, по тексту на ней), и воткнуть БП на событие нажатия.
вот этот господин >>989029 дал информативный ответ на вопрос, за что ему спасибо. правда я уже делал это, просто забыл как, но всё равно спасибо.
View->Windows. А раз ты говорил про кнопку интерфейса, то брейкпоинт надо на WM_COMMAND ставить.
Когда я в подходящем настроении, я не могу пройти мимо тупых пидорасов в /pr/, не назвав их тупыми пидорасами. У меня хоть и был ДИАЛАП, когда я делал первые попытки писать кейгены, но я себе не мог позволить задать ньюфажный вопрос, не прошерстив архив статей на жестком диске на предмет информации, которая бы помогла мне самостоятельно найти ответ на свой вопрос. В каждом, сука, треде регулярно появляются аноны, которые путают форму ответа в зекаче с поисковой строкой.
Раньше трава была зеленее и на форумах ридонли за такое давали.
> на форумах ридонли за такое давали
Пиздишь. Мне в конце 90-х в IRC, не жалея своего времени, объясняли базовые, в общем-то, вещи, на разный лад, пока я не понял. И я не помню, чтобы на каком-нибудь васме давали ридонли за вопросы по теме. Или, может быть, ты сидел в каком-нибудь ололо-преватном какерском форуме среди илиты, которая возгордилась и не могла снизойти?
дайте ресурс, где написано как устроены команды x86_64, где там префиксы, коды команд и всё такое.
>Говоришь в гугле Intel Software Developers Manual
Сложна. Короче, я просто через хекс-эдитор проверю как компилит фасм в разных комбинациях операндов и возьму результат. Я делаю компилятор своего личного языка программирования.
> делаю компилятор своего личного языка программирования
Можешь поступить, как авторы PowerBasic - генери асм-код, используй fasm для сборки (алсо существует fasm as dll, гуглится). Ну или осиль LLVM, это гораздо более правильный подход.
>Kaitai Struct
Наткнулся на это когда гуглил. Совсем говно? Приведи какие есть доводы, не важно насколько они разумны.
Ох, нет, это ещё сложнее, я ничего не понял что в википедии о нём написано. Я лучше буду использовать примеры gcc, как он оптимизирует код, плюс попробую придумать своё.
Оно решает задачи, если примириться с предлагаемым подходом. Подход говно, некоторые форматы этим не описать, некоторые существующие описывать максимум неудобно. А автор ниразбирается в реверсе файловых форматов, на многие фичи его уговаривали месяцами. Про генератор парсеров на джаве просто молчу.
Можешь код на Си генерить, это тоже нормально, так даже сам Страуструп для крестов делал первое время.
DOS, x86
Посмотри здесь:
http://asmworld.ru/uchebnik/
как раз уроки на FASM. И, помнится мне, там есть пример того, что тебе нужно.
Я и так пишу компилятор на си, я офигею его на ассемблере писать, тем более с моими сотнями ифов и елсе.
Потом постораюсь перевести си-код на код своего языка и скомпилить.
Мне бы попроще пример. Там слишком уж комплексный. Потыкаю, коонечно
Изучал тут команду mov с помощью того что мне выдавал фасм. И тут я наткнулся на что-то странное. Если ввести mov [r12],r13, то вместо обычных трёх байтов мне выдаёт 4. Добавляется байт 24h. Какого фига? Я и насмом проверил, он тоже добавляет такой же байт. Это что? Какой-то костыль x86-64?
Давай ты сходишь в мануал интела и прочитаешь про форматы сначала? А потом мы уже поговорим про то, что ты не поймешь.
Нет, там много читать. Я лучше и дальше продолжу исследовать с помощью того что выдаёт фасм. Команда mov, похоже, одна из самых сложных.
Как в фасме подключить динамическую библиотеку? А статическую?
Почему у меня не получается дизассемблировать через objdump исполняемый файл, который я скомпилировал фасмом? Мне выводит только, что формат ELF-x86-64
Динамическую библиотеку через data import и макросы library и import. Гуглится, есть в мануале.
Статическую, считай, никак. Линкера в фасме нет, он сразу генерит исполняемый файл. Делай format elf или format ms coff и линкуй любым внешним линкером.
В моде, но я так понял, что вопрос в определении самого старшего бита. Это не сдвигами и не test/and решается.
mov EAX,%хранилище числа%
AND EAX,1 ;в результате логического умножение с 1 результат будет 1, если первый бит =1 и 0 если нет
JZ EIP+X ;проверяешь флаг Z и переходишь куда тебе надо.
>дизассемблировать через objdump
А разве objdump это дизассемблер?
АЛСО, у меня такой вопрос. При сравнении кода в объектниках WRK и кода, скомпилированного из Win2000, часто замечаю, что вместо вызова RtlInitUnicodeString с константным значением выполняется просто присваивание размеров и строки в буфер переменной типа UNICODE_STRING. Собственно вопрос- они это блядь, в ручную меняли, или это действие какого-то макроса? Я для себя запилил INIT_CONSTANT_UNICODE_STRING и заменяю RtlInitUnicodeString на этот макрос, когда это нужно для соответствия коду XP, но не уверен, что моё решение рассово правильное, так как не нашёл подходящего готового макроса или инлайновой функции, и при этом видел, как в некоторых файлах присваивание идёт напрямую (что имхо хуита какая-то).
> А разве objdump это дизассемблер?
Да, там есть простой дизасм. objdump -d
> RtlInitUnicodeString
https://msdn.microsoft.com/ru-ru/library/windows/hardware/ff563617(v=vs.85).aspx
>https://msdn.microsoft.com/ru-ru/library/windows/hardware/ff563617(v=vs.85).aspx
Почти, но не то. Сама строка не объявлена как константная, поэтому этот код не подходит.
Рассмотрим функцию MapperMarkKey из файла mapper.c. В сорцах Win2000 она выглядит как
buffer = 1;
RtlInitUnicodeString(&unicodeName, REGSTR_VAL_FIRMWAREMEMBER);
Всё ожидаемо и предсказуемо, компилируется в аналогичный код, только вместо константы какая-то переменная, ну это видимо особенность HexRay.
При реверсе же WRKшной функции из файла MAPPER.obj получается (после именования и расстановки типов) типа этого
unicodeName.Buffer = L"FirmwareIdentified";
buffer = 1;
unicodeName.MaximumLength = 38;
unicodeName.Length = 36;
Когда я в своём коде меняю RtlInitUnicodeString на свой макрос имена придумывать не умею, определённый как
#define INIT_CONSTANT_UNICODE_STRING(dest, source) \
dest.MaximumLength = sizeof(source);\
dest.Length = sizeof(source) - sizeof(WCHAR);\
dest.Buffer = (PWSTR)source;
То всё встаёт на свои места, код выходит аналогичным WRKшному с точностью до байта.
Вот и думаю, правильно ли я делаю, или нужно хреначить код напрямую, как это сделано в некоторых файлах WRK, десятки их. Или вообще пойти отрефакторить этот десяток файлов, ибо нехуй код повторяющийся держать.
> на свой макрос
И чего ты выделываешься тогда? Твой макрос абсолютно идентичен RTL_CONSTANT_STRING, за исключением того, что ты присваиваешь почленно, а макрос генерит литерал. И да, RTL_CONSTANT_STRING - это общепринятый способ, когда ты инициализируешь UNICODE_STRING строковым литералом.
каждый раз отнимаешь одну десятую и проверяешь квадрат не меньше числа и так далее
sqrt(0.01)
Что именно ты хочешь прочитать? Вот этого достаточно для начала про кресты (статья достаточно старая, но вполне актуальная, тем более если цель - MFC):
https://www.blackhat.com/presentations/bh-dc-07/Sabanal_Yason/Paper/bh-dc-07-Sabanal_Yason-WP.pdf
Большинство методов без проблем найдет флирт. Вот это поможет создать необходимые структуры:
https://ofekshilon.com/2010/11/07/d1reportallclasslayout-dumping-object-memory-layout/
Ничего готового не знаю. Найдешь - поделись. Конкретные вопросы будут - задавай.
ебать, я нихуя не понял
Я должен заполнить массив char своими адресами возврата, чтобы программа прыгнула на нужное мне место (пик1).
проблема в том, что эксплоит работает в виде пик2 (не обязательно именно так, но допустим программа с дырой работает через командные аргументы), и символ, нужный для верного адреса - \x00, что является терминальным символом.
Насколько я знаю, не существует способа передачи этого символа через аргументы.
Конечно же, я могу переписать код, чтобы передавать не массив char , а скажем, массив интов или чего-то подобного, но это будет уже не то. Интересно, как поступать в ситуации, в которой есть именно эта дыра, код программы - пик3, или, к примеру, нужный адрес имеет вид пик4.
Автор книги, Эриксон, для демонстрации использует никс, а там адреса с 0xffffffff идут
> Твой макрос абсолютно идентичен RTL_CONSTANT_STRING, за исключением того
Что мой макрос работает, а RTL_CONSTANT_STRING нет.
Блять, да почему он вдруг не работает-то? UNICODE_STRING dest = RTL_CONSTANT_STRING(L"Yoba"); Генерироваться будет код, идентичный твоему.
>>991068
Сам додумался.
use16
org 100h
mov cx,36 ; из какого числа вывести корень
; si - записывается ответ
start:
mov ax,0000
mov ax,si
mov bx,si
mul bx
add si,1
mov bx,0000
cmp ax,cx
jne start
sub si,1
mov ax,4C00h
int 21h
Очевидно, что RTL_CONSTANT_STRING работает только при инициализации переменной, иначе
error C2275: 'UNICODE_STRING' : illegal use of this type as an expression
Кстати, мой код даёт в одном месте, как и дизасм оригинального кода WRK, какой-то мусор:
db 66h, 66h
xchg ax, ax
Нафига он? Выравнивание?
Ты так говоришь, как будто твой макрос в такой ситуации "работает". Алсо:
SomeFunc(&(UNICODE_STRING) RTL_CONSTANT_STRING(L"Если компилятор не совсем протухший, он умеет в compound literals"));
> какой-то мусор
Возможно выравнивание, возможно кусок таблицы переходов. Покажи скриншот с кодом до этой херни.
>Ты так говоришь, как будто твой макрос в такой ситуации "работает".
Таки да, работает. И генерит код, аналогичный WRK.
>Если компилятор не совсем протухший
Собираю я всё тем же компилятором, которым собирался остальной код (cl.exe 14 версии), и более новый мне в моей задаче будет мешать выверять код. Обновлю потом, как всё декомпилирую.
>скриншот
Окей. Весь метод принтсринить было лень, думаю хватит. Нужное отметил стрелочкой.
ананасы дизасемблер ида Криса Касперски есть смысл читать, или он устарел безнадежно? если да то что по этой теме наиболее лучше будет?
Теперь есть beginners.re еще. Имеет смысл читать и то, и другое.
Ясно. Странно конечно, что компилятор не делает это выравнивание при использовании RTL_CONSTANT_STRING и делает при использовании моей фиготени, притом что остальной код одинаков и замена происходит достаточно далеко от этого кода. Впрочем ладно, спишу на причуды компилятора.
В общем сейчас переношу rules.c, там идёт работа с памятью. Файл из Win2000 гвоздями прибит к 32 битам, что очевидно. Как я понимаю, для портирования на x64 мне нужно поменять тип переменных, связанных с памятью, с ULONG на ULONG_PTR, посмотреть насчёт констант и прочее из https://www.viva64.com/ru/a/0042/ ? Вот например инициализация переменной, которая будет шестым параметром при вызове ZwMapViewOfSection. В Win2000 она выглядит так:
viewBase.LowPart = Address & ~(0xFFF);
viewBase.HighPart = 0;
Правильно ли я сделал, заменив определение переменной Address с ULONG на ULONG_PTR и заменив инициализацию на
#if defined(_AMD64_)
viewBase.QuadPart = Address & (ULONG_PTR)~(0xFFF);
#elif defined(_X86_)
viewBase.LowPart = Address & ~(0xFFF);
viewBase.HighPart = 0;
#else
ASSERT(FALSE); // Кому понадобилось компилить не под х86?
#endif
> делает при использовании моей фиготени
Это имеет смысл перед адресом, на который будет возвращаться jmp где-то в конце цикла. Гугли intel lsd например.
> Правильно ли я сделал
Каст к ULONG_PTR тебе не нужен в данном случае, Address уже ULONG_PTR, посмотри как Си integer promotions делает. Мало того, #ifdef тебе тоже не нужен, ты можешь просто писать в QuadPart в обоих случаях, не старайся быть умнее компилятора. Соответственно, код сводится к:
viewBase.QuadPart = Address & ~0xFFF;
>intel lsd
А это вообще законно?
>Каст к ULONG_PTR тебе не нужен в данном случае
Ага, верно. Я сначала добавил каст, а уж потом сменил тип переменной.
>ты можешь просто писать в QuadPart в обоих случаях, не старайся быть умнее компилятора
Тоже верно. Просто хотел оставить вариант кода для х86 как было, мол, так вернее. Окей, так даже проще, видимо, компиляторы со времён Win2000 стали немного умнее.
Сегодня ночью у меня болела голова, я находился в полудрёме и мне казалось что моё одеяло это кучка ассемблерных команд, а изгибы на одеяле обозначают ту или иную команду. И мне надо было по определённому их соотнести чтобы получить нужный кусок ассемблерного кода. Но я не хотел этого делать, я хотел спать. Потом голова перестала болеть и я заснул.
ОП
Окей, значит в случае чего буду бампать раз в месяц, чтобы потом с нуля не начинать.
Ты от соседей? Тот кун с протектором? Очевидно, что не зная адреса функции, нельзя ее вызвать. Адрес можно узнать, но асм для этого не нужен. Нужно найти kernel32 и пройтись по его экспортам: readfsdword/readgsqword, PEB, PEB_LDR_DATA, InLoadOrderModuleList, IMAGE_EXPORT_DIRECTORY - вот это все.
Алсо,
> GetProcedureAddress
вот такого в винде нет, есть GetProcAddress.
Да, в С-треде был я.
Спасибо за совет. А разве адрес LoadLibrary и GetProcAddress будет одним и тем же например между win7 и win10? Или мне нужно как то в процессе выполнения программы прошелестить у пользователя kernel32.dll?
Нет, адрес будет разным, и то, что я написал постом выше, как раз и позволяет пройтись по служебным переменным загрузчика исполняемых файлов, найти там kernel32, пройтись по его экспортам и узнать адреса, при этом не вызывая вообще никаких внешних функций. Каждый первый шелкод для винды рано или поздно к этому сводится.
Можно, но экономически невыгодно.
> повесить бряк на функцию и просто смотреть что там лежит?
Да. Смотреть стек ниже адреса возврата, искать указатели на структуру или на каждое из возвращаемых значений, смотреть на состояние FPU заодно. Можешь покидать сюда скрины - посмотрим и посоветуем.
Не весь кусок закринил, сорян. Там правда последнии строки не триггерят бряк. А может я вообще объебался с функцией, и нужного тут нет.
Я тебя помню по какому-то из предыдущих тредов. Во всяком случае, эту функцию я уже видел, но дело ничем не кончилось. Или ты другой анон?
С фрилансером я тут мотался год назад наверно. Тогда пытался хукать с помощью левых либр, но только ещё больше запутался. Потом обновилась винда и фрил перестал запускаться, сейчас поставил семерку на другой диск. Сейчас же просто хочу выцепить данные и как нибудь передать другой функцие. Но в прошлый раз была другая функция котороя внезапно не тригерится и не учавствует в обсчете, так что может попутал.
Деньги вперед.
Сижу на XP, обновление поставил, разницы не заметил.
Вот такой вопрос созрел. Если я например в CE напишу новый скрипт, который при вызове функции перекинет нас в другую функцию, которую я и буду писать, но которая отличается только тем, что будет иметь в начале вызов другой функции, которая должна будет передать данные внутри нашей новой функции, которые в естественном виде раньше приходили из другого места. Сработает?
Чет как всегда не подумал, но написал. Сработает, но на всех. А чтоб отличить от игрока, ужно найти структуру игрока, но эти структуры ебанутые, и не умею ходить по ветке вверх. Так например есть функция is_player, она передает значения 1 и в зависимости от того, есть ли в округе ещё нпс. Значений столько, сколько и нпс. 1 есть всегда и постоянно считывается, скорей всего игрок. Но как дальше от этого плясать? Вызывающая функция не вызывает эту функцию для проверки, и в условие просто не написать проверку по смещению.
Ответ нуба, не написавшего ни строчки на асм
Так же, как и положил.
Массивы в памяти- просто идущие подряд элементы, так что номер элемента, помноженный на его размер, даст адрес от начала массива. Так что LEA для вычисление эффективного адреса да MOV для загрузки.
Хотябы кто-то ответил. Спасибо, я что-то про это читал но ничего не понял да и fasm ошибку выдавал с командой lea наверное я не правильно ее использовал. А есть какие нибудь примеры?
Напиши на плюсах заполняющейся масив. Ну или на любом другом языке, да глянь. Как только найдешь переменные, которые меняются в диапазоне размерности массива, то по идее за ними, должны быть команды, отвечающие за то, что положется в этот массив. Ну и мониторь стэк.
мимо другой нуфаг
mov ecx,индекс
mov eax,[massiv+ecx*4]
Это для интов размером 4 байта. Леа нинужон в простых случаях.
Возьми старые езины типа 29A labs, читай чужие исходники. Заодно напоминаю, что в этой стране вирусы писать незаконно.
Спасибо, тоже думал над этим. Буду разбираться.
отлично спасибо
Я его дизассемблировал ИДАй, но ничегонепонятно. Как познать тонкости? Я просто наудачу потыкал, убрав пару первых джампов, вернее, сделав их безусловными в надежде, что это и будет перепрыгивание условия, но хуй вам. Что делать, ребята?
С такими вопросами меня игнорили или посылали читать манулы. Ну и по сути надо достаточно много понимать, чтоб что то сделать, так что вполне резонно, что никто не хочет все объяснять. Слишком долго и не известно, будешь ли усваивать
Используй дебаггер
Запатчить чужой инсталлятор очень сложно. Там обычно кастомный байткод, декомпиляторы не для всех есть. Лучше возьми песочницу, посмотри, что и куда пишет инсталлятор и сделай свой такой же. Чтобы узнать, что именно он проверяет, спользуй Filemon/Regmon/ProcMon от Руссиновича и компании.
> Почему собсна моя функция main начинает работать после стопицот всеразличных джампов
Потому что у твоей функции есть аргументы, их нужно получить и подготовить. А еще у рантайма есть состояние, его нужно инициализировать.
> Разве все предварительные подготовки не загрузчик делает?
Разным языкам нужна разная инициализация. Загрузчик не зависит от языка, поэтому для инициализации рантайма линкер втыкает соответствующий код в бинарник. Можешь сказать линкеру этого не делать (по крайней мере, в винде - в линуксах все слегка сложнее), и тогда сразу начнет работать твой код, но работать он будет с голой жопой.
>Загрузчик не зависит от языка, поэтому для инициализации рантайма линкер втыкает соответствующий код в бинарник
А никто не писал ОС, где это будет встроено?
>>997182
>Сижу короче туплю в дизассемблер.
Нужно использовать продвинутые инструменты. IDA умеет пропускать всю эту библиотечную мишуру и сразу показывать точку входа в приложение.
> А никто не писал ОС, где это будет встроено?
Что встроено? У нас одних компиляторов Си только под винду десяток. У всех разные рантаймы, их по-разному нужно инициализировать. Если встроить рантайм в ОС, получится msvcrt.dll, наполненный багами и несовместимостями, который даже обновить нельзя, никому ничего не сломав.
> Нужно использовать продвинутые инструменты.
Можно просто подумать и посмотреть листинг. main() не так уж глубоко от точки входа.
>Если встроить рантайм в ОС, получится msvcrt.dll, наполненный багами и несовместимостями, который даже обновить нельзя, никому ничего не сломав.
Под каждую версию свою либу. Зато можно будет вырезать однотипный код инициализации рантайма из каждого приложения.
Но конечно же это нужно закладывать на этапе разработки ОС, к существующим это уже не прикрутить.
> Под каждую версию свою либу.
А потом я изобрету язык YobaLang, мне в спортлото писать, чтобы мой рантайм встроили? А если я завтра YobaLang 2.0 сделаю, мне снова писать? А пока я изобретаю, чем мне пользоваться? Зачем вообще напрягаться ради экономии сраных 10 КБ (сишечка или кресты) на каждое приложение? Есть лишь одна реальная причина: статическая линковка = невозможность фиксить баги, но инициализации не так много, код вылизывается за пару версий до совершенства, и никаких сколько-нибудь критичных багов там уже нет.
Алсо,
> однотипный
Давай возьмем винду и Visual Studio. Будут разные варианты инициализации для: MBCS/Unicode, Debug/Release, Exe/Dll, Single-/Multithreaded, не считая всяких телеметрий, TLS и прочих __fltused. Итого, у нас уже 24 = 16 вариантов (я слегка преувеличиваю - на самом деле поменьше, это на закате DOS их реально дохуя было в каждом компиляторе). И это только одна студия, а их, сколько-нибудь пригодных для кодинга под современные винды, 9 или 10 версий, не считая сервиспаков. В общем, какая-то надуманная проблема, учитывая, что писать без CRT никто, в общем-то, не запрещает.
а, все, понял, тут же еще IP
Есть одна прога, которая подгружает dll написанную на сильно обвусифицированном Си. В нее передаются указатели на массивы, которая эта dll модифицирует по неведомому ебанму алгоритму. И я хуй знает как мне прицепиться отладчиком к этой dll, т.к. после выполнения функции она тут же выгружается.
Как мне ее отладить?
В OllyDbg в настройках есть Break on dll load. Когда это происходит, расставляешь бряки на EP, TLS initializers (если есть), эксортируемые функции.
>>997401
Не заморачивайся этой хуйней. С тех пор регистры потолстели в 4 раза, их стало намного больше, и вообще, то, что ты видишь в асме, не совсем отражает реально происходящие процессы внутри камня. На самом деле, машинный код для x86 - это лишь самый низкий уровень, который доступен для написания кода рандомкунами, но не самый низкий уровень, который существует в x86. Внутри проца сейчас по сути эмулятор набора инструкций x86, который транслирует его в микроинструкции для RISC-like ядра.
>А потом я изобрету язык YobaLang, мне в спортлото писать, чтобы мой рантайм встроили?
Очевидно, что это просто пакет ОС, от которого будут зависеть соответствующие программы. С версиями, ага.
Есть. Но пока не освоил.
1 - Не получается его заставить реагировать на загорузку dll
2 - Не видить функции, которые отлично видит IDA
Тамплиеры, помогите. Хочу вызвать LoadLibraryA по адресу в виртуальной памяти, при этом адрес я хочу получить сам, основываясь на данных таблицы импорта скомпилированного PE файла и ImageBase, который я получаю через FindImageBase(). Я скомпилировал приложение (код 1.png), вытащил из получившегося PE RVA функции LoadLibraryA. Как я понял, это RVA, в который будет записан VA той самой функции, но тем не менее получаемый адрес отличается от того, что я получаю по auto x = LoadLibraryA. ЧЯДНТ?
Это может быть как нибудь связано с relocation'ами? Типа, мне чтоб получить действительный RVA, нужно к значению из PE файла прибавить фактический ImageBase -
номинальный ImageBase?
Опиши еще раз подробно, что ты делаешь? Может, ты смотришь RVA в собранном файле, а потом его пересобираешь? И зачем тебе читать адрес LoadLibrary из собственных импортов в рантайме, когда компилятор может (и делает) то же самое, когда ты делаешь auto x = LoadLibraryA? И хватит в оба треда срать.
Я пытаюсь вручную получить VA LoadLibraryA, основываясь на ImageBase и RVA в таблице импорта PE файла. Это лишь подготовительная мера для кое чего другого.
Да, смотрю RVA в скомпилированном файле, да, потом подставляю константу и пересобираю. НО! Я смотрел в пересобранный .exe, RVA LoadLibraryA таким и остаётся, я проверяю при каждом изменении кода.
Зачем срать через ноздрю, а не использовать LoadLibraryA? Потому что я компилирую код, чтобы потом его выдернуть и вставить в оверлей секции произвольного .exe файла, и там я уже я не могу расчитывать на что либо, кроме данных самого PE-файла. На ассемблере писать не хочу, я на нём только читаю хотя это громко сказано, но не пишу.
В другие треды сру, тому шо не знаю, кто где ответит. Вдруг кто нибудь сидит в С-треде, но не в asm треде ну и наоборот.
Окей, а почему 0xb93c8 (RVA IMAGE_IMPORT_BY_NAME, т.е., строчки "LoadLibrraryA" с хинтом), а не 0xb4c00 (RVA ячейки IAT, куда попадет адрес LoadLibraryA при загрузке)? Это если я правильно понимаю ту мешанину, которую выдает дампер на скриншоте. Хексы и то легче читать.
А, я тебя вспомнил. Расскажи, что за протектор, почему это называется протектор, что ты собираешься протектить, и почему ты собираешься протектить именно так? Мы с тобой общались уже про LoadLibrary в одном их тредов.
Потому что address - это raw offset в самом файле, а value - это то, что там находится.
>>998169
Протектор - курсовая работа. Протектор, потому что предполагается, что это говно будет защищать проприетарное ПО от какиров хотя целью было вообще в RE вкатиться, просто тема курсовой позволила совместить приятное с полезным . Учитывая, что дедлайн уже через пару недель, хуй я успею написать DENUVO 2, хотя "научрук" сказал, что тема годная и можно сейчас на пол карасика сделать и сказать типа на дипломе доделаю бля буду. Я застрял на создании инжектора. Мне нужно как то загрузить либу протектора через LoadLibrary, потом вызвать пару функций из либы. Однако, для этого мне нужно получить VA LoadLibraryA и GetProcAddress не говоря уже о том, что мне нужно запихать в импорт защищаемого PE файла LoadLibraryA, если её там нет по умолчанию. Как это делать -
не ебу представляю, но мне страшно от
объема необходимых фиксов и даже не думаю на данный момент., с чем я сейчас и сражаюсь.
> Потому что address - это raw offset
Охуенная программа. Тогда смотри. FirstThunk - это массив, лежащий в IAT и состоящий из 32- или 64-битных слов. Последний элемент массива - 0. Пока файл не загружен (или не связан), там лежат ординалы (если импорт по ординалу) или RVA структур IMAGE_IMPORT_BY_NAME (если по имени). Когда файл загружается, туда кладутся уже адреса функций. Ты сейчас пытаешься читать значение не оттуда, а из IMAGE_IMPORT_BY_NAME, и в твою переменную z (если смотреть вычесть непонятно зачем прибавленный image_base) попадают кусок хинта и имени: 1879507877 = 0x700703A5 - 12255232 = 6F4C03A5 = 0x03a5 хинт и 4c 6f - байты 'L' 'o'.
Решение: взять любой нормальный вьювер с функций FLC (file location calculator). Преобразовать файловый офсет 0xb4c00 (адрес элемента массива FirstThunk, ссылающегося на нужный IMAGE_IMPORT_BY_NAME) в RVA. Если верить скриншоту, то получится 0xb9000. Использовать этот RVA. Не прибавлять базу к z, потому что загрузчик пишет в IAT уже готовые VA.
Спасибо, понял. Да, В RVA под FirstThunk и всех последующих словах лежит уже VA. Не подскажешь случайно софт, который позволяет добавлять импортируемые функции в PE-файл?
Нашёл софт.
Учиться патчить не на туториалах, а на настоящей программе. Я только что сидел с этим скриптом, перепробовал все варианты ответов, но отсосал. Все вроде идет нормально, но потом программа крашится. В треде могут с таким помочь или это фантастика и можно забыть?
>>977938
>в Германии
Закончил уже.
Распаковать - хз. Там есть темка с платными запросами разве что. А вот советом должны помочь.
Ну тогда подсказывай, где спросить о процедуре распаковки конкретно моего случая?
А если дамп с программы снять, что внутри? Протектор содержит виртуальную машину?
Как мне кажется, ты взялся не за то. Нужно начинать с чего-нибудь более простого.
Я прошел гайды Навахо, могу снимать защиту с простых крэкми. Что учить дальше, чтобы поднять уровень, раз подобные прикладные задачи я еще не в состоянии решить?
Я серьезно вообще-то. Во время написания своего аналога чего бы то ни было приходится вникать в детали. И по мере вникания появляется куча специальных знаний, которые иначе пришлось бы год собирать по разным блогам.
Экзешник бота запакован хз чем заголовок на первой пикче. После останова на EOP по мнению x64dbg и пары джампов появляется конструкция со второго пика. Если выполнить шаг не заходя в вызов F8 вываливается ворнинг, но если провалиться внутрь по F7 и затем продолжить выполнение, то никаких проблем. Это проверка присутствия отладчика, как ее можно обойти?
>>1000512
И снова в догонку, с аппаратными точками останова такого не происходит в чем их разница?.
> запакован хз чем
https://pid.gamecopyworld.com/
> Это проверка присутствия отладчика, как ее можно обойти?
Ну, например, в качестве самого идиотского варианта оно проверяет наличие байта 0xcc (int3) по 0x3dc19f6, или, например, просто считает чексумму всей кодовой секции.
>>1000514
> в чем их разница?
Аппаратные точки останова пишутся в отладочные регистры (dr0-dr3, dr7), изменения кода не происходит. Single step можно делать установкой TF в Eflags, изменения кода не происходит. Для Step over приходится втыкать брейкпоинт. Если он программный, то по адресу, следующему после интересующей инструкции, втыкается int3, он вызывает exception при выполнении, отладчик его ловит и восстанавливает код, который там был изначально.
И еще, расскажите о функциях или ходя бы скажите что и где можно прочитать, используемых в активации ПО по ключу. Имею в виду, мне нужна функция, которая для некоторого множества чисел выдавала бы один и тот же результат. Типа, f(x) = x2 даёт одинаковые значения для любых чисел a,b: a =-b. По сути, это сюръективная функция, но я не могу найти примера именно для моих нужд.
Добавляй свою секцию, перенаправляй все необходимые IMAGE_NT_HEADERS.OptionalHeader.DataDirectory в свою секцию (экспорты не трогай или копируй, ресурсы... ну можно сделать свои только с иконкой и манифестом, про релоки не забудь). Директорию импортов генери свою, там будет только импорт твоей длл. Когда расшифруешь, обработаешь оригинальные импорты вручную, релоки применишь, DataDirectory восстановишь.
>Экзешник бота запакован хз чем
VMProtect v.3.00 - 3.0x (по мнению Exeinfo).
>После останова на EOP
Программа запакована, хотя многие проверки от VMProtect убраны (обнаружение отладчика, запрет работы в виртуальной машине). Поэтому есть возможность поизучать работу программы. Чтобы получить более-менее хороший дамп, надо поставить брейкпойнт на какую-нибудь системную функцию, например, GetSystemTimeAsFileTime. Эта функция, как правило, вызывается одной из первых при запуске приложения. И после этого можно сливать дамп или ставить брейкпойнты там, где нужно.
Подозреваю, что функция проверки ключа защищена VMProtect'ом. Не смог запустить программу на виртуальной машине, поэтому не знаю, как происходит проверка ключа. Если программа стучится на сервер, можно подделать ответ. Если где-то в программе, придётся искать место проверки. Программа статически слинкована с Qt, а там виртуальный вызов на виртуальном вызове вызывает виртуальную функцию. Хотя, если знать, как работает Qt, возможно, трудностей и не будет.
>Если программа стучится на сервер, можно подделать ответ.
Нашёл через гугл тред с обсуждением в vg. Так и есть, стучится на сервер. Делается мегапростой прокси и отвечает, сколько осталось боёв. Запрос идёт через HTTP, значит, не придётся заморачиваться с сертификатами, OpenSSL и прочим MITM'ом.
А как работать с секциями PE файла в ран тайме вообще? Мне на ум приходит только одно - я могу определить ImageBase в ран тайме, он указывает на начало IMAGE_DOS_HEADER, и, я так понимаю. там последовательно загружены и IMAGE_NT_HEADER, там же Optional header, значит можно и в таблицу секции заглянуть, и найти RVA начала шифрованной секции. НО! Читал я о таком забавном механизме, как ASLR, который может распидорасить образ по памяти в случайном порядке, и инфа из таблицы секций мне уже ничем не поможет, или я заблуждаюсь?
>>1000770
Там помимо проверки ключей есть криптованный запрос с ключом, в ответ на который прилетает криптованный ответ с какими-то данными, без которых бот отказывается работать.
Я похоже переоценил свои силенки и дальше брейкпоинта на чтение dword-а из памяти, где лежат константы, для формирования конструкции этого запроса, уйти не смог.
Кстати, этот VMProtect стоит приличных денег, неужели автор навесил такую махину, на десятирублевого бота?
>Кстати, этот VMProtect стоит приличных денег, неужели автор навесил такую махину, на десятирублевого бота?
Уверен, что он его спиздил.
Ещё вариант придумал. Что, если вводить один и тот же ключ и с помощью прокси отправлять один и тот же ответ. Или это не один способ подсчёта в программе? Она ещё как-то общается с сервером разработчика? Или только при запуске? Ключ, как понимаю, к оборудованию не привязывается, раз в том треде был разговор о передаче ключа. Значит, вполне возможно лениво обойти проверку ключа, даже не разбираясь, что там разработчик напридумывал. Будет желание - посмотрю. И ещё один момент - эти строки предполагается перепечатывать с экрана?
> Читал я о таком забавном механизме, как ASLR
ASLR выбирает рандомную ImageBase. А образ так называется как раз потому, что более-менее четко описывает содержимое оперативной памяти после загрузки (по большей части). По большей части внутри PE все, что касается адресов - RVA, которые как раз от базы и расчитываются. Для всего остального существуют поправки (relocations).
Так что да, парсишь заголовки, добираешься до нужных структур. Спецификация PE лежит на сайте майкрософта, гуглится; в интернетах куча исходников; в winnt.h есть несколько макросов, которые могут оказаться удобными (особенно в тех местах, где дело касается секций и выравнивания).
>>1000923
> Уверен, что он его спиздил.
Ну загрузите на вирустотал. У автора вмпротекта бизнес по-русски, поэтому спизженные/сдохшие лицензии детектятся как малварь.
>>1000948
Правильно понимаешь. VirtualProtect проблему решит, не забудь потом восстановить обратно, как было. Алсо, PAGE_EXECUTE_READWRITE не любят антивирусы. Если есть возможность, делай просто RW, а потом X вернешь.
TCP->WebSocket->Data
Вот для Data мне и надо написать. Как сделать для TCP/UDP - знаю, а как для такого случая - даже найти пример не могу.
> Не получается его заставить реагировать на загорузку dll
Очень странно. Потому что настройка на самом видном месте мало ли, еще актуально, скриншот валяется.
Можешь считать, что таблица релокаций - это список патчей. Что положишь, то и пропатчит, никаких проверок (ну, кроме границ). В нормальных приложениях релоки касаются только кода и данных, больше VA нигде нет просто.
Но что именно туда закладывает компилятор? И что именно использует VA-адресацию в коде? Всякие вызовы функций, условные и безусловные переходы? А в секции данных - VA области памяти, где хранится переменная, которая по тем или иным причинам не попала в стек? То есть, если у меня стопицот джампов и вызовов функции, то в таблице релокаций будет стопицот записей?
> Но что именно туда закладывает компилятор?
Ну епт, возьми IDA, там в Edit->Plugins есть Jump to next fixup. Очевидно, что релокации нужны для обращений по абсолютному адресу, всегда, когда в инструкции или в данных явно или неявно встречается VA. Данные:
mov eax, offset foo ; foo - VA, фиксап.
mov dword ptr[foo],edx ; Тоже.
Функции:
push offset compare_func ; VA функции compare_func - фиксап.
push size
push num
push dword ptr[ebp-8]
call qsort ; Относительный call, нет фиксапа.
Не обязательно в асме. В секции данных, например:
static int foo; // Чтение-запись - фиксап.
static int ∗bar = &foo; // Взятие адреса - конечно же фиксап, обращения к bar - тоже.
static int some_array[100];
static int ∗element_ptr = somearray + 3; // И тут тоже. Лишь бы был VA, а указывает он на начало объекта или в середину - похуй.
Вызовы и джампы по умолчанию EIP-relative, поэтому обходятся без поправок. Но, например, switch может сгенерировать таблицу переходов:
mov eax,[ecx∗4+table] ; Обращаемся к table по VA - фиксап.
jmp eax
table dd case_1, case_2, case_3 ; Три поправки подряд.
> И еще, почему я не могу просто взять и зашифровать секцию .text и .data в исполняемом файле, а потом в ран тайме расшифровать и передать управление в .text?
Можешь. Упаковщики так и делают. >>1000733 Возможен любой вариант. Тебе нужно лишь, чтобы после окончания твоих выкрутас образ в памяти выглядел так, как он ожидает. Как именно ты будешь этого достигать - похуй. И вообще, почитал бы ты по упаковщикам/протекторам хотя бы список терминов - вопросов гораздо меньше было бы.
> придется некоторые задачи загрузчика брать на себя, но я не знаю какие именно
Пройтись по импортам, применить фиксапы. Писал же уже выше.
> или придется еще шаманить над вызовом импортируемых функций
На VA элемента IAT в теле инструкции call будет очевидный фиксап.
> Но что именно туда закладывает компилятор?
Ну епт, возьми IDA, там в Edit->Plugins есть Jump to next fixup. Очевидно, что релокации нужны для обращений по абсолютному адресу, всегда, когда в инструкции или в данных явно или неявно встречается VA. Данные:
mov eax, offset foo ; foo - VA, фиксап.
mov dword ptr[foo],edx ; Тоже.
Функции:
push offset compare_func ; VA функции compare_func - фиксап.
push size
push num
push dword ptr[ebp-8]
call qsort ; Относительный call, нет фиксапа.
Не обязательно в асме. В секции данных, например:
static int foo; // Чтение-запись - фиксап.
static int ∗bar = &foo; // Взятие адреса - конечно же фиксап, обращения к bar - тоже.
static int some_array[100];
static int ∗element_ptr = somearray + 3; // И тут тоже. Лишь бы был VA, а указывает он на начало объекта или в середину - похуй.
Вызовы и джампы по умолчанию EIP-relative, поэтому обходятся без поправок. Но, например, switch может сгенерировать таблицу переходов:
mov eax,[ecx∗4+table] ; Обращаемся к table по VA - фиксап.
jmp eax
table dd case_1, case_2, case_3 ; Три поправки подряд.
> И еще, почему я не могу просто взять и зашифровать секцию .text и .data в исполняемом файле, а потом в ран тайме расшифровать и передать управление в .text?
Можешь. Упаковщики так и делают. >>1000733 Возможен любой вариант. Тебе нужно лишь, чтобы после окончания твоих выкрутас образ в памяти выглядел так, как он ожидает. Как именно ты будешь этого достигать - похуй. И вообще, почитал бы ты по упаковщикам/протекторам хотя бы список терминов - вопросов гораздо меньше было бы.
> придется некоторые задачи загрузчика брать на себя, но я не знаю какие именно
Пройтись по импортам, применить фиксапы. Писал же уже выше.
> или придется еще шаманить над вызовом импортируемых функций
На VA элемента IAT в теле инструкции call будет очевидный фиксап.
И вообще, забей на релоки. У тебя же exe. Удаляй релоки, ставь файлу relocations stripped, убирай флаг dynamic base впизду, и ASLR сосет хуй, а у тебя гораздо меньше проблем. Потом добавишь корректную обработку, если желание будет.
То есть, если удалить релоки и изменить флаги, то вообще не нужно будет ничего перемещать?
И еще, флаги менять в поле Characteristics FileHeader или в поле DlCharacteristics у OptionalFileHeader?
Ну загугли где какой флаг лежит. Их всего два. И да, если у образа стоит relocations stripped, то загрузчик не будет его перемещать по неродной базе, а значит даже смотреть на релоки не будет.
Нашёл костыльное решение.
1. В функции plugin_register регистрируется диссектор с помощью функции register_dissector.
2. В функции plugin_reg_handoff с помощью функции heur_dissector_add регистрируется функция, которая будет вызываться всякий раз, когда у предыдущего диссектора останутся данные (если это им предусмотрено). Первый параметр - не название диссектора, а "heuristic sub-dissector list". Для, к примеру, WebSocket это ws.
3. Как обычно, с помощью dissector_add_uint добавляется порт или что-то другое, что будет связано с диссектором.
Только проблема в том, что параметр proto_tree всегда валидный и узнать, что пакет анализируется первый раз можно через pinfo->fd->flags.visited.
Прерывание - это процесс, начинающийся, когда процессор дергают за ногу (или он сам себя дергает), а заканчивающийся восстановлением и возобновлением выполнявшейся задачи после обработки прерывания. Вектор прерывания - это адрес обработчика прерывания. Процессор читает вектор из таблицы векторов, таблица векторов лежит в каком-то известном месте. Всего прерываний может быть сколько угодно, если считать аппаратные и считать мультиплексоры прерываний. Векторов в таблице векторов обычно фиксированное количество, 256 в x86.
int 21h - это инструкция, вызывающая обработчик прерывания. Она идет по 0000:21*4, читает оттуда вектор (сегмент/оффсет), и вызывает обработчик (ну и там текущий cs:ip сохраняет и т.п.).
Кажется понял. Спасибо, анончик.
Например, есть библиотека so (elf-файл), можно ли каким-то образом добавить в нее свои строки кода, а то и новую функцию из другой библиотеки? Ветки перенести не проблема, а вот как со смещением быть? Android-реверсер итт.
Я с реверсом ядра застопорился, а кроме меня тут было 2,5 калеки, которые видимо отвалились.
Впрочем, скоро запилю перекат, до бамплимита тут джва поста.
ОП
Я тут но я только в голове отыгрываю, что я реверсер.
компилируй с -Ofast -ffast-math
Вы видите копию треда, сохраненную 19 июля 2017 года.
Скачать тред: только с превью, с превью и прикрепленными файлами.
Второй вариант может долго скачиваться. Файлы будут только в живых или недавно утонувших тредах. Подробнее
Если вам полезен архив М.Двача, пожертвуйте на оплату сервера.