Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> класс, расположение атрибутов в памяти 
:(
    Опции темы
ccop
Дата 1.7.2009, 19:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.4.2008

Репутация: нет
Всего: нет



есть программа, у программы есть классы, исходника программы нет, надо определить структуру класса. Предположим программа уже запущенна и работает. С помощью ArtMoney можно узнать адреса отдельных атрибутов объекта класса.
вопрос: можно ли как-то узнать адреса других элементов?

не могу подобрать запрос в поисковике, что бы хоть что-то найти, поэтому буду рад за любую интересную инфу. спасибо!

Это сообщение отредактировал(а) ccop - 1.7.2009, 19:41
PM MAIL   Вверх
jonie
Дата 1.7.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



пробуйте в гугле волшебные слова: IDA, HIEW, OllyDBG, мозг, SoftICE, windbg,  assembler и идите по ссылкам. А это раздел про С\С++, и вам не сюда.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
ccop
Дата 1.7.2009, 20:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.4.2008

Репутация: нет
Всего: нет



jonie, спасибо, я создал в разделе С++, потому что нужно именно для С++, т.е. нужно учитывать спецификации С++, как, например, организована таблица виртуальных функций и т.п. Я думаю, здесь тоже что-то такое есть, типа: при создании объекта адреса всех атрибутов сохраняются в какой-то таблице. Или как у структуре, они создаются подряд...
PM MAIL   Вверх
andrew_121
Дата 1.7.2009, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(jonie @  1.7.2009,  20:02 Найти цитируемый пост)
мозг

Атжег! smile

Добавлено через 1 минуту и 10 секунд
Цитата(ccop @  1.7.2009,  20:48 Найти цитируемый пост)
Я думаю, здесь тоже что-то такое есть, типа

Да. Но это форум по написанию/созданию программ. А тебе нужно наоборот.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
GoldFinch
Дата 1.7.2009, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



артмани, лол
IDA+olly юзай

Добавлено через 4 минуты и 40 секунд
вкратце:

объекты - это обычные структуры данных, чтобы получить какое-то поле, надо к адресу объекта прибавить смещение поля smile
чтобы получить смещение - его надо гдето подсмотреть
PM MAIL ICQ   Вверх
ccop
Дата 1.7.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.4.2008

Репутация: нет
Всего: нет



Ребята, извините, что немного промахнулся с форумом, но задумка была вот такая:
мне надо написать программу на С++, которая бы "ловила" данные с памяти другой программы, т.е. просто дизассемблировать программу я думаю не получиться, я узнаю только структуру класса (и то если узнаю smile), а вот если 
Цитата
с помощью артмани узнать адрес одного атрибута, по адресу найти какую-то таблицу где храняться адреса на другие атрибуты объекта, то все было бы отлично
 - вариант, конечно мне кажется маловероятным, но поэтому я и спросил, что бы вы либо подтвердили это и сказали типа да оно так и работает, либо опровергли smile
Спасибо всем кто отписался  smile 
PM MAIL   Вверх
GoldFinch
Дата 1.7.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(ccop @  1.7.2009,  22:06 Найти цитируемый пост)
"ловила" данные с памяти другой программы

Я думаю, что данные ловят только юзвери, юзая проги типа артмани. 
Программисты ловят код. Для этого код дизассембилуется, ищутся места где производится доступ к необходимым переменным, и этот код перехватывается. 
Адрес переменной удобно "искать" если она в статической памяти. Если переменная в хипе или в стеке, ее можно найти только перехватив ее конструктор, или код ее создающий, или код ее использующий.
Да, для полиморфных объектов можно просканировать всю память, ища указатель на таблицу виртуальных методов (ВМТ) класса, который будет в начале искомого объекта, но это неоптимально.

PM MAIL ICQ   Вверх
ccop
Дата 1.7.2009, 21:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.4.2008

Репутация: нет
Всего: нет



GoldFinch, понял Вашу мысль, буду разбираться, спасибо!
PM MAIL   Вверх
DrHex
Дата 2.7.2009, 00:35 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 171
Регистрация: 2.5.2009

Репутация: нет
Всего: нет



Во первых вы говорите о декомпиляции, а декомпилировать С++ код практически не возможно....

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


Цитата

Да. Но это форум по написанию/созданию программ. А тебе нужно наоборот. 


На форуме обсуждаются вопросы связаные с С/С++, а для нормального понимания С++ требуется знаний что, где и как.


P.S.

ccop - можете не разбиратся, вы не решите эту проблему(может быть лет через 5 при глубоком изучению, но проблема будет уже устаревшой)..........
--------------------
google.com и это все.
PM MAIL   Вверх
GoldFinch
Дата 2.7.2009, 08:26 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Цитата(DrHex @  2.7.2009,  01:35 Найти цитируемый пост)
виртуальную память, декомпилировать

ты не знаешь о чем говоришь.
PM MAIL ICQ   Вверх
azesmcar
Дата 2.7.2009, 09:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  1.7.2009,  20:58 Найти цитируемый пост)
надо к адресу объекта прибавить смещение поля smile
чтобы получить смещение - его надо гдето подсмотреть 

Надо, только и про выравнивание структур не надо забывать.


Это сообщение отредактировал(а) azesmcar - 2.7.2009, 09:09
PM   Вверх
ccop
Дата 2.7.2009, 09:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 21.4.2008

Репутация: нет
Всего: нет



azesmcar, огромное спасибо за ссылку по теме! очень полезная информация.

другим, ваши ответы мне тоже помогли навести порядок в голове, некоторые моменты я уже понял, буду разбираться. Всем огромное спасибо, если будут еще интерессные ссылки по теме, пожалуйста, буду рад smile 

ЗЫ
Я новичек, но не такой как могло показаться smile, если надо, я разбирусь smile 
PM MAIL   Вверх
Lazin
Дата 2.7.2009, 09:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(azesmcar @  2.7.2009,  09:06 Найти цитируемый пост)
Надо, только и про выравнивание структур не надо забывать.

и про указатель на таблицу вирт. функций
PM MAIL Skype GTalk   Вверх
azesmcar
Дата 2.7.2009, 09:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(Lazin @  2.7.2009,  09:48 Найти цитируемый пост)
и про указатель на таблицу вирт. функций 

И про виртуальный базовый класс (если уж на то пошло) smile 
PM   Вверх
GoldFinch
Дата 2.7.2009, 10:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Lazin
azesmcar
какое выравнивание? какой указатель на ВМТ?
там будет 
Код

mov eax, someStruct
mov eax, [eax+Struct.x]

где Struct.x  - смещение нужного поля, например 0x3C
что находится вокруг этого поля - нас волновать не должно,

в коде это будет выглядеть
Код

struct Struct
{
  char stuff[0x3C];
  int x;
}


в ряде случаев можно будет написать просто 
int x=*(int*)((char*)ptr +0x3C);
без объявления структур

в конце концов код можно и из hex-rays скопировать

Это сообщение отредактировал(а) GoldFinch - 2.7.2009, 10:58
PM MAIL ICQ   Вверх
azesmcar
Дата 2.7.2009, 11:19 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  2.7.2009,  10:53 Найти цитируемый пост)

какое выравнивание? какой указатель на ВМТ?
там будет 

mov eax, someStruct
mov eax, [eax+Struct.x]

где Struct.x  - смещение нужного поля, например 0x3C


а смещение тебе наверное компилятор в комментариях сгенерированного бинарного кода напишет, так? Окуда ты это магическое число взял?
Тебя не должно волновать то, что тип который должен занимать 1 байт, занимает 4 к примеру? Оффсеты как считать будешь? А то что вместо объекта в памяти лежит указатель на него (речь о виртуальном базовом классе) тебя тоже не волнует? Или то что по указателю объекта mystruct

Код

struct mystruct
{
   int q;
   int v;
   char c;
   virtual ~mystruct() {};
}

лежит не int q, а указатель на vtable. Это все конечно не важно, ведь у нас есть магическое число 0x3C, которое решает все проблемы.
PM   Вверх
GoldFinch
Дата 2.7.2009, 11:28 (ссылка)    | (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



azesmcar, ты тоже не знаешь о чем говориш.
PM MAIL ICQ   Вверх
azesmcar
Дата 2.7.2009, 11:30 (ссылка)    | (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


uploading...
****


Профиль
Группа: Участник Клуба
Сообщений: 6291
Регистрация: 12.11.2004
Где: Армения

Репутация: 81
Всего: 211



Цитата(GoldFinch @  2.7.2009,  11:28 Найти цитируемый пост)
azesmcar, ты тоже не знаешь о чем говориш. 

гениальный ответ, впрочем большего я и не ожидал.
 smile 
тут один ты все знаешь.
ты хоть прочитал написанное? Это риторический вопрос, можешь не отвечать.


Это сообщение отредактировал(а) azesmcar - 2.7.2009, 11:31
PM   Вверх
Lazin
Дата 2.7.2009, 11:40 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(GoldFinch @  1.7.2009,  21:17 Найти цитируемый пост)
Да, для полиморфных объектов можно просканировать всю память, ища указатель на таблицу виртуальных методов (ВМТ) класса, который будет в начале искомого объекта, но это неоптимально.


Цитата(GoldFinch @  2.7.2009,  10:53 Найти цитируемый пост)
какое выравнивание? какой указатель на ВМТ?


то о котором ты говорил smile 
PM MAIL Skype GTalk   Вверх
jonie
Дата 2.7.2009, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



а есть еще оптимизация,  и там можгут быть совввсем другие выкрутасы с vtable  в том числе.  Тем более что с vtable все тоже сложно (пример: http://www.rsdn.ru/article/cpp/fastdelegate.xml)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
GoldFinch
Дата 2.7.2009, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



azesmcar, берем прогу
Код

#include <iostream>

class Foo
{
public:
    virtual void print() = 0;
    virtual ~Foo() {};
};

class Foo1 : public Foo
{
public:
    Foo1(int x);
    void print();
    ~Foo1();
private:
    int* x_;
};

Foo1::Foo1(int x):x_(new int(x)){}
void Foo1::print() {std::cout<<"x="<<*x_<<std::endl;}
Foo1::~Foo1() {delete x_;}

void test(Foo* foo)
{
    foo->print();
}

int main()
{
    int x;
    std::cin>>x;

    Foo* foo=new Foo1(x);
    test(foo);
    delete foo;

    return 0;
}

компилим в релизе без отладочной информации
грузим в IDA, ищем "x=", находим Foo1::print()
в начале которого видим
Код

Foo1__print proc near
push    ebp
mov     ebp, esp
and     esp, 0FFFFFFF8h
mov     eax, [ecx+4]  ; eax=x_ (ecx == this) 
mov     ecx, [eax]  ; ecx=*x_
push    esi
push    edi
push    ecx
push    ecx
call    sub_406900 ; some_crt_print(ecx)
add     esp, 4 ;1 argument

откуда мы получаем что смещение x_ равно 0x4
и можем восстановить код
Код

struct Foo1
{
char stuff[4];
int* x;
}

PM MAIL ICQ   Вверх
Lazin
Дата 2.7.2009, 12:53 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



поздравляю, ты нашел указатель на VMT!
осталось сделать чуть менее тривиальный пример, что-бы посмотреть как выравниваются члены класса в памяти smile 

Цитата(azesmcar @  2.7.2009,  11:19 Найти цитируемый пост)
Окуда ты это магическое число взял?
Тебя не должно волновать то, что тип который должен занимать 1 байт, занимает 4 к примеру? Оффсеты как считать будешь?

из дизассемблированого кода вестимо, видимо к этому ответу относился комментарий:
Цитата(GoldFinch @  2.7.2009,  11:28 Найти цитируемый пост)
azesmcar, ты тоже не знаешь о чем говориш
 xD ты забыл мягкий знак!

PM MAIL Skype GTalk   Вверх
GoldFinch
Дата 2.7.2009, 13:23 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

Репутация: 15
Всего: 26



Lazin, при реверсировании мне совершенно без разницы, выравнивание там, или просто поле которое не используется
в обоих случаях я пишу "char stuff_xx[delta];" 
если я не собираюсь пользоваться указателем на вмт - он stuff, если собираюсь, он int*, то же можно сказать и о других полях

Это сообщение отредактировал(а) GoldFinch - 2.7.2009, 13:35
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1073 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.