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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 11.01.2012, 16:45   #1
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию Перехват функции и stack pointer

Доброго времени суток Уважаемые программисты, вообщем проблема у меня следующая и я не совсем могу понять как ее можно решить, просто не сталкивался с таким. Вообщем имеется откомпилированное PE приложение, исходного кода собственно не имеется, поэтому немного pure assembler. Для начала покажу некую функцию которая принимает 4 аргумента.

Код:
CPU Disasm
Address   Hex dump          Command                                  Comments
00688589  |.  55            ||PUSH EBP                               ; /Arg4
0068858A  |.  57            ||PUSH EDI                               ; |Arg3
0068858B  |.  56            ||PUSH ESI                               ; |Arg2
0068858C  |.  50            ||PUSH EAX                               ; |Arg1 => [LOCAL.3691]
0068858D  |.  E8 3E5B0000   ||CALL 0068E0D0                          ; \Main2.0068E0D0
Прототип данной функции имеет следующий вид
Код:
int __cdecl ProtocolCore(int protoNum, PBYTE lpMsg, int Len, int Flag);
Собственно объявим указатель на данную функцию чтобы потом трамплинить на нее.

Код:
typedef int (__сdecl *pProtocolCore)(int protoNum, PBYTE lpMsg, int Len, int Flag);
pProtocolCore ProtocolCoreEx = (pProtocolCore)PROTOCOL_CORE;
PROTOCOL_CORE это адрес вызываемой функции, то есть адрес на CALL 0xXXXXXX
Библиотекой дэтаур реализуем трамплин на фейк функцию, выполним определенные действия и вернем управление оригинальной функции.
Код:
BOOL APIENTRY DllMain(HINSTANCE hInst, DWORD dwReason, LPVOID lpReserved) 
{
 switch(dwReason)
 {	
 case DLL_PROCESS_ATTACH: 
  {
    DisableThreadLibraryCalls(hInst);
    DetourTransactionBegin();
    DetourUpdateThread(GetCurrentThread());
    DetourAttach(&(PVOID&)ProtocolCoreEx, ProtocolCore);
    DetourTransactionCommit();
  }
  break;
		
  case DLL_PROCESS_DETACH:
  {
   DetourTransactionBegin();
   DetourUpdateThread(GetCurrentThread());
   DetourDetach(&(PVOID&)ProtocolCoreEx, ProtocolCore); 
   DetourTransactionCommit();
  }
  break;	
 }
 return TRUE;
}
Код:
int __cdecl ProtocolCore(int protoNum, PBYTE lpMsg, int Len, int Flag)
{
 switch (protoNum)
 {
  case 0xF4:
   {
    switch (lpMsg[3])
    {
     case 0x01:
      { 
       MessageBoxA(NULL, "Qwerty", "Msg", MB_OK);
      }
      break;
    }
   }
 }
 return ProtocolCoreEx((BYTE)protoNum, lpMsg, Len, Flag);
}
А дело собственно вот в чем, когда трассирую функцию и дохожу до моего прыжка Stack pointer равен в моем случае 0012B610 данному адресу.
После того как данный вызов заменяется на мой дальний прыжок, то есть так скажем трамплин на мою функцию я выполняю определенные действия над данными аргументами и передаю управление уже с измененными аргументы оригинальной функции.
Вообщем когда я уже возвращаюсь из фейк функции, source pointer равен уже совсем другому значению а мне нужно его выравнить опять в 0012B610. Как это реализовать?

Последний раз редактировалось coNsept; 11.01.2012 в 20:00.
coNsept вне форума Ответить с цитированием
Старый 11.01.2012, 18:57   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

проблема в то м что вы не верно указали соглашения вызовов.
__cdecl!=__stdcall
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.01.2012, 19:59   #3
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Упс я извиняюсь, это я менял соглашение, вообще первоначально я написал __cdecl. Но все равно сути это не меняет, так тоже не работает.
Не усмотрел когда код вставлял.
coNsept вне форума Ответить с цитированием
Старый 11.01.2012, 20:06   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам вообще то не важен указатель в итоге(главно соглашение соблюдайте)

параметры передали функции и все.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 11.01.2012, 20:46   #5
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Соглашение _cdecl, но все равно esp не восстанавливается
coNsept вне форума Ответить с цитированием
Старый 11.01.2012, 20:52   #6
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Указал соглашение _cdecl но все равно указатель на стек не восстанавливается. А мне это нужно обязательно, так как последующее обращение по каким-то адресам дают совсем не правильное смещение, в итоге я получаю ошибку.
coNsept вне форума Ответить с цитированием
Старый 12.01.2012, 05:47   #7
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

Может быть вот здесь найдёшь то, что тебе нужно: http://rsdn.ru/summary/1383.xml
Да кстати, твой метод перехвата в народе называется "сплайсинг".
_Bers вне форума Ответить с цитированием
Старый 12.01.2012, 11:15   #8
coNsept
Форумчанин
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Сообщений: 716
По умолчанию

Да, сплайсинг. Кстати проблему решил, а проблема была в том что я пытался затирать CALL, а именно в моем случае мне нужно было перейти в функцию и уже в функции делать переход.
coNsept вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перехват функции egorzenit Общие вопросы Delphi 7 15.09.2011 14:49
Перехват функции с заменой N-Cat Win Api 13 09.06.2011 11:42
Pointer Different Общие вопросы Delphi 6 11.03.2011 23:15
pointer demonara Помощь студентам 0 22.10.2010 22:23
Pointer Superlotles Помощь студентам 5 12.10.2009 17:24