Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 05.10.2012, 19:50   #1
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию Функции из таблицы экспортов PE

Здравствуйте, уважаемые.

Сразу оговорюсь, что пишу на дэльфи, но по воле случая и необходимости пришлось обратиться в этот раздел за помощью.

Итак, суть проблемы:
Есть некая библиотека.
У неё есть громадная таблица экспортов PE.
Все экспорты имеют такой формат (отрывок, их несколько тысяч):
Цитата:
0x2012 0x003D0BE0 "?ReplyGameGuardQuery@UNetworkHandl er@@UAEXKKKKW4GAMEGUARD_CHECK_TYPE@ @@Z"
0x2163 0x003D4CE0 "?ResponseAuthGameGuard@UNetworkHan dler@@UAEHXZ"
Программа сетевая, и я вычислил, что это функции обработки некоторых пакетов. Формат соответствующих пакетов, или всю таблицу экспорта я могу предоставить.

Теперь вопрос.
Правильно ли я понимаю, что значения "QAEXKKKKH" это представления аргументов, передаваемых в функцию?
Есть ли информация по этому формату?

Для примера:
Формат записи в пакет "GameGuardQuery":
Код:
	public void writeImpl(){
		writeC(0x74);
		writeD(0x27533DD9);
		writeD(0x2E72A51D);
		writeD(0x2017038B);
		writeD(0xC35B1EA3);
	}
Чтение пакета "AuthGameGuard":
Код:
	protected boolean readImpl(){
		if (super._buf.remaining() >= 20){
			_sessionId = readD();
			_data1 = readD();
			_data2 = readD();
			_data3 = readD();
			_data4 = readD();
			return true;
		}
		return false;
	}
Помогите разобраться с этим, требуется хукать вызовы этих функций, и подменять аргументы (не вирус).
С хуком я справлюсь как-нибудь, а вот с формат входящих аргументов победить не могу.
Буду очень благодарен за любую помощь!


PS: Да, вот ещё. Нашел один похожий пример, но он под старую версию клиента. Экспортируется функция по-другому. Да и нужна другая функция.
Код:
 ReplyGameGuardQuery = '?ReplyGameGuardQuery@UNetworkHandler@@UAEXKKKK@Z';
procedure GGReplay; cdecl;
asm
  push esp
  push ecx
  call CheckEnv
  pop ecx
  pop esp
  mov eax,[ecx+048h]
  mov ecx,[eax]
  mov  edx, [PacketHdr]
  push edx
  mov  edx, [PK1]
  push edx
  mov  edx, [PK2]
  push edx
  mov  edx, [ID]
  push edx
  push $CA
  push cdddd
  push eax
  mov  eax, [ecx+068h]
  call eax
  add esp,$1c
  ret $10
end;


begin
   DllHandle := GetModuleHandle('engine.dll');
   if DllHandle <> 0 then begin

    ReplyGameGuardQueryAddr := GetProcAddress(DllHandle,ReplyGameGuardQuery);
    if NOT assigned(ReplyGameGuardQueryAddr) then exit;
    if VirtualProtectEx(GetCurrentProcess,ReplyGameGuardQueryAddr,10,PAGE_EXECUTE_READWRITE,Offset) then begin
     ReplyGameGuardQueryAddr^ := $E9;
     Offset := Dword(@GGReplay)-DWord(ReplyGameGuardQueryAddr)-5;
     move(Offset,Pointer(DWord(ReplyGameGuardQueryAddr)+1)^,sizeof(Offset));

    end;
    DisableThreadLibraryCalls(GetModuleHandle(nil));
   end;

end;
Разумеется, код на дэльфи, но он не такой уж сложный. Вникать нет смысла, главное логика.

PK1,PK2,ID, PakcetHdr определяются в процедуре CheckEnv
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 05.10.2012 в 19:57.
Johnson вне форума Ответить с цитированием
Старый 05.10.2012, 21:00   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Это не просто функции а методы класса...
Надо узнать каким компилятором сделан DLL и искат demangler для этого компилятора. Почитайте на досуге, описаны разные компиляторы - http://en.wikipedia.org/wiki/Name_mangling
waleri вне форума Ответить с цитированием
Старый 05.10.2012, 22:33   #3
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

На MSVC написана либа и всё приложение в целом.
По критическим ошибкам определил.
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 05.10.2012, 22:50   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Вместе MSVC утилита была, вроде undname.exe называлась, которая умела преобразовывать декорированные имена к человекочитаемым.
netrino вне форума Ответить с цитированием
Старый 05.10.2012, 22:55   #5
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Не могли бы вы её скинуть, качать весь msvc нет возможности сейчас...
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 05.10.2012, 23:19   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

К сожалению, у меня сейчас нет под рукой компьютера с виндовс и мсвц. Быть может есть смысл поискать в интернете, наверняка кто-то уже выкладывал
netrino вне форума Ответить с цитированием
Старый 05.10.2012, 23:48   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Напишите сами, на Delphi, используя вот это:
http://msdn.microsoft.com/en-us/libr...8VS.85%29.aspx
waleri вне форума Ответить с цитированием
Старый 06.10.2012, 08:30   #8
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Спасибо большое, сделал.
Мало ли, кому пригодится в дальнейшем, исход и скомпилированный файл в аттаче.
Вложения
Тип файла: rar undName.rar (177.8 Кб, 10 просмотров)
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}
Johnson вне форума Ответить с цитированием
Старый 06.10.2012, 08:41   #9
Johnson
кривокодер ;)
Форумчанин
 
Аватар для Johnson
 
Регистрация: 20.06.2008
Сообщений: 707
По умолчанию

Так-с. Имя-то андекорировал, а толку?
Оно использует _thiscall. Из дэльфи можно только заглушкой asm вызвать...
Кто-нибудь поможе заглушку написать, чтоб сплайсингом на нее можно было управление передать?

Вызывалось под старую версию клиента так:
Цитата:
public: virtual void __thiscall UNetworkHandler::ReplyGameGuardQuer y(unsigned long,unsigned long,unsigned long,unsigned long)
Использовалась заглушка:
Код:
procedure GGReplay; cdecl;
asm
  push esp
  push ecx
  call CheckEnv
  pop ecx
  pop esp
  mov eax,[ecx+048h]
  mov ecx,[eax]
  mov  edx, [PacketHdr]
  push edx
  mov  edx, [PK1]
  push edx
  mov  edx, [PK2]
  push edx
  mov  edx, [ID]
  push edx
  push $CA
  push cdddd
  push eax
  mov  eax, [ecx+068h]
  call eax
  add esp,$1c
  ret $10
end;
Теперь, в новом клиенте оно вызывается так:
Цитата:
public: virtual void __thiscall UNetworkHandler::ReplyGameGuardQuer y(unsigned long,unsigned long,unsigned long,unsigned long,enum GAMEGUARD_CHECK_TYPE)
Помогите переписать код заглушки на новый вызов?
"А как написать праграму?, "ришыти задачьку очинь нада" ©с форума. Жить становится интереснее, жить становится веселее...
{Быть или не быть} {Неуспешный суицид}

Последний раз редактировалось Johnson; 06.10.2012 в 09:02.
Johnson вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить и напечатать таблицы значений функции y= f(x) andreis459 Паскаль, Turbo Pascal, PascalABC.NET 4 20.03.2011 02:02
вывод таблицы с данными функции gessi Фриланс 5 16.09.2009 17:06
Уплотнить часть таблицы функции (Delphi) FireHawK Помощь студентам 0 05.05.2009 12:13
Изменение функции поля сводной таблицы Lal Microsoft Office Excel 3 05.03.2009 16:47