Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Описание прототипа функции

71K
20 августа 2012 года
drayvhard
17 / / 26.01.2012
Здравствуйте! Вот у меня есть программа (exe.exe), используя ida я "выудил" список всех функций, которые ею экспортируются. Например. мне нужна функция IS_CONNECTED. Смотрю её псевдокод:

 
Код:
double __cdecl IS_CONNECTED(int a1)
{
  *(double *)a1 = (double)bEnable;
  return *(double *)a1;
}
Я вижу, что эта функция возвращает значение переменной, которая идеализируется во время запуска программы. Ок, запускаю программу, и описываю в C# прототип:

 
Код:
[DllImport("exe.exe")]
public static extern double IS_CONNECTED(int a1);
вызываю ее - и следующая ошибка:
Цитата:
Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.


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

277
21 августа 2012 года
arrjj
1.7K / / 26.01.2011
Ды хз... у меня всё работает...
Прикрепленные файлы:
7 Кб
Загрузок: 672
14 Кб
Загрузок: 720
277
20 августа 2012 года
arrjj
1.7K / / 26.01.2011
AFAIK ты не можешь exe импортировать - половина переменных инициализируется при запуске проги, чего не произойдет при LoadLibrary
71K
20 августа 2012 года
drayvhard
17 / / 26.01.2012
Цитата: arrjj
AFAIK ты не можешь exe импортировать - половина переменных инициализируется при запуске проги, чего не произойдет при LoadLibrary


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

277
20 августа 2012 года
arrjj
1.7K / / 26.01.2011
1) отформатируем немного функцию:
 
Код:
double __cdecl IS_CONNECTED(int a1)
{
  *(double *)a1 = (double)bEnable;
  return *(double *)a1;
}
Приведем к виду:
 
Код:
double __cdecl IS_CONNECTED(double* a1)
{
  *a1 = (double)bEnable;
  return *a1;
}
Пробуй с таким прототипом
2) Вообще вроде эта ошибка говорит что с прототипом чтото не то. Я б для начала не мешал managed/unmanaged, а сделал бы работоспособный пример на плюсах
3) Если ничего не поможет - попробуй через CreateRemoteThread
71K
21 августа 2012 года
drayvhard
17 / / 26.01.2012
Цитата: arrjj
1) отформатируем немного функцию:
 
Код:
double __cdecl IS_CONNECTED(int a1)
{
  *(double *)a1 = (double)bEnable;
  return *(double *)a1;
}
Приведем к виду:
 
Код:
double __cdecl IS_CONNECTED(double* a1)
{
  *a1 = (double)bEnable;
  return *a1;
}
Пробуй с таким прототипом
2) Вообще вроде эта ошибка говорит что с прототипом чтото не то. Я б для начала не мешал managed/unmanaged, а сделал бы работоспособный пример на плюсах
3) Если ничего не поможет - попробуй через CreateRemoteThread



тогда на c++ прототип будет такой?

 
Код:
typedef double (*IS_CONNECTED)(double *);
собственно и вызов:


 
Код:
IS_CONNECTED func = (IS_CONNECTED)GetProcAdress(hMod,"IS_CONNECTED");

double x =0;
double s = func(&x);
если так, то указатель на функцию не NULL, но таким образом ошибка с памятью

как тогда нужно объявить прототип?
277
21 августа 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: drayvhard

если так, то указатель на функцию не NULL, но таким образом ошибка с памятью


По какому адресу? Эм... а вообще неплохо было бы посмотреть на всё это в живую, а то пишем код по фотографии.

71K
21 августа 2012 года
drayvhard
17 / / 26.01.2012
Цитата: arrjj
Цитата: drayvhard

если так, то указатель на функцию не NULL, но таким образом ошибка с памятью


По какому адресу? Эм... а вообще неплохо было бы посмотреть на всё это в живую, а то пишем код по фотографии.



Исключение по адресу 0x00C5E6B6
"нарушение прав доступа при чтении по адресу 0х007CD40C"

Нужно выложить исходники + программу, к которой я хочу получить доступ?

277
21 августа 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: drayvhard

Исключение по адресу 0x00C5E6B6
"нарушение прав доступа при чтении по адресу 0х007CD40C"

Нужно выложить исходники + программу, к которой я хочу получить доступ?


1) Адрес исключения (0x00C5E6B6) назодится в функции IS_CONNECTED?
2) Адрес 0х007CD40C указывает на что? (a1/a1* или bEnable или в никуда?)
3) Хотелось бы,... можно еще с ida базу сохраненную

71K
21 августа 2012 года
drayvhard
17 / / 26.01.2012
0х007CD40C на bEnable
0x00C5E6B6 - да в функции

скину, только позже. там овер 300 мб, а нет слабенький.

вот сама программа ССИЛКА

то есть переменная не инициализирована? Само приложение запущено... Не понимаю... Эта функция имеет такое же название, как и функция в скриптовом языке, какой используется в этой программе... Я ставил бряк на этой функции, вызывал ее через скриптовый язык... Всё было нормально.. Функция возвращала без проблем значение (я привожу пример на этой функции, потому что она самая простая среди других экспортируемых).. Можно как то синтетически вызвать эту функцию?

может нужно особое внедрение?
71K
21 августа 2012 года
drayvhard
17 / / 26.01.2012
Даже если и переменная не инициализирована, то с другими функциями такая сама беда. Вот возьмем к примеру функцию ABS:
псевдокод:

Код:
double __cdecl ABS(int a1, int a2)
{
  if ( *(double *)a2 < 0.0 )
  {
    *(double *)a1 = -1.0 * *(double *)a2;
  }
  else
  {
    *(_DWORD *)a1 = *(_DWORD *)a2;
    *(_DWORD *)(a1 + 4) = *(_DWORD *)(a2 + 4);
  }
  return *(double *)a1;
}
упрощаем:

Код:
double __cdecl ABS(double *a1, double *a2)
{
  if ( *a2 < 0.0 )
  {
    *a1 = -1.0 * *a2;
  }
  else
  {
    *a1 = *a2;
    *(a1 + 4) = *(a2 + 4);
  }
  return *a1;
}
так само описываем прототип - и снова ошибка с памятью... 0х00742A78 - вообще не понятно куда кидает. Может после вызова не постановляется стэк?
277
21 августа 2012 года
arrjj
1.7K / / 26.01.2011
попозже гляну, ща винды нет под рукой
71K
22 августа 2012 года
drayvhard
17 / / 26.01.2012
Цитата: arrjj
Ды хз... у меня всё работает...


Превосходно! У меня Ваш пример тоже работает! Спасибо большое.
ПС: может проблема в том, что у меня 64б винда была? Сейчас на 32 всё нормально!

277
22 августа 2012 года
arrjj
1.7K / / 26.01.2011
Цитата: drayvhard
ПС: может проблема в том, что у меня 64б винда была? Сейчас на 32 всё нормально!


Может быть, но врядли... может параметры какиенить не те для функций указывал, может собрал x64 инжектор а не 32... может просто звёзды так сошлись :D

71K
22 августа 2012 года
drayvhard
17 / / 26.01.2012
Цитата: arrjj
Цитата: drayvhard
ПС: может проблема в том, что у меня 64б винда была? Сейчас на 32 всё нормально!


Может быть, но врядли... может параметры какиенить не те для функций указывал, может собрал x64 инжектор а не 32... может просто звёзды так сошлись :D


Ясно. Спасибо большое! Очень выручил!

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог