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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> присвоить указатель на метод 
:(
    Опции темы
GoldFinch
Дата 9.12.2008, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



есть int который лежит в модуле "Mod" по rva 123
сначала я хочу присвоить ему указатель на функцию 
void foo_bar_hook() { ... }
пишу 
HMODULE hMod = GetModuleHandleA("Mod");
*(int*)((int)hMod+123)=(int)&foo_bar_hook;
и все работает ОК

но вот захотелось мне вместо функции использовать метод
class foo {...};
void foo::bar_hook() { ... }
пишу 
*(int*)((int)hMod+123)=(int)&foo::bar_hook;
и компилятор выдает ошибку что не может преобразовать void(foo::*)() к int

как присвоить этому int'у указатель на метод?

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


любитель
****


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

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



Цитата(GoldFinch @  9.12.2008,  15:18 Найти цитируемый пост)
и компилятор выдает ошибку что не может преобразовать void(foo::*)() к in

и правильно делает.. Вот я  в который раз удивляюсь, почему Вы выбрали C++, когда не используйте его инструментов, и который в ответ лишний раз Вам ограничивает свободу.

преобразовать можно так :
Код

    union
    {
        void (foo::*f)() 
        size_t  i;
    } u;

    u.f = &foo_bar_hook;
  
   size_t i = u.i;

но всю ответственность за дальнейшее использование и обратное преобразование компилятор перекладывает на Вас.


Это сообщение отредактировал(а) mes - 9.12.2008, 15:46


--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 9.12.2008, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



mes, а в одну строчку это както уместить можно? 
а то с функцией я юзал дефайн, было очень удобно:
#define HOOK_PTR(rva,hook) *(int*)((int)hMod+rva)=(int)&hook;
...

HOOK_PTR(111,Func1_hook)
HOOK_PTR(222,Func1_hook)
HOOK_PTR(333,Func1_hook)
...


а C++ я использую по вынужденным причинам, так юзал бы фасм и радовался жизни, вместо этого приходится бороться с конпелятором =\
PM MAIL ICQ   Вверх
Kallikanzarid
Дата 9.12.2008, 15:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Можно юнион обернуть в класс.
PM MAIL   Вверх
mes
Дата 9.12.2008, 16:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(GoldFinch @  9.12.2008,  15:51 Найти цитируемый пост)
а в одну строчку это както уместить можно? 

если обернуть в шаблон , вот код вместе с тестовым использованием 
Код


#include <iostream>
class A
{
    public:
        void f () { std::cout << "test " << std::endl; };
};


template <class R, class F> R my_cast (F f)
{
  union
  {
        F f;
        R r;
  }   u;

  u.f =f;

  return  u.r;
};

int main()
{

 size_t i = my_cast<size_t> (&A::f); // сохранили

 void (A::*f)() = my_cast<void (A::*)()> (i); // востанавили

 A a; (a.*f)();   // пороверили

  system("pause");
  return 0;
}




--------------------
PM MAIL WWW   Вверх
GoldFinch
Дата 9.12.2008, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


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

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



нда.... всеже 
#define HOOK_PTR(rva,hook) __asm mov [eax+rva],offset hook
...

GetModuleHandleA("Mod");
HOOK_PTR(111,Func1_hook)
HOOK_PTR(222,Func1_hook)
HOOK_PTR(333,Func1_hook)
...

малость покороче и понятнее будет
PM MAIL ICQ   Вверх
UnrealMan
Дата 9.12.2008, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  9.12.2008,  15:45 Найти цитируемый пост)
Вот я  в который раз удивляюсь, почему Вы выбрали C++, когда не используйте его инструментов, и который в ответ лишний раз Вам ограничивает свободу.

преобразовать можно так :

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

Цитата(mes @ 9.12.2008,  16:11)
Код
#include <iostream>
class A
{
    public:
        void f () { std::cout << "test " << std::endl; };
};


template <class R, class F> R my_cast (F f)
{
  union
  {
        F f;
        R r;
  }   u;

  u.f =f;

  return  u.r;
};

int main()
{

 size_t i = my_cast<size_t> (&A::f); // сохранили

 void (A::*f)() = my_cast<void (A::*)()> (i); // востанавили

 A a; (a.*f)();   // пороверили

  system("pause");
  return 0;
}

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

Это сообщение отредактировал(а) UnrealMan - 9.12.2008, 17:56
PM MAIL   Вверх
mes
Дата 9.12.2008, 19:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(UnrealMan @  9.12.2008,  17:50 Найти цитируемый пост)
ты допустил довольно грубую ошибку,

какую ?  с учетом того, что
my_cast - преобразователь по битовому представлению без контроля компилятора на тип и размер, т.е. под ответственность программиста. 

Цитата(mes @  9.12.2008,  15:45 Найти цитируемый пост)
но всю ответственность за дальнейшее использование и обратное преобразование компилятор перекладывает на Вас.



Это сообщение отредактировал(а) mes - 9.12.2008, 19:39


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 9.12.2008, 20:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



mes, при разной длине типов при преобразовании из короткого в длинное будет мусор в оставшихся битах

Это сообщение отредактировал(а) J0ker - 9.12.2008, 20:06


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 9.12.2008, 20:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(J0ker @  9.12.2008,  20:06 Найти цитируемый пост)
mes, при разной длине типов при преобразовании из короткого в длинное будет мусор в оставшихся битах

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

Это сообщение отредактировал(а) mes - 9.12.2008, 20:36


--------------------
PM MAIL WWW   Вверх
J0ker
Дата 9.12.2008, 20:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  9.12.2008,  20:35 Найти цитируемый пост)
но при обратном в то же самое из чего было преобразовано этот мусор не зацепится..

пардон, тогда зачем эта хрень вообще нужна?  smile 
обнулять нужно обязательно

Это сообщение отредактировал(а) J0ker - 9.12.2008, 20:53


--------------------
user posted image
PM MAIL   Вверх
mes
Дата 9.12.2008, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



добавил обнуление и  проверку по размеру, чтоб длина результативной переменной была не меньше  (можно поставить == ) исходной.
Код

#define STATIC_CHECK( expr ) { char unnamed[ (expr) ? 1 : 0 ]; }

template <class R, class F> R my_cast (F f)
{
  STATIC_CHECK ( sizeof(R)>=sizeof(F) );

  union
  {
        F f;
        R r;
  }   u;

  memset (&u, 0, sizeof (u));

  u.f =f;

  return  u.r;
};





--------------------
PM MAIL WWW   Вверх
J0ker
Дата 9.12.2008, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



memset тоже можно запихать в какой-нить дефайн который включается только если конечный тип больше исходного


--------------------
user posted image
PM MAIL   Вверх
UnrealMan
Дата 9.12.2008, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(mes @  9.12.2008,  19:33 Найти цитируемый пост)
my_cast - преобразователь по битовому представлению без контроля компилятора на тип и размер, т.е. под ответственность программиста. 

Т.е. твою ответственность - ты же этот способ предложил smile 

Цитата(mes @  9.12.2008,  20:58 Найти цитируемый пост)
проверку по размеру, чтоб длина результативной переменной была не меньше  (можно поставить == ) исходной

Это для того, чтобы получился этакий облагороженный грязный хак, не работающий на большинстве машин? smile 
PM MAIL   Вверх
mes
Дата 9.12.2008, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(UnrealMan @  9.12.2008,  21:37 Найти цитируемый пост)
Это для того, чтобы получился этакий облагороженный грязный хак, не работающий на большинстве машин? smile  

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

Цитата(UnrealMan @  9.12.2008,  21:37 Найти цитируемый пост)
Т.е. твою ответственность - ты же этот способ предложил smile 

согласен.. и стараюсь исправить недоделки, которые незаметил . 

Это сообщение отредактировал(а) mes - 9.12.2008, 21:47


--------------------
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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