Сейчас на форуме: (+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.





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

Создано: 09 февраля 2013 18:47
· Личное сообщение · #2

На той же он базе, что и в твоём процессе, не обязательно такой велосипед делать.

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


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

Создано: 09 февраля 2013 19:22
· Личное сообщение · #3

Archer
Сейчас для проверки запустил Windows 7 и посмотрел базу образа kernel32.dll - действительно везде одна и та же. Странно, я думал - ASLR все модули старается ребейзнуть. Ну да ладно, значит меньше проблем.

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





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

Создано: 09 февраля 2013 20:47
· Личное сообщение · #4

Насколько я помню, ntdll, kernelbase (если есть), kernel32 и user32 в пределах ребут-сессии во всех процессах грузятся по одной базе. ASLR их перемещает, но во время ребута. Т.е. рандомность в принципе есть, но в данном случае не мешает.




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

Создано: 26 февраля 2013 15:22 · Поправил: ARCHANGEL
· Личное сообщение · #5

Наконец начал открывать для себя мир Qt. Скачал видеоуроки с торрентов (очень неплохие, надо сказать), купил книгу Шлее по версии 4.8 и начал почитывать, плюс пытаюсь повторить увиденное в уроках, и даже получается. Посмотрев с десяток уроков, начал экспериментировать сам. Попробовал stl в среде разработки qt creator, вызов WinAPI - вроде, получается. И, надо сказать, что этот qt creator в чём-то выигрывает у студии. Для моего рабочего места - во всём. Во-первых, на порядок быстрее стартует, во-вторых, Intellisence работает гораздо лучше (стравнивал с 2010 версией, в 2012 тоже всё работает, так что с 2012 примерно одинаковы), в-третьих бесплатен. Но возникла така путаница - у меня давненько уже установлена студия 2010, потом я поставил (когда-то давно) сдк для qt, а вчера поставил qt creator. Получается, что для сборки проектов используется компилятор 2010 студии - это я вижу по коду в олли. Но вот незадача - как бы изменить опции компилятора и линковщика для qt creator версии 2.6.2, а то в уроках более старая версия описывается, и там в ней есть вкладка, где это можно увидеть/изменить (возможно, тоже можно) эти опции, а в этом не могу найти.

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




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

Создано: 26 февраля 2013 15:44
· Личное сообщение · #6

Тыкай кнопку сборка, там строка параметры, там же можешь заменить jom.exe на что то другое.




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

Создано: 26 февраля 2013 16:03
· Личное сообщение · #7

F_a_u_s_t



Что-то не пойму, куда дальше тыкать

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




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

Создано: 26 февраля 2013 16:18
· Личное сообщение · #8

ARCHANGEL


Вот кстати тебе ссылка на форум, там практически одно qt.
--> Link <--

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


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

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

Что-то клацал в этом окне, клацал, всё равно неясно, как в этом вот окне задать опцию для компилятора Многопоточная /MT, чтоб студийный компилер свой рантайм не лепил к ехе-шнику.

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




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

Создано: 26 февраля 2013 17:20
· Личное сообщение · #10

ARCHANGEL
Там в поле qmake, дополнительные параметры, еще можно напрямую, редактированием makefile.release или makefile.debug




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

Создано: 26 февраля 2013 17:40
· Личное сообщение · #11

ARCHANGEL пишет:
как в этом вот окне задать опцию для компилятора Многопоточная /MT, чтоб студийный компилер свой рантайм не лепил к ехе-шнику.


В папке с qt есть папка mkspecs. В ней конфигурации для всех компиляторов. Нужно найти там win32-msvc2010(ну или другую студию, которая используется ) и открыть в блокноте qmake.conf

Там будет такая запись

Code:
  1. QMAKE_CFLAGS_RELEASE    = -O2 -MD
  2. QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MD -Zi
  3. QMAKE_CFLAGS_DEBUG      = -Zi -MDd


Ну из названий понятно для чего эти значения(Release, debug)

Нужно поменять MD на MT.

Теперь по умолчанию проекты для VS2010 будут собираться с этими опциями.

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





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

Создано: 26 февраля 2013 20:09
· Личное сообщение · #12

F_a_u_s_t, hors
Товарищи, какая-то мистика. Да, нашёлся нужный файл, поправил я там ключи, на MT поменял, и тут самое интересное. С исправленными параметрами вообще ничего не собирается, пишет ошибку линкера 2005:

msvcrt.lib(ti_inst.obj):-1: ошибка: LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) уже определен в LIBCMT.lib(typinfo.obj)

Исправил обратно, дебаг собирается, релиз - та же фигня. Причём, что странно, на рабочем компе такого не происходит, а на домашнем происходит. Возможно, я что-то не так собрал. Попробую разобраться.

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





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

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

Можно попробовать запустить qmake(третий пункт меню) затем rebuild

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





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

Создано: 26 февраля 2013 22:50
· Личное сообщение · #14

Запустил, вначале помогло. Потом закрыл qt creator, удалил скомпиленный ехе, так как без рантайма он всё равно не собирался, несмотря на мои модификации файла qmake.conf. Потом опять открыл creator и запустил сборку - та же ошибка, запустил qmake - ничего не меняется, ошибка при попытке построения та же. И она не одна - их пять:


msvcrt.lib(ti_inst.obj):-1: ошибка: LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) уже определен в LIBCMT.lib(typinfo.obj)

msvcrt.lib(ti_inst.obj):-1: ошибка: LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) уже определен в LIBCMT.lib(typinfo.obj)

LIBCMT.lib(crt0init.obj):-1: предупреждение: LNK4098: библиотека по умолчанию "msvcrt.lib" противоречит использованию других библиотек; используйте параметр /NODEFAULTLIB:library

release\qtSimple.exe:-1: ошибка: LNK1169: обнаружен многократно определенный символ - один или более

NMAKE:-1: ошибка: U1077: "C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\link.EXE" : возвращенный код "0x491"

NMAKE:-1: ошибка: U1077: "C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\nmake.exe" : возвращенный код "0x2"


Исправил файл qmake.conf обратно - но релиз всё равно не собирается - какой-то бред

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




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

Создано: 26 февраля 2013 22:54 · Поправил: F_a_u_s_t
· Личное сообщение · #15

ARCHANGEL
Вариант один, использовать ключ /NODEFAULTLIB, вариант два, указать явно LIB файл в сборке.
ADD:
Еще вариант забыл: ключ /Zl




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

Создано: 26 февраля 2013 23:05
· Личное сообщение · #16

Это все потому, что qt был скомпилирован(а точнее его библиотеки) с MD, поэтому происходит конфликт.

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





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

Создано: 26 февраля 2013 23:10
· Личное сообщение · #17

Все либы должны быть с одинаковой поточностью собраны. Пересобирай QT, если изменял.




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

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

hors
Ну, это я догадался, меня смущает другое - почему я исправил настройки обратно, а ничего не меняется?

F_a_u_s_t
Да я с удовольствием ключи бы хоть какие-то попытался использовать, если б просёк, как тут это делать. Неужели тут нельзя, как в студии, зайти в настройки проекта и подправить параметры командной строки, передающиеся компилятору и линкеру, а надо шариться по каким-то богом забытым файлам, которые я бы без подсказки hors нашёл бы только через processmonitor (и то - не факт).

Вообще я собирал qt по руководству из аттача. Но, как вы понимаете, это всё - для студии. В студии я тогда для теста скомпилил один примерчик и забил на qt. А это что-то как-то заинтересовался, ну очень красивый DiE у hors получился, вот и мне стало интересно. Я взял да и докачал qt creator, установил его, стал смотреть уроки и компилить примеры. Всё получалось, пока не решил я накодить что-то, что могло б в реальных условиях использоваться.

Так, может, надо просто не так всё делать? В смысле, по-другому собирать? На форуме --> Том, что советовали выше <-- я зарегался, и начал читать, что там есть, но пока как надо собирать, не нашёл. Почему-то там в основном --> Тоска ни о чём <--.

2104_26.02.2013_EXELAB.rU.tgz - (QT 4.8.0 на Visual Studio 2010.pdf

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





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

Создано: 26 февраля 2013 23:40
· Личное сообщение · #19

ARCHANGEL пишет:
Ну, это я догадался, меня смущает другое - почему я исправил настройки обратно, а ничего не меняется?


В крайнем случае можно переустановить QT. И если vs2010 без SP1, то обязательно поставить.

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




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

Создано: 27 февраля 2013 00:15 · Поправил: F_a_u_s_t
· Личное сообщение · #20

ARCHANGEL
По поводу ключей, то их во все времена в pro файлы писали, например QMAKE_CXXFLAGS_RELEASE = -MT вставляешь в pro и все, вот потоки да, должны быть собраны в обоих вариантах дабы можно было переключать.
Добавлю для справки, мб пригодится:
QMAKE_CFLAGS и QMAKE_CXXFLAGS влияют на любой тип сборки, хоть релиз, хоть отладочная, а вот QMAKE_CXXFLAGS_RELEASE в таком случае ключи будут влиять только на релиз сборку, думаю дальше разберешься.
Тьфу, главное забыл:
QMAKE_CXXFLAGS - опции компиляции.
QMAKE_LFLAGS - опции линковки.




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

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

Прочитал --> Это <--. Похоже, собрал я всё правильно. И выяснил заодно, что лезть всё-таки надо в эти глубоко засунутые файлы.

Как же мне собрать всё-таки в обоих вариантах дабы можно было переключать? Вот что в эту командную строку надо вписать?

Нагуглил вот --> Это <--, пробую сейчас собрать с ключевым словом -static.

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





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

Создано: 27 февраля 2013 11:02
· Личное сообщение · #22

Попробовал пересобрать, в общем. С ключом MD собирается прекрасно, но если до начала сборки подправить файл настроек, как говорилось выше, то идёт попытка собрать с ключом MT, но потом что nmake, что jom выдают ошибки по типу --> первых трёх <--, которые я указывал в посте № 14, и всё - сборка прекращается. Блин, что ж у меня вечно за жопа со сборкой каких-то библиотек.

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





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

Создано: 27 февраля 2013 17:01
· Личное сообщение · #23

Посмотрел сейчас на DiE:



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





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

Создано: 27 февраля 2013 17:33
· Личное сообщение · #24

Я вполне себе собирал на QT со статиком. Что рантайм статик, что сам QT статик. И никакие эти либы в импорте не торчали.




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

Создано: 27 февраля 2013 17:45 · Поправил: hors
· Личное сообщение · #25

ARCHANGEL пишет:
Посмотрел сейчас на DiE:


Ну в статике я DIE собирал, правда там еxe получается в 8 мб. После upx около пяти. А никаких преимуществ, кроме эстетических, компилирования в один файл я не вижу.

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





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

Создано: 28 февраля 2013 00:21
· Личное сообщение · #26

В общем, что я сделал. Удалил старую версию библиотек через Uninstall, потом скачал qt-win-opensource-4.8.4-vs2010.exe, установил, исправил переменную окружения, т.е. теперь у меня qt был установлен внутрь папки C:\Qt\4.8.4. Далее я полез внутрь файла qmake.conf и изменил там строчки на такие:

Code:
  1. QMAKE_CFLAGS_RELEASE    = -O2 -MT
  2. QMAKE_CFLAGS_RELEASE_WITH_DEBUGINFO += -O2 -MT -Zi
  3. QMAKE_CFLAGS_DEBUG      = -Zi -MTd
  4.  
  5. QMAKE_LFLAGS            = /NOLOGO /DYNAMICBASE /NXCOMPAT /NODEFAULTLIB:library /Zl /MT


Дальше к консоли студии написал:

configure -static -opensource -platform win32-msvc2010

Когда это действо завершилось, просто вписал одинокое nmake.

Потом шарился по настройкам qt creator, чтоб он смог прохавать изменения в библиотеках Qt. Указал новый профиль, якобы, попытался компилить, но показывает:

:-1: ошибка: LNK2001: неразрешенный внешний символ "_WinMainCRTStartup"

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




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

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

ARCHANGEL пишет:
:-1: ошибка: LNK2001: неразрешенный внешний символ "_WinMainCRTStartup"

Точку входа не может найти, укажи прагмой.




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

Создано: 28 февраля 2013 00:53
· Личное сообщение · #28

F_a_u_s_t

Code:
  1. #pragma comment(linker,"/ENTRY:main")
  2.  
  3. #include <QtCore>
  4. #include <QtGui>
  5. #include <Windows.h>
  6.  
  7. int main(int argc,char* argv[])
  8. {
  9.     QApplication A(argc,argv);
  10.     MessageBoxA(NULL,"hello","Dear friend",MB_ICONASTERISK);
  11.     QWidget* w = new QWidget;
  12.     w->show();
  13.     return A.exec();
  14. }


Выдаёт
runtime error R6030
- CRT not initialized


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




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

Создано: 28 февраля 2013 00:58 · Поправил: F_a_u_s_t
· Личное сообщение · #29

ARCHANGEL
Укажи явно путь к CRT, это все из за флага - NODEFAULTLIB
Добавлю цитату из msdn:
Code:
  1. Error Message
  2. CRT not initialized
  3.  
  4. This error occurs if you are using the CRT, but the CRT startup code was not executed. It is possible to get this error if the linker switch /ENTRY is used to override the default starting address, usually mainCRTStartup, wmainCRTStartup for a console EXE, WinMainCRTStartup or wWinMainCRTStartup for a Windows EXE, or _DllMainCRTStartup for a DLL. Unless one of the above functions is called on startup, the C Runtime will not be initialized.


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


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

Создано: 28 февраля 2013 01:38
· Личное сообщение · #30

F_a_u_s_t

Code:
  1. #pragma comment(linker,"/ENTRY:WinMainCRTStartup")


Слава яйкам, заработало!

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





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

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

--> Вот <-- нашёл интересную ссылку для таких же начинающих, как и я. Может, кому пригодится.

-----
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 » Выход » ЛС
   Для печати Для печати