Сейчас на форуме: vsv1 (+5 невидимых)

 eXeL@B —› Вопросы новичков —› Как использовать класс в fastcall при инжекте
Посл.ответ Сообщение

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

Создано: 12 февраля 2016 21:53 · Поправил: bolvai
· Личное сообщение · #1

Возможно ли при инжекте/Хукинге заместо простой функции - использовать полноценный класс.
На данный момент по старинке делаю так -



Code:
  1. typedef int(__fastcall *LoadPack ) ();
  2. LoadPack hLoadPack= nullptr;
  3. int __fastcall LoadPack_hooked(void * _this,int edx)
  4. {
  5. ((LoadPack )trampoline)();
  6. }

Code:
  1. int LoadObj;
  2. LoadObj = 0x1011110;
  3. Hook::HookFunctionWithTrampoline(reinterpret_cast<unsigned char*>(LoadObj ), reinterpret_cast<unsigned char*>

Проблема в том что в этом загрузчике есть особый класс TArray, который получает синхронизированные данные из 1 места в другое.
Выглядит это таким образом
Code:
  1. Class Linker
  2. {
  3.          TArray<FName>    NameMap;
  4.          TArray<FObjectI> ImportMap;
  5.          TArray<FObjectE> ExportMap;
  6. };

А Используется таким образом:
Code:
  1. LinkerLoad::LinkerLoad() //LinkerLoad наследуется от Linker class
  2. {
  3.                         FNameEntry NameEntry;
  4.                         *this << NameEntry; Тут собственно читаются сами данные с HDD,
  5.                          NameMap.AddItem(NameEntry.Name)
  6.                  А тут тот самый проблематичный массив который синхронизируется с другой частью загрузки
  7.                     Таким образом:
  8.                        FObjectImport*        Import = new(ImportMap) FObjectImport; //ImportMap выше в Linker
  9.                        *this << Import;
  10.                        FObjectImport& ImportM = ImportMap(i);
  11.                        wsprintfA( buffer,  "objName:%s" , *MyImport.ObjectName);
  12.                        MessageBoxA(0,buffer,"name Output",MB_OK);
  13. }

Достаточно просто указателя *MyImport.
Чтобы другой обработчик FName::FName вернул по значению индекса - строку.
Code:
  1. FName::FName( const TCHAR* Name, EFindName FindType )
  2. {
  3.  
  4.          INT iHash = appStrihash(Name) & (ARRAY_COUNT(NameHash)-1);
  5.          for( FNameEntry* Hash=NameHash[iHash]; Hash; Hash=Hash->HashNext )
  6.          {
  7.                  if( appStricmp( Name, Hash->Name )==0 )
  8.                  {
  9.                  
  10.                         Index = Hash->Index;
  11.  
  12.          
  13.                         if( FindType==FNAME_Intrinsic )
  14.                         Names(Index)->Flags |= RF_Native;
  15.                         return;
  16.                  }
  17.          }
  18.          Index = Names.Add();
  19.  
  20.          Names(Index) = NameHash[iHash] = AllocateNameEntry( Name, Index, 0, NameHash[iHash] );
  21. }


Но и вся проблема как раз заключается в том что там идет синхронизация массива ибо все операции в 1ом классе, а я принимаю этот класс как Функцию, и мне приходиться объявлять массивы за пределами функции, и данные попросту не хотят добавляться в массив.
Как это возможно решить ?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 февраля 2016 22:40
· Личное сообщение · #2

нихрена непонятно



Ранг: 488.1 (мудрец), 272thx
Активность: 0.350
Статус: Участник

Создано: 12 февраля 2016 22:48
· Личное сообщение · #3

bolvai вопрос.. причем тут fastcall ? вы книжки читать пробовали? или гуглить? ТИП вызова, это всего лишь способ передачи параметров. т.е способ связи ..т.е. то КАК компиль должен сформировать данные.. инжект.. ну это внедрение в чужой процесс.. на чем он сделан? какой способ параметров там? вы пытаетесь написать код не считаясь с исходными данными?

Добавлено спустя 4 минуты
ЗЫ. т.е способ вызова процедуры.. это только лишь описание, как будут передаваться аргументы. через регистры, через стек, в прямом или обратном порядке.. ВСЕ! если у вас косяк... проверьте в дебагере че вы там насовали

-----
Наша работа во тьме, Мы делаем, что умеем. Мы отдаем, что имеем, Наша работа во тьме....


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

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

Создано: 12 февраля 2016 23:27 · Поправил: bolvai
· Личное сообщение · #4

reversecode пишет:
нихрена непонятно

Извиняюсь уж очень задолбался весь день с этой фигней, перепробовал ничего не помогает, не знаю еще как описывать вам.
VodoleY пишет:
вопрос.. причем тут fastcall ? вы книжки читать пробовали? или гуглить? ТИП вызова, это всего лишь способ передачи параметров. т.е способ связи ..т.е

На счет типа вызова, я ведь не могу использовать Fastcall,Stdcall поверх класса(я это имел ввиду ибо нужно обозначать тип вызова если я делаю инжект), метод у меня там Trampoline(Detoor),второй параметр это функция.
VodoleY пишет:
ВСЕ! если у вас косяк... проверьте в дебагере че вы там насовали

Да у меня косяк при добавлении в массив TArray<FName> NameMap;
NameMap.AddItem(NameEntry.Name); Критует, причем с любыми параметрами, толи оператора не хватает толи чего ?
Нельзя ли как то сделать проверку Catch trow ? Ибо ошибка в самом приложение(к которому инжект идет) совсем другая(точнее общая, не указывает она что конкретно не так).




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 12 февраля 2016 23:36
· Личное сообщение · #5

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



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

Создано: 13 февраля 2016 00:18
· Личное сообщение · #6

reversecode пишет:
плюсы нужно знать, что бы не плутать

Я пытаюсь учить плюсы на конкретных задачах, а не напирать на весь объем который там описан в книгах, вы же даже не сказали что тут конкретно подучить надо - да и тут проблема в том что я не очень понимаю возможно ли использовать Class в качестве представления для инжекта или нет (т.е такое работает только с функциями) ?




Ранг: 1053.6 (!!!!), 1078thx
Активность: 1.060.81
Статус: Участник

Создано: 13 февраля 2016 00:23 · Поправил: reversecode
· Личное сообщение · #7

нет ничего невозможного (с)

я из ваших объяснений, нифига не понял




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 13 февраля 2016 10:00
· Личное сообщение · #8

bolvai пишет:
а не напирать на весь объем который там описан в книгах


именно с этого и надо начинать что бы не плодить говнокод



Ранг: 33.8 (посетитель), 11thx
Активность: 0.020.01
Статус: Участник

Создано: 13 февраля 2016 16:52
· Личное сообщение · #9

Опять дети бота для Lineage2 пишут.
По приведенным именам кода это видно.
А fastcall у них, т.к. никто им не объяснил что у классов C++ другое соглашение о вызове ф-ий


 eXeL@B —› Вопросы новичков —› Как использовать класс в fastcall при инжекте
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати