Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
headcrab
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 19
#1

Глобальная переменная из другой dll - C++

24.03.2013, 03:19. Просмотров 498. Ответов 9
Метки нет (Все метки)

Имеется сторонняя dll без исходников. Мне нужно в своей программе получить значение глобальной переменной из той длл.
Через IDA нашел, как она используется:
mov eax, dword_21C
в .data секции той dll по оффсету 0x21C находится нужная переменная. Найти и прочитать из памяти этот оффсет для меня не проблема. Как теперь в своей программе получить значение той переменной?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.03.2013, 03:19
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Глобальная переменная из другой dll (C++):

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз - C++
Исходники: /* main.cpp */ #include "hider.h" int main(void) { return 0; } /* foo.cpp */

Глобальная переменная - C++
Надо сделать глобальную переменную которая будет видна во всех файлах .cpp Непонятно где ее нужно инициализировать и присваивать...

Глобальная переменная - C++
Никогда с таким не сталкивался... В общем: Надо обьявить глобальный масив в одной функции, но чтобы его видели все другие функции. Вне...

Глобальная переменная - C++
Есть двумерный символьный массив ClusterBuf объявленный глобально. В него,в ходе выполнения программы, будет считываться содержимое...

Глобальная переменная - C++
#include "stdafx.h" #include "locale" #include "iostream" #include "conio.h" using namespace::std; int count = -1; void swap();...

Глобальная переменная в OpenCL - C++
Всем привет! Кто может подсказать как правильно создать глобальную переменную в OpenCL? unsigned char *globalVariable; __kernel...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.03.2013, 10:56 #2
Цитата Сообщение от headcrab Посмотреть сообщение
Найти и прочитать из памяти этот оффсет для меня не проблема.
Расскажете как?
headcrab
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 19
25.03.2013, 12:50  [ТС] #3
Цитата Сообщение от Tulosba Посмотреть сообщение
Расскажете как?
Там все просто оказалось, это я затупил. Пример:

Находим через IDA участок кода, где используется нужная переменная:
Код
8B 0D 34 2F E7 01               mov     ecx, dword_1E72F34
Где 34 2F E7 01 - это адрес, который нужно прочитать. Нам нужно найти в памяти загруженной библиотеки адрес первого байта (34). Это либо по сигнатуре, либо по смещению в нужной длл. Я делал по сигнатуре, чтобы при каждом обновлении заново не искать ничего. Нужная мне переменная была типа int*
Код
void* address // это найденный в dll адрес, по которому находится адрес нужной переменной
unsigned long var_addr = *( unsigned long *)( address ); // читаем оттуда адрес глобальной переменной
int* my_var = *( int **)( var_addr ); // по адресу глобальной переменной читаем значение типа int*
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.03.2013, 14:12 #4
Т.е. известен адрес, по которому записан адрес, по которому записан (int*)?
headcrab
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 19
25.03.2013, 16:58  [ТС] #5
Верно.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.03.2013, 17:06 #6
Тогда почему бы не использовать просто:
C++
1
int* my_var = *(int**)address;
?
headcrab
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 19
25.03.2013, 17:19  [ТС] #7
По адресу address находится не нужная переменная, а её адрес, используемый в инструкции mov. А уже по нему мы найдем саму переменную.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.03.2013, 17:33 #8
Прошу прощение, промахнулся. Вот так тогда:
C++
1
int* my_var = **(int***)a;
headcrab
0 / 0 / 0
Регистрация: 24.03.2013
Сообщений: 19
25.03.2013, 17:39  [ТС] #9
Так можно. В моем примере просто более понятно расписано. И там не обязательно int* же, можно и любую другую переменную найти.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
25.03.2013, 17:54 #10
Не спорю. Просто баланс между компактностью кода и его понятностью штука довольно сложная
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2013, 17:54
Привет! Вот еще темы с ответами:

Динамический массив как глобальная переменная - C++
Доброго времени суток, даже с google никак не смогу разобраться со следующей задачей: Хочу объявить матрицу(matrix допустим) глобальной...

Не определяется глобальная переменная внутри функции - C++
Доброго времени суток! Передо мной стоит задача: Задано множество точек М в трехмерном пространстве. Найти такую из них, что шар...

Глобальная переменная не читается в новом потоке - C++
подскажите пожалуйста, у меня есть помимо главного еще 2 потока и есть глобально объявленный массив, заполняю я его в первом потоке, там же...

Глобальная переменная для хранения вещественных чисел - C++
Объявите одну глобальную переменную для хранения вещественных чисел объемом 8 байт на платморфе х86 инициализируйте ее ненулевым значением...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
25.03.2013, 17:54
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru