Сейчас на форуме: (+5 невидимых)

 eXeL@B —› Дневники и блоги —› ARCHANGEL's blog
<< . 1 . 2 . 3 . 4 . 5 . 6 . 7 . 8 . 9 . 10 . >>
Посл.ответ Сообщение


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 13 июля 2012 18:28
· Личное сообщение · #1

Добрый день, уважаемые форумчане. Ни для кого не секрет, что решил я с недавних пор пойти учиться программированию. Поэтому стали меня интересовать практические аспекты кодинга, иногда весьма далёкие от вопросов реверсинга. Поэтому чтоб не засорять форум, решил создать этот блог. Стоит сказать, что вопросы, которые планируется тут разбирать, не такие уж и бесполезные. Они часто могут возникать при написании тех же кейгенов или тулз для реверсинга, так что, надеюсь, каждый сможет найти здесь что-нибудь интересное. Как некоторые уже догадались, вопросы Common Controls, простым числам, и сегодняшний вопрос по OpenGL как раз из серии учебных. Теперь о самом вопросе.

На днях выполнял задание про отрисовку простых фигур: треугольника, квадрата и т.д. Решено было выполнять рисование средствами OpenGL. Литературы по этому делу много, поэтому я разобрался, что и как. Т.е. в литературе советовали использовать бибилиотеку glut.dll, которая сама не относится к стандартному OpenGL, но её применение, как я понял, упрощает использование OpenGL в своих проектах. Далее я решил создать базовый класс для отрисовки треугольника, а от него создать производные классы для отрисовки других геометрических фигур. Но на практике получилась вот такая сложность. Дело в том, что glut, по сути, инкапсулирует функции Windows и OpenGL, что упрощает операции с ними. Но от базовых вещей же никуда не деться. Т.е. если процедура обработки оконных сообщений (CALLBACK WindowProc) должна присутствовать, то в классе она должна быть статической. Так и здесь:
Code:
  1. glutDisplayFunc(Draw); //где Draw - колбэк, а значит не может быть простым методом класса


Но вот проблема - мне нужно передать внутрь Draw несколько параметров. Являясь статическим методом, Draw не имеет указателя this, а значит не видит обычных полей. Статические поля он видит, но при попытке в конструкторе присвоить значения этим полям появляется ошибка линковки. Понятное дело, что по-хорошему, можно обойтись совсем без классов, но это превратит код в кашу - большое количество глобальных переменных, почти одинаковые функции со схожим функционалом принесут путаницу раньше, чем будут отрисованы несколько фигур. Кто посоветует, как быть в такой ситуации и как решить проблему со статическими функциями-членами?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 26 декабря 2012 12:05 · Поправил: reversecode
· Личное сообщение · #2

ну сисер можно попатчить что бы он считал что он постоянно под вмварей а не детектил ее
и нормально работал

ARCHANGEL пишет:
Я, правда, не знаю, почему вы не хотите, чтоб Свин узнал инфу про старфорс.

пусть узнает)) ему никто не мешает, ихняя команда реверсеров заявила что за два месяца они сломают старфос. приэтом если посчитать сколько они с ним уже маются, прошло уже почти пол года а воз и ныне там (с)




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 декабря 2012 12:21
· Личное сообщение · #3

reversecode
сисер варю не детектит, там без vmware tools какая-то проблема с выводом в видеобуфер. Варю детектит старфорс.

ихняя команда реверсеров заявила что за два месяца они сломают старфос
Это да, за это я люблю тот блог.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 26 декабря 2012 12:31
· Личное сообщение · #4

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




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 декабря 2012 13:01
· Личное сообщение · #5

reversecode
А, вот теперь понял, да, видел в сисере строку Host machine is vmware! Или как-то так. Нужно будет поискать в иде, может, где найдётся, и посмотреть, что там да как.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 29 декабря 2012 11:32
· Личное сообщение · #6

Продолжаю дальнейшее повествование по вытаскиванию рук из задницы и попытке реверсинга старфорса. В общем, не считаю нескольких нелепых попыток заставить сисер работать на варе, про которые даже и рассказать нечего, решил я пока оставить сисер и взять IDA Pro. Как отладчик я его раньше почти не использовал (ну так, пару раз на поиграться). Прочитал статью вот --> Эту <--, ну, всё, вроде понятно. Начал повторять. И тут началось самое интересное. Вначале стояла у меня на компе варя версии 6.5. На ней после пары попыток поставить бряк варя вылетала с ошибкой, причём так, что на основной машине отключались клава и мышь, и приходилось давить reset. Попробовал на варе 8. Там коннект удаётся сделать через три раза на четвёртый. Поставил 9 версию. На ней, вроде, коннектится. Ладно, но если сконнектились, то ставлю бряк на дровину старфорса - и бряк не срабатывает. Решил провести тестовую установку бряка. Запустил на виртуалной системе RkU, через него определил адрес NtClose, поставил в иде бряк на этот адрес, надавил F9 - бряки стали срабатывать. Поставил бряк таким же методом на NtDeviceIoControlFile. Срабатывает. Решил поставить бряк с условием типа Dword(ebp-0x21) == 0x910024C0. Как вы догадались, 0x910024C0 - это IoControlCode, который упакованное приложение шлёт драйверу. И ничего. Что за нах?!

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 30 декабря 2012 23:46
· Личное сообщение · #7

Так что-то отладка на вм не ладится. Поэтому принял я мудрое решение - забить на это дело. Пойду вон, делом займусь, а то всё старфорс, старфорс... Пусть Свин долбается.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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.





Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 02 января 2013 16:26
· Личное сообщение · #9

ну по ссылкам в гугле их полно
http://msdl.microsoft.com/download/symbols/debuggers/dbg_x86_6.11.1.404.msi
старенький




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 02 января 2013 16:57 · Поправил: ARCHANGEL
· Личное сообщение · #10

Вот появилась возможность разобраться с дизассемблерным движком Олли, скачать который можно с официального сайта по --> ЭТОЙ <-- ссылке. Скачать-то можно, а вот как собрать в студии? Сейчас я попробую ответить на этот вопрос. Для примера буду использовать студию 2010. Итак, я предполагаю, что сейчас вы это добро скачали, разархивировали, и пытаетесь собрать. Действовать будем в два этапа. Этап первый - сборка статической (*.lib) библиотеки. Этап второй - сборка тестового приложения.

Сборка статической библиотеки.
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:
  1. #if (char)0xFF!=255
  2. #error Please set default char type to unsigned
  3. #endif

Она располагается в disasm.h. Её тоже нужно удалить или закомментить.
9. Последний штрих нужно провести для работоспособности вот этой строки:
Code:
  1. floating*=pow10l(decimal*base); };

С помощью гугла можем найти, что --> Функция pow10l <-- из себя представляет. Как видите, реализовать её совсем не трудно. Возьмём и реализуем.
Code:
  1. long double pow10l (int n)
  2. {
  3.          return pow(10.0,n);
  4. }

Естественно, реализацию нужно добавить либо перед вызовом, либо предварительно объявить.
9. И вот, с кучей варнингов, но мы получили заветный .lib.

Сборка тестового приложения
У нас с вами сейчас уже есть готовый .lib файл. Самое время прикрутить его к какому-нибудь приложению и поюзать. Создаем тестовый консольный проект, в котором мы попытаемся сделать рабочим пример кода из main.c. Этот файл, если вы не заметили, также идёт в скачанном нами с официального сайта архиве. Что ж, прекрсано.
1. Создаём пустой проект консольного приложения, потом (по способу, описанному выше) добавляем файл disasm.h. И создаём файл с исходным кодом, пока этот файл пустой, как вы понимаете.
2. Открываем наш main.c, например, в блокноте, давим Ctrl+A (выделить всё ), потом копируем выделенное и вставляем в пустой файл, который я, для примера, назвал Code.cpp. Причина такого переливания из пустого в порожнее указывалась выше.
3. Далее вспомним про наш LibOlly.lib, вспомнив, скопируем его в папку тестового проекта. Кстати, я не упоминаю, полагая, что это само собой разумеется, но файл disasm.h тоже нужно скопировать в папку проекта, а не указывать студии файл, лежащий в папке другого проекта. Этим мы добиваемся переносимости проектов, т.е. мы сможем легко скопировать всю папку даже на другой компьютер, и там это добро тоже будет собираться.
4. В самом начале файла Code.cpp я добавил включаемые файлы, точь в точь такие же, как и у .с файлов, которые пошли для сборки .lib файла. Это выглядит примерно так:
Code:
  1. #include "disasm.h"
  2. #include <windows.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <ctype.h>
  6. #include <math.h>
  7. #include <float.h>
  8.  
  9. #pragma comment (lib,"LibOlly.lib")

Здесь я так приинклудил сам disasm.h, и добавил библиотеку в проект строкой #pragma comment (lib,"LibOlly.lib"). Возможно, на этом моменте следует остановиться отдельно, а, может, и нет, но помните, что если вы просто скопировали файл в папку проекта, это ещё не значит, что он добавился в проект или решение, его ещё нужно будет явно указать обозревателю решений.
5. Настройки проекта тоже нужно подправить, чтоб они были одинаковыми с настройками проекта библиотеки. Помните, всякие там Многопоточная /MT и т.д.
6. И последний штрих. Идём в конец disasm.h и видим там такие строки:
Code:
  1. unique int       ideal; // Force IDEAL decoding mode
  2. unique int       lowercase; // Force lowercase display
  3. unique int       tabarguments; // Tab between mnemonic and arguments
  4. unique int       extraspace; // Extra space between arguments
  5. unique int       putdefseg; // Display default segments in listing
  6. unique int       showmemsize; // Always show memory size
  7. unique int       shownear; // Show NEAR modifiers
  8. unique int       shortstringcmds; // Use short form of string commands
  9. unique int       sizesens; // How to decode size-sensitive mnemonics
  10. unique int       symbolic; // Show symbolic addresses in disasm
  11. unique int       farcalls; // Accept far calls, returns & addresses
  12. unique int       decodevxd; // Decode VxD calls (Win95/98)
  13. unique int       privileged; // Accept privileged commands
  14. unique int       iocommand; // Accept I/O commands
  15. unique int       badshift; // Accept shift out of range 1..31
  16. unique int       extraprefix; // Accept superfluous prefixes
  17. unique int       lockedbus; // Accept LOCK prefixes
  18. unique int       stackalign; // Accept unaligned stack operations
  19. unique int       iswindowsnt; // When checking for dangers, assume NT

Удаляем перед ними ключевое слово unique, он же задефайненый extern. Т.е. в каждой строке должно получиться что-то типа int ideal; .

Ну вот и всё, наслаждаемся рабочим сэмплом.

Результат всего этого действа можно взять --> Здесь <--

Ах да, для совместимости со стандартной библиотекой шаблонов закомментируйте этот кусок:
Code:
  1. //#ifndef MAINPROG
  2. //#define unique extern
  3. //#else
  4. //#define unique
  5. //#endif


-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 07 января 2013 21:09 · Поправил: ARCHANGEL
· Личное сообщение · #11

Браузил инет и увидел он-лайн тетрис. Поигрался немного. Увидел, что сбоку предлагают "скачать полную версию". Ну так, ёлы-палы, чё ж не скачать-то? Ну скачал инсталлер. Установил, а она мне... ну, вы сами понимаете что. Что любопытно, так это то, что инсталлятор принадлежал --> ЭТИМ <-- товарищам. Полазил по сайту, почитал инфу о ребятах --> здесь <--. Так это ж целый клон алавара на территории Файны Украйны разместился. Вот, вроде, и трудятся люди, и программисты что-то пишут, и дизайнеры рисуют, а у меня стойкое чувство, что меня хотят обмануть. Ну не могу я заплатить за тетрис, алго которого разве что на заборе не написан. В который я ещё в первом классе играл на --> Такой игрухе <--.

Ладно, взяли в руки RDG Packer detector, он паказал, что это - арма. Причём 8.6 версии. Я вообще-то не спец по арме, ну, когда-то в далёком 2007 смотрел пару видеотуторов по распаковке от ZooMiK'a. Знаете, что любопытно, так это то, что почти ничего не поменялось. Взял Armadillo Find Protected v 2.0, закинул туда бинарь. Из опции есть Debug-Blocker. Посмотрел ещё одно видео --> by mr.exodia <--, ну, почти то, что нужно, только мне ещё детачь надо было выполнить. Это, к счастью, просто - галку поставил в Find Protected и всё. Закинул ещё раз туда ехе-файл, приаттачил отладчик к указанному процессу, перешёл на указанный адрес, заменил там два байта. Потом всё, как на видео - запатчил функу, генерирующую переходники, нашёл ОЕР, снял дамп (только дампил через Pe Tools), прикрутил импорт. mr.exodia в своём видео получил пример, в котором нет разделителей импорта из-за двойного слоя упаковки, мне ж в ImpRec пришлось ещё надавить Show Invalid -> Cut Thunks. Всё, добавил импорт и запатчил полученный дамп через Armadillo Reducer 1.7.1 RC2. Работает. Архив с тулзами по арме, инсталлятором и анпакнутым файлом выкладываю --> Сюда <--. Если кому интересно - качайте, пользуйтесь. Никаких секретных тулз в архиве нет - только упомянутые выше, это просто для того, чтоб вы не искали их сами в гугле, если у вас их до сих пор нет.

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

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 13.0 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 08 января 2013 11:50
· Личное сообщение · #12

ARCHANGEL
а загенить слабо?




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 08 января 2013 14:30 · Поправил: ARCHANGEL
· Личное сообщение · #13

matrix
Хм, не знаю, не пробовал. Но возникает вполне логичный вопрос - зачем? Это ж тогда придётся арму за собой таскать на ехе-файле.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 13.0 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 08 января 2013 19:10
· Личное сообщение · #14

вроде бы ранг мудрец странно слышать от вас такой вопрос - зачем
ну во первых это красиво
во вторых это скилл
в третьих ARCHANGEL пишет:
Это ж тогда придётся арму за собой таскать на ехе-файле.

ваш файл весит больше, вы забыли упаковать упиксом,
это сути не меняет первые два пункта как мне кажется перекрывают все остальное
я бы и сам пробрутил только нету куды




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 08 января 2013 23:57
· Личное сообщение · #15

matrix
Не охота возиться мне, хотя инфа по кейгеннингу есть в топике про арму. Ленивый я стал.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 13.0 (новичок), 2thx
Активность: 0.030
Статус: Участник

Создано: 10 января 2013 20:14
· Личное сообщение · #16

Ну дак празднеки же




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 22 января 2013 22:23
· Личное сообщение · #18

А что тебе, собственно, мешает сишные исключения воткнуть?




Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 22 января 2013 23:03
· Личное сообщение · #19

ARCHANGEL пишет:
Как мне известно, исключения в стиле с (__try{}__except(){}) могут перехватывать любые исключения


Нет, не все. Точнее все, но в пользовательском режиме. В режиме ядра(драйверах) некоторые исключения таким образом не обработать.


ARCHANGEL пишет:
Здесь же, как я понял, я могу перехватить исключение только известного мне типа и сгенерированное моей прогой (ехе или библиотекой). Если внутри try-блока я тупо поделю на нуль или обращусь к нулевому указателю, то иксепшен такой отлавливаться не будет. Даже через catch(...). Блин, ну это ж фигня.


С++ от Microsoft? Тогда нужно использовать опцию /EHa компилятора. Тогда catch(...) будет ловить и деление на нуль.

-----
http://ntinfo.biz


| Сообщение посчитали полезным: ARCHANGEL


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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, но они почему-то недоступны, т.к. вызов макросов типа --> GetExceptionInformation <-- возможен, как говориться в первоисточнике:

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.





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 23 января 2013 00:20
· Личное сообщение · #21

Ну, вроде как появилась ясность. До этого гуглили-гуглил, и ничего путного. Сейчас же с ключевым словом /EHa от hors дело пошло бодро и хорошо. Во-первых, узнал, что включить эту опцию можно так:

Configuration Properties ->C/C++ ->Code Generation ->Enable C++ Exceptions for the file

И catch(...) будет ещё и обычные исключения обрабатывать. С получением инфы об исключении всё хитрее. Но --> Здесь <-- есть пример, как надо получать инфу о нём в обработчиках catch. В принципе, продублирую ключевой кусок:

Code:
  1. int main( void )
  2. {
  3.     try
  4.     {
  5.         _set_se_translator( trans_func ); // 1. установили SEH-обработчик
  6.         SEFunc();
  7.     }
  8.     catch( SE_Exception e ) // 4. Обрабатываем с++ исключение
  9.     {
  10.         printf( "Caught a __try exception with SE_Exception.\n" );
  11.     }
  12. }
  13. void SEFunc()
  14. {
  15.     __try
  16.     {
  17.         int x, y=0;
  18.         x = 5 / y;
  19.     }
  20.     __finally
  21.     {
  22.         printf( "In finally\n" );
  23.     }
  24. }
  25. void trans_func( unsigned int u, EXCEPTION_POINTERS* pExp ) //2. Попали в обработчик при генерации исключения
  26. {
  27.     printf( "In trans_func.\n" );
  28.     throw SE_Exception(); //3. Генерим иксепшен в стиле с++
  29. }


-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 23 января 2013 16:02
· Личное сообщение · #22

ARCHANGEL
__try, __finally
За это надо бить, потому что учите не плюсы, а cl.exe.
C++11 - 15 Exception handling все что касается плюсовых исключений.
error




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 23 января 2013 16:31 · Поправил: ARCHANGEL
· Личное сообщение · #23

F_a_u_s_t
Интересно. Я ж так понимаю, что 11 версия стандарта поддерживается 2012 студией?

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 23 января 2013 16:39
· Личное сообщение · #24

ARCHANGEL
Полностью не один компилятор не поддерживает, наиболее близок к стандарту GCC и Clang, черточки __try означают "специфика" ( компилятора-платформы ), ключ "педантичность" в GCC скажет что код прибит гвоздями к платформе.

| Сообщение посчитали полезным: ARCHANGEL


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 02 февраля 2013 12:50 · Поправил: ARCHANGEL
· Личное сообщение · #25

Вот читал тему про игру и --> широкоформатные мониторы <--. Сложилось такое впечатление:



Только не надо обижаться, но мне кажется, что, всё-таки, есть дела и поважнее игр и мониторов.

-----
Stuck to the plan, always think that we would stand up, never ran.




Ранг: 0.0 (гость)
Активность: 0.250
Статус: Участник

Создано: 02 февраля 2013 13:37
· Личное сообщение · #26

ARCHANGEL пишет:
есть дела и поважнее игр и мониторов.

С играми согласен, пусть свиновод играется, а вот выбор монитор это серьезно, что бы удобно было.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 08 февраля 2013 23:28 · Поправил: ARCHANGEL
· Личное сообщение · #27

Опять очередная задачка. Хрен его знает, по каким ключевым словам такое можно сгуглить, поэтому излагаю, как могу, а если кто знает, где искать и как это грамотно называется - пишите. В общем, есть задача пройтись из третьего кольца по _PEB_LDR_DATA другого процесса. Хэндлы с нужными правами доступа для процесса и его первичного потока имеются. Если мне нужно сделать это в адресном пространстве текущего (своего) процесса, то для этого я запилил следующий код:

Code:
  1. try{
  2.          NtInfo = FindAddressOfInfo();
  3.          DWORD status = NtInfo(ThreadHandle,ThreadBasicInformation,&Info,sizeof(Info),&stub);
  4.          if (status == STATUS_SUCCESS)
  5.          {
  6.                  _PEB_LDR_DATA* LDR = Info.TebBaseAddress ->ProcessEnvironmentBlock ->Ldr;
  7.                  _LIST_ENTRY Lst = LDR ->InLoadOrderModuleList;
  8.                  _LDR_DATA_TABLE_ENTRY* First = (_LDR_DATA_TABLE_ENTRY*) Lst.Flink;
  9.                  Last = First;
  10.                  do{
  11.                         wchar_t* temp = Last ->FullDllName.Buffer;
  12.                         if (!temp)
  13.                               break;
  14.                         std::wcout << temp << std::endl;
  15.                         Last = (_LDR_DATA_TABLE_ENTRY*) Last ->InLoadOrderLinks.Flink;
  16.                  }while (First != Last && Last);
  17.          }
  18. }


Для другого процесса мне нужно сделать контейнер, умеющий работать с обощёнными алгоритмами 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.





Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 09 февраля 2013 04:47 · Поправил: hors
· Личное сообщение · #28

ARCHANGEL пишет:
Для другого процесса мне нужно сделать контейнер, умеющий работать с обощёнными алгоритмами STL. Т.е. реализовать поддержку двунаправленных итераторов (как в списке, т.к. изначально у нас есть LIST_ENTRY), перегрузить для них операции инкремента, декремента и т.д. Ну, короче, всё как по стандарту. Итератор, конечно же, должен указывать на структуру _LDR_DATA_TABLE_ENTRY. Логично, что его разыменование должно приводить к копированию полей этой структуры в адресное пространство моего процесса. Т.е., как вы понимаете, если я всё сделаю правильно, код выше не изменится. Но благодаря дополнительным полям класса сможет работать и с другими процессами тоже.


А нужно ли все так усложнять? Может лучше просто последовательно читать целиком структуры из другого процесса, а потом разбирать их поля без перегрузки операторов?

В своей программе XNTSV я кстати так и делаю.

-----
http://ntinfo.biz





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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.





Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 09 февраля 2013 16:50
· Личное сообщение · #30

ARCHANGEL пишет:
Но мне нужны будут лишь отдельные её элементы, в общем случае, мне даже не требуется полностью её обходить (имеется ввиду весь список _LDR_DATA_TABLE_ENTRY).


Если нужны только отдельные элементы(полагаю что только документированные), то почему бы тогда не воспользоваться официальными API, которые читаю информацию из _LDR_DATA_TABLE_ENTRY? Например та же функция CreateToolhelp32Snapshot.

-----
http://ntinfo.biz





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 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
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати