Сейчас на форуме: (+5 невидимых) |
![]() |
eXeL@B —› Дневники и блоги —› ARCHANGEL's blog |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 . >> |
Посл.ответ | Сообщение |
|
Создано: 13 июля 2012 18:28 · Личное сообщение · #1 Добрый день, уважаемые форумчане. Ни для кого не секрет, что решил я с недавних пор пойти учиться программированию. Поэтому стали меня интересовать практические аспекты кодинга, иногда весьма далёкие от вопросов реверсинга. Поэтому чтоб не засорять форум, решил создать этот блог. Стоит сказать, что вопросы, которые планируется тут разбирать, не такие уж и бесполезные. Они часто могут возникать при написании тех же кейгенов или тулз для реверсинга, так что, надеюсь, каждый сможет найти здесь что-нибудь интересное. Как некоторые уже догадались, вопросы Common Controls, простым числам, и сегодняшний вопрос по OpenGL как раз из серии учебных. Теперь о самом вопросе. На днях выполнял задание про отрисовку простых фигур: треугольника, квадрата и т.д. Решено было выполнять рисование средствами OpenGL. Литературы по этому делу много, поэтому я разобрался, что и как. Т.е. в литературе советовали использовать бибилиотеку glut.dll, которая сама не относится к стандартному OpenGL, но её применение, как я понял, упрощает использование OpenGL в своих проектах. Далее я решил создать базовый класс для отрисовки треугольника, а от него создать производные классы для отрисовки других геометрических фигур. Но на практике получилась вот такая сложность. Дело в том, что glut, по сути, инкапсулирует функции Windows и OpenGL, что упрощает операции с ними. Но от базовых вещей же никуда не деться. Т.е. если процедура обработки оконных сообщений (CALLBACK WindowProc) должна присутствовать, то в классе она должна быть статической. Так и здесь: Code:
Но вот проблема - мне нужно передать внутрь Draw несколько параметров. Являясь статическим методом, Draw не имеет указателя this, а значит не видит обычных полей. Статические поля он видит, но при попытке в конструкторе присвоить значения этим полям появляется ошибка линковки. Понятное дело, что по-хорошему, можно обойтись совсем без классов, но это превратит код в кашу - большое количество глобальных переменных, почти одинаковые функции со схожим функционалом принесут путаницу раньше, чем будут отрисованы несколько фигур. Кто посоветует, как быть в такой ситуации и как решить проблему со статическими функциями-членами? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 26 декабря 2012 12:05 · Поправил: reversecode · Личное сообщение · #2 ну сисер можно попатчить что бы он считал что он постоянно под вмварей а не детектил ее и нормально работал ARCHANGEL пишет: Я, правда, не знаю, почему вы не хотите, чтоб Свин узнал инфу про старфорс. пусть узнает)) ему никто не мешает, ихняя команда реверсеров заявила что за два месяца они сломают старфос. приэтом если посчитать сколько они с ним уже маются, прошло уже почти пол года а воз и ныне там (с) ![]() |
|
Создано: 26 декабря 2012 12:21 · Личное сообщение · #3 |
|
Создано: 26 декабря 2012 12:31 · Личное сообщение · #4 следи за мыслью, в сисере есть проверки реальная или виртуальная машина, если вирутальная то какая, и по этим детектам потом сисер правильно настраивает вывод через видеобуфер, когда ты в вмваре отключаешь детект версии, то в сисере нужно пропатчить проверку системы, что бы сисер считал что он уже задетектил вмварю, и выводить видеобуфер как он выводит при детекте вмвари ![]() |
|
Создано: 26 декабря 2012 13:01 · Личное сообщение · #5 |
|
Создано: 29 декабря 2012 11:32 · Личное сообщение · #6 Продолжаю дальнейшее повествование по вытаскиванию рук из задницы и попытке реверсинга старфорса. В общем, не считаю нескольких нелепых попыток заставить сисер работать на варе, про которые даже и рассказать нечего, решил я пока оставить сисер и взять IDA Pro. Как отладчик я его раньше почти не использовал (ну так, пару раз на поиграться). Прочитал статью вот ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 30 декабря 2012 23:46 · Личное сообщение · #7 |
|
Создано: 02 января 2013 12:37 · Поправил: ARCHANGEL · Личное сообщение · #8 Странно, попытался сейчас установить Debugging tools for windows - падает с какой-то ошибкой типа 7100.0.0 не является допустимым для короткого имени или как-то так. Уже установленный WinDbg перестал запускаться, новый инсталлер с офф.сайта тоже с ошибкой падает. У кого-то, случайно, не завалялся работающий инсталлер, или ссылка на него? Нужен такой, после которого не только виндбг запустится, но и установятся все переменные окружения, т.е. Да, я тоже гуглил [img]http://saveimg.ru/show-image.php?id=c41c68fe9a8fb305e5a8e41413e6185a[/img] reversecode То же самое, всё, как на картинке выше, не работает. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 02 января 2013 16:26 · Личное сообщение · #9 |
|
Создано: 02 января 2013 16:57 · Поправил: ARCHANGEL · Личное сообщение · #10 Вот появилась возможность разобраться с дизассемблерным движком Олли, скачать который можно с официального сайта по Сборка статической библиотеки. 1. Создаём в студии пустой проект. Это у нас Файл -> Создать -> Проект. В установленных шаблонах разворачиваем узел для Visual C++, в списке справа выбираем Консольное приложение Win32. Даём проекту имя, например, LibOlly. Создаём папку для решения (ну, мне нравится, когда для отдельного решения отдельная папка). Жмём Ок. 2. Потом один раз жмём Далее, а там больше и жать-то нечего. Потом нас спросят, какой тип приложения нас интересует. Мы хотим создать Статическую библиотеку, этот вариант и отмечаем. Снимаем галку с предварительно скомпилированного заголовка и жмём готово. 3. Теперь возвращаемся к файлам нашего архива. Нас пока интересуют 4 файла, которые нужно скопировать в папку проекта. Подчеркну, что именно проекта, а не всего решения. Это файлы: disasm.h asmserv.c assembl.c disasm.c 4. Теперь файлы с расширением .с переименовываем в файлы с расширением .срр. Это нам понадобится для того, чтоб студия компилила содержимое этих файлов с декорированием имён в стиле с++. 5. Давим alt+Shift+A (добавить существующий файл к проекту) и добавляем наши файлы в заголовочные файлы (disasm.h), а остальные три - в файлы исходного кода. 6. В самом проекте сборку переключаем с Debug на Release. Далее идём в свойства проекта - Alt+F7, последовательно разворачиваем узлы Свойства конфигурации -> С/С++ -> Создание кода, меняем опцию Библиотека времени выполнения на Многопоточная /MT. Т.к. нам не нужна привязка к рантайму С++, и не нужна отладочная версия, то это - самый нормальный вариант. Учтите, что ели вы планируете использовать эту библиотеку в проектах, настройки которых будут отличаться от текущих настроек проекта нашей библиотеки, то её придётся пересобрать с другими настройками, т.е., возможно, вам понадобится несколько таких .lib файлов. 7. Теперь в трёх наших (уже) .cpp файлах имеется непонятный инклуд: #include <dir.h>. Его надо просто закомментировать, т.к. такого файла у нас нет. Или удалить вовсе эту строчку. Давайте сделаем одно из двух на ваше усмотрение. 8. Далее есть интересная директива препроцессора: Code:
Она располагается в disasm.h. Её тоже нужно удалить или закомментить. 9. Последний штрих нужно провести для работоспособности вот этой строки: Code:
С помощью гугла можем найти, что Code:
Естественно, реализацию нужно добавить либо перед вызовом, либо предварительно объявить. 9. И вот, с кучей варнингов, но мы получили заветный .lib. Сборка тестового приложения У нас с вами сейчас уже есть готовый .lib файл. Самое время прикрутить его к какому-нибудь приложению и поюзать. Создаем тестовый консольный проект, в котором мы попытаемся сделать рабочим пример кода из main.c. Этот файл, если вы не заметили, также идёт в скачанном нами с официального сайта архиве. Что ж, прекрсано. 1. Создаём пустой проект консольного приложения, потом (по способу, описанному выше) добавляем файл disasm.h. И создаём файл с исходным кодом, пока этот файл пустой, как вы понимаете. 2. Открываем наш main.c, например, в блокноте, давим Ctrl+A (выделить всё ![]() 3. Далее вспомним про наш LibOlly.lib, вспомнив, скопируем его в папку тестового проекта. Кстати, я не упоминаю, полагая, что это само собой разумеется, но файл disasm.h тоже нужно скопировать в папку проекта, а не указывать студии файл, лежащий в папке другого проекта. Этим мы добиваемся переносимости проектов, т.е. мы сможем легко скопировать всю папку даже на другой компьютер, и там это добро тоже будет собираться. 4. В самом начале файла Code.cpp я добавил включаемые файлы, точь в точь такие же, как и у .с файлов, которые пошли для сборки .lib файла. Это выглядит примерно так: Code:
Здесь я так приинклудил сам disasm.h, и добавил библиотеку в проект строкой #pragma comment (lib,"LibOlly.lib"). Возможно, на этом моменте следует остановиться отдельно, а, может, и нет, но помните, что если вы просто скопировали файл в папку проекта, это ещё не значит, что он добавился в проект или решение, его ещё нужно будет явно указать обозревателю решений. 5. Настройки проекта тоже нужно подправить, чтоб они были одинаковыми с настройками проекта библиотеки. Помните, всякие там Многопоточная /MT и т.д. 6. И последний штрих. Идём в конец disasm.h и видим там такие строки: Code:
Удаляем перед ними ключевое слово unique, он же задефайненый extern. Т.е. в каждой строке должно получиться что-то типа int ideal; . Ну вот и всё, наслаждаемся рабочим сэмплом. Результат всего этого действа можно взять Ах да, для совместимости со стандартной библиотекой шаблонов закомментируйте этот кусок: Code:
----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 07 января 2013 21:09 · Поправил: ARCHANGEL · Личное сообщение · #11 Браузил инет и увидел он-лайн тетрис. Поигрался немного. Увидел, что сбоку предлагают "скачать полную версию". Ну так, ёлы-палы, чё ж не скачать-то? Ну скачал инсталлер. Установил, а она мне... ну, вы сами понимаете что. Что любопытно, так это то, что инсталлятор принадлежал Ладно, взяли в руки RDG Packer detector, он паказал, что это - арма. Причём 8.6 версии. Я вообще-то не спец по арме, ну, когда-то в далёком 2007 смотрел пару видеотуторов по распаковке от ZooMiK'a. Знаете, что любопытно, так это то, что почти ничего не поменялось. Взял Armadillo Find Protected v 2.0, закинул туда бинарь. Из опции есть Debug-Blocker. Посмотрел ещё одно видео А ребятам из абсолютиста могу пожелать творческих успехов. Какой-то личной неприязни у меня к ним нет. Но не надо уж так явно показывать, как они заколачивают бабло на старшем поколении пользователей. Ведь согласитесь, никто из современной молодёжи покапуть эти игрухи не станет - все будут искать кряк. Купить их могут лишь люди старшего возраста, наши с вами родители, дяди, тёти, бабушки, дедушки и т.д. А ведь зарабатывать на этих людях даже как-то неприлично. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 08 января 2013 11:50 · Личное сообщение · #12 |
|
Создано: 08 января 2013 14:30 · Поправил: ARCHANGEL · Личное сообщение · #13 |
|
Создано: 08 января 2013 19:10 · Личное сообщение · #14 вроде бы ранг мудрец странно слышать от вас такой вопрос - зачем ![]() ну во первых это красиво во вторых это скилл в третьих ARCHANGEL пишет: Это ж тогда придётся арму за собой таскать на ехе-файле. ваш файл весит больше, вы забыли упаковать упиксом, это сути не меняет первые два пункта как мне кажется перекрывают все остальное я бы и сам пробрутил только нету куды ![]() |
|
Создано: 08 января 2013 23:57 · Личное сообщение · #15 |
|
Создано: 10 января 2013 20:14 · Личное сообщение · #16 |
|
Создано: 22 января 2013 21:42 · Поправил: ARCHANGEL · Личное сообщение · #17 Возник у меня в связи с продолжением моего горемычного обучения вопрос по исключениям в стиле С++. То есть про конструкцию типа try{}catch{}. Как мне известно, исключения в стиле с (__try{}__except(){}) могут перехватывать любые исключения, плюс из обработчика через макросы мне доступна инфа о возникшем исключении (EXCEPTION_RECORD). Здесь же, как я понял, я могу перехватить исключение только известного мне типа и сгенерированное моей прогой (ехе или библиотекой). Если внутри try-блока я тупо поделю на нуль или обращусь к нулевому указателю, то иксепшен такой отлавливаться не будет. Даже через catch(...). Блин, ну это ж фигня. А если у меня есть левый бинарь (dll), из которой я вызываю экспортируемую функцию, и эта функа иногда может делать что-то, что приводит к исключению, то средствами с++ это никак не обработать? Гуглил на эту тему - ничего так и не сгуглилось. Куча инфы про иксепшены, классы иксепшенов, полиморфизм в иксепшенах и т.д., но ведь, имхо, это самый основной функционал обработчика исключений, и его нет. Может, кто знает способ, как всё-таки заставить это работать? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 22 января 2013 22:23 · Личное сообщение · #18 |
|
Создано: 22 января 2013 23:03 · Личное сообщение · #19 ARCHANGEL пишет: Как мне известно, исключения в стиле с (__try{}__except(){}) могут перехватывать любые исключения Нет, не все. Точнее все, но в пользовательском режиме. В режиме ядра(драйверах) некоторые исключения таким образом не обработать. ARCHANGEL пишет: Здесь же, как я понял, я могу перехватить исключение только известного мне типа и сгенерированное моей прогой (ехе или библиотекой). Если внутри try-блока я тупо поделю на нуль или обращусь к нулевому указателю, то иксепшен такой отлавливаться не будет. Даже через catch(...). Блин, ну это ж фигня. С++ от Microsoft? Тогда нужно использовать опцию /EHa компилятора. Тогда catch(...) будет ловить и деление на нуль. ----- http://ntinfo.biz ![]() |
|
Создано: 22 января 2013 23:57 · Поправил: ARCHANGEL · Личное сообщение · #20 Archer Да, собственно, в большинстве случаев ничего. Но в некоторых случаях этого сделать нельзя. Предположим, я создаю объект, далее в сишном блоке __try вызываю какие-то его методы, или просто код, даже не относящийся к обекту, а в блоке ___except(EXCEPTION_EXECUTE_HANDLER){... return 0;} делаю, то из-за невозможности вызвать деструкутор компилятор такой файл собирать откажется. Также такое может происходить из-за невозможности вызова деструкторов для объектов, которые мой объект агрегирует. Я уж не помню всех деталей, но, если мне память всё-таки не изменяет, то и просто ___except нельзя в таких случаях использовать, независимо от того, return там внутри или просто любой код. hors пишет: В режиме ядра(драйверах) некоторые исключения таким образом не обработать Ну, давайте говорить на чистоту - там их никаким SEH-фреймом не обработать. И это уже не проблема компилятора от Microsoft или ограничения языка - это ограничение операционной системы и механизма SEH как такового. Тут же другая ситуация - CxxThrowException является заглушкой над RaiseException, которая, вызываясь, генерирует вполне себе обрабатываемое исключение, из ядра это приводит нас на KiUserExceptionDispatcher, откуда модификация контекста кидает нас на код с++ обработчика, который ищет наш обработчик и вызывает его (блок catch). Внутри этого блока вполне может быть доступна и EXCEPTION_RECORD, и CONTEXT, но они почему-то недоступны, т.к. вызов макросов типа This function can be called only from within the filter expression of an exception handler. И из catch его не вызвать. Тогда нужно использовать опцию /EHa компилятора. Попробую, отпишусь о результатах. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 23 января 2013 00:20 · Личное сообщение · #21 Ну, вроде как появилась ясность. До этого гуглили-гуглил, и ничего путного. Сейчас же с ключевым словом /EHa от hors дело пошло бодро и хорошо. Во-первых, узнал, что включить эту опцию можно так: Configuration Properties ->C/C++ ->Code Generation ->Enable C++ Exceptions for the file И catch(...) будет ещё и обычные исключения обрабатывать. С получением инфы об исключении всё хитрее. Но Code:
----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 23 января 2013 16:02 · Личное сообщение · #22 ARCHANGEL __try, __finally За это надо бить, потому что учите не плюсы, а cl.exe. C++11 - 15 Exception handling все что касается плюсовых исключений. ![]() |
|
Создано: 23 января 2013 16:31 · Поправил: ARCHANGEL · Личное сообщение · #23 |
|
Создано: 23 января 2013 16:39 · Личное сообщение · #24 ARCHANGEL Полностью не один компилятор не поддерживает, наиболее близок к стандарту GCC и Clang, черточки __try означают "специфика" ( компилятора-платформы ), ключ "педантичность" в GCC скажет что код прибит гвоздями к платформе. ![]() |
|
Создано: 02 февраля 2013 12:50 · Поправил: ARCHANGEL · Личное сообщение · #25 Вот читал тему про игру и ![]() Только не надо обижаться, но мне кажется, что, всё-таки, есть дела и поважнее игр и мониторов. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 02 февраля 2013 13:37 · Личное сообщение · #26 |
|
Создано: 08 февраля 2013 23:28 · Поправил: ARCHANGEL · Личное сообщение · #27 Опять очередная задачка. Хрен его знает, по каким ключевым словам такое можно сгуглить, поэтому излагаю, как могу, а если кто знает, где искать и как это грамотно называется - пишите. В общем, есть задача пройтись из третьего кольца по _PEB_LDR_DATA другого процесса. Хэндлы с нужными правами доступа для процесса и его первичного потока имеются. Если мне нужно сделать это в адресном пространстве текущего (своего) процесса, то для этого я запилил следующий код: Code:
Для другого процесса мне нужно сделать контейнер, умеющий работать с обощёнными алгоритмами STL. Т.е. реализовать поддержку двунаправленных итераторов (как в списке, т.к. изначально у нас есть LIST_ENTRY), перегрузить для них операции инкремента, декремента и т.д. Ну, короче, всё как по стандарту. Итератор, конечно же, должен указывать на структуру _LDR_DATA_TABLE_ENTRY. Логично, что его разыменование должно приводить к копированию полей этой структуры в адресное пространство моего процесса. Т.е., как вы понимаете, если я всё сделаю правильно, код выше не изменится. Но благодаря дополнительным полям класса сможет работать и с другими процессами тоже. Для обеспечения такого функционала мне понадобятся своего рода умные указатели типа PVOID. Такие указатели должны уметь становиться типизированными, т.е. к ним я должен иметь возможность применять операцию преобразования типа с последующим разыменовыванием. Давайте поясню на примере. Допустим, я вызвал ZwQueryInformationThread и получил адрес TEB в памяти другого процесса. Но сразу вот так взять и использовать конструкцию такого вида: Info.TebBaseAddress ->ProcessEnvironmentBlock я не могу, т.к. будет получен доступ к памяти моего процесса, а не того, другого. Мне нужно к значению адреса прибавить смещение, по которому находится адрес ProcessEnvironmentBlock в TEB'e, потом через ReadProcessMemory считать значение, которое расположено по этому адресу, и сохранить его в моём процессе. И вот вопрос - как же создать такой указатель? Или какие алтернативные подходы тут можно использовать? ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 09 февраля 2013 04:47 · Поправил: hors · Личное сообщение · #28 ARCHANGEL пишет: Для другого процесса мне нужно сделать контейнер, умеющий работать с обощёнными алгоритмами STL. Т.е. реализовать поддержку двунаправленных итераторов (как в списке, т.к. изначально у нас есть LIST_ENTRY), перегрузить для них операции инкремента, декремента и т.д. Ну, короче, всё как по стандарту. Итератор, конечно же, должен указывать на структуру _LDR_DATA_TABLE_ENTRY. Логично, что его разыменование должно приводить к копированию полей этой структуры в адресное пространство моего процесса. Т.е., как вы понимаете, если я всё сделаю правильно, код выше не изменится. Но благодаря дополнительным полям класса сможет работать и с другими процессами тоже. А нужно ли все так усложнять? Может лучше просто последовательно читать целиком структуры из другого процесса, а потом разбирать их поля без перегрузки операторов? В своей программе ----- http://ntinfo.biz ![]() |
|
Создано: 09 февраля 2013 14:32 · Личное сообщение · #29 hors Если я правильно понял, вы предлагает пройтись полностью по всей структуре TEB, потом по PEB, потом по всем _LDR_DATA_TABLE_ENTRY, потом покопировать содержимое всех указателей _LDR_DATA_TABLE_ENTRY (чтоб, например, тот же FullDllName.Buffer был не просто адресом, а имел правильное содержимое), т.е. сделать как бы, копию той структуры, что в другом процессе, но только в моём. А дальше её разбирать. Возможно, это - хорошая идея, если структура нужна вся целиком. Но мне нужны будут лишь отдельные её элементы, в общем случае, мне даже не требуется полностью её обходить (имеется ввиду весь список _LDR_DATA_TABLE_ENTRY). Поэтому такие действия будут избыточными. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
|
Создано: 09 февраля 2013 16:50 · Личное сообщение · #30 ARCHANGEL пишет: Но мне нужны будут лишь отдельные её элементы, в общем случае, мне даже не требуется полностью её обходить (имеется ввиду весь список _LDR_DATA_TABLE_ENTRY). Если нужны только отдельные элементы(полагаю что только документированные), то почему бы тогда не воспользоваться официальными API, которые читаю информацию из _LDR_DATA_TABLE_ENTRY? Например та же функция CreateToolhelp32Snapshot. ----- http://ntinfo.biz ![]() |
|
Создано: 09 февраля 2013 17:02 · Личное сообщение · #31 hors Есть один ньюанс, та же CreateToolhelp32Snapshot не будет работать, если процесс создан в режиме Suspended, но список загруженных модулей есть и в таком процессе тоже. Для чего вообще это делается. Есть одно приложение, в которое мне надо заинжектить библиотеку путём создания внутри такого приложение потока посредством CreateRemoteThread. А чтоб знать, с какого адреса этот поток должен стартануть, я должен знать, по какому адресу загружена kernel32.dll. На ХР эти адреса одинаковы для всех процессов, и я могу узнать этот адрес для своего процесса. Для другого он будет таким же. А вот дальше появляется ASLR, и тут всё несколько интереснее. А так я для такого процесса узнаю, где у него будет kernel32.dll, и скорректирую адресок для CreateRemoteThread. Вот как-то так. ----- Stuck to the plan, always think that we would stand up, never ran. ![]() |
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 . >> |
![]() |
eXeL@B —› Дневники и блоги —› ARCHANGEL's blog |