Суперновичек =] снятие перезвата.

Тема в разделе "WASM.BEGINNERS", создана пользователем WaterGhost, 16 июл 2007.

  1. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Я просто дундук в этом. Помогите нуберу. Плииииииииииииз

    Код (Text):
    1. PVOID Hook(PVOID Addr, PVOID NewFunc)
    2. {
    3.     PVOID CallGate, Inst = Addr;
    4.     ULONG Size = 0, CollectedSpace = 0, CallGateSize = 0;
    5.    
    6.     if (Addr == NULL)
    7.         return 0;
    8.  
    9.     while (CollectedSpace < SIZEOFJUMP)
    10.     {
    11.         GetInstLenght(Inst, &Size);
    12.         (ULONG)Inst += Size;
    13.         CollectedSpace += Size;
    14.     }
    15.    
    16.     CallGateSize = CollectedSpace + SIZEOFJUMP;
    17.     CallGate = (PVOID)ExAllocatePool(NonPagedPool, CallGateSize);
    18.    
    19.     DbgMsg("Function addr : 0x%.8x\n", Addr);
    20.     DbgMsg("Handler addr : 0x%.8x\n", NewFunc);
    21.     DbgMsg("CallGate at : 0x%.8x; size : %d\n", CallGate, CallGateSize);
    22.  
    23.     memset(CallGate, ASMNOP, CallGateSize);
    24.  
    25.     memcpy(CallGate, Addr, CollectedSpace);
    26.  
    27.     memset(Addr, ASMNOP, CollectedSpace);
    28.  
    29.     GenJmp((ULONG)Addr + SIZEOFJUMP, (ULONG)CallGate + CollectedSpace);
    30.     GenJmp((ULONG)NewFunc, (ULONG)Addr);
    31.  
    32.     return CallGate;
    33. }
    Как вернуть все обратно, тоесть расхукить это дело. Я ламка и вааще ничего не понимаю что тут сделали. Помогите пожалуйста :dntknw:
     
  2. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Подозреваю, что сделали хук через вставку jmp в начало функции. Снимается так: читаешь с диска оригинальные первые 5 байт перехваченной функции и в памяти пишешь их вместо этого самого jmp в начале функции
     
  3. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    WaterGhost
    Объясняю, что здесь написано.
    в этом цикле получаем целое количество инструкций размером не менее SIZEOFJUMP
    Нопим пространство в пуле - хз зачем - не обязательно.
    Сохраняем старые инструкции в отдельном пуле
    Нопим начало функции - хз зачем - тоже необязательно.
    Вставляем переход в место после сохраненных инструкций. Переход на продолжение функции после вставленного далее перехода.
    Сплайсим функции обработчиком по адресу NewFunc.
     
  4. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    WaterGhost
    А чо такое "перезват"?
     
  5. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    тогда и получать целое кол-во инструкций ненадо ;)
     
  6. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Да, спасибо за поправку. В пуле не надо нопы, а вот в начале функции надо.
     
  7. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Ух ты.. кажись что-то понял. А откуда взять оригинальные данные для обратной замены ? Или когда я ставлю хук мне нада их запонить ?
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    если это твой хук, то оригинальные байты лежат в Callgate, только тебе надо перезаписывать без последнего джампа.
     
  9. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    А не могли бы набросать приблизительно как это должно выглядеть =\
     
  10. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    Код (Text):
    1. memcpy(Addr, CallGate, CollectedSpace);
     
  11. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    а не могли бы помочь построить код функции UnHook... у меня имеется только функции с приставкой Old - это резултатьы выполнения функции Hook. Т.е. калгейты.
    Помогите пожалуйста... просто представить вю эту архитектуру по коду не могу. А так вроде понятно что просто перенаправляем при вызове в мой обработчик а потом обратно.
     
  12. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Т.е. в КАЛГЕЙТЕ который определяется до строчек
    Код (Text):
    1. GenJmp((ULONG)Addr + SIZEOFJUMP, (ULONG)CallGate + CollectedSpace);
    2.     GenJmp((ULONG)NewFunc, (ULONG)Addr);
    лежит оригинальные байты которые мне нада перезаписать ? А как узнать размер калгейта? sizeof ?
     
  13. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    WaterGhost
    №10
     
  14. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    но ведь это калгейт с джампом =\ а можно его размер узнать sizeof ? м ??
     
  15. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    WaterGhost
    Можно - сканишь калгейт до jmp <адрес_начала_функции+JMPSIZE>
     
  16. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    сканю до jmp, отрезаю все что после jmp и сам jmp и потом заменяю так:
    Код (Text):
    1. memcpy(Addr, CallGate, sizeof(CallGate));
    я все правильно понял ?

    А как скан проводить ?
    Код (Text):
    1. for(i = 0; sizeof(CallGate); i++)
    2.     {
    3.         if(CallGate + i = ASMNOP)
    4.           {
    5.            
    6.           }  
    7.     }
    я вааще не представляю это, помогите пожалуйста =\
     
  17. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Нет. sizeof не поможет, надо так
    Код (Text):
    1. memcpy(Addr, CallGate, CollectedSpace);
    Чтобы проводить скан надо узнать какой вид перехода генерит GetJmp. И по этим инструкциям искать.
     
  18. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Код (Text):
    1. void GenJmp(ULONG To, ULONG From)
    2. {  
    3.     InsertDword(From + 1, To - From - 5);   // dst - src - 5
    4.     InsertByte(From, ASMJMP);               // jmp  ...
    5. }
    Вот...

    Насчет размера... это что получается мне нада запоминать CollectedSpace из процедуры установки хука ? =\
     
  19. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    WaterGhost
    как было написано Mental_Mirror не обяхательно, но проще запомнить.
     
  20. WaterGhost

    WaterGhost New Member

    Публикаций:
    0
    Регистрация:
    15 июн 2007
    Сообщения:
    130
    Подскажите как это сделать пожалуйста. Как провести скан и отрезать в калгейте информацию по ASMJMP. Плииииииз =\