Сплайсинг

Тема в разделе "WASM.WIN32", создана пользователем punxer, 31 май 2010.

  1. karabas_barabas

    karabas_barabas Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    168
    вообще используй дизасм движок коих в инете дофига, для определения целого числа инструкций которые заменяешь
     
  2. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. 00552E40   $-E9 24062300    JMP vkbd.00783469
    2. 00552E45     90             NOP
    3. 00552E46     90             NOP
    4. 00552E47     90             NOP
    5. 00552E48   . 8B06           MOV EAX,DWORD PTR DS:[ESI]
    6. 00552E4A   . 8B50 44        MOV EDX,DWORD PTR DS:[EAX+44]
    7. 00552E4D   . 57             PUSH EDI
    без перехвата
    Код (Text):
    1. 00552E40  /$ 51             PUSH ECX
    2. 00552E41  |. 53             PUSH EBX
    3. 00552E42  |. 55             PUSH EBP
    4. 00552E43  |. 56             PUSH ESI
    5. 00552E44  |. 8B7424 14      MOV ESI,DWORD PTR SS:[ESP+14]
    6. 00552E48  |. 8B06           MOV EAX,DWORD PTR DS:[ESI]
    7. 00552E4A  |. 8B50 44        MOV EDX,DWORD PTR DS:[EAX+44]
    8. 00552E4D  |. 57             PUSH EDI
    это с аргументом 8, первый джамп JMP vkbd.00783469 почему то приводит на 3 инструкции выше хэндлера
    Код (Text):
    1. 00783469   CC               INT3
    2. 0078346A   CC               INT3
    3. 0078346B   CC               INT3
    4. 0078346C   8BFF             MOV EDI,EDI
    5. 0078346E   55               PUSH EBP
    6. 0078346F   8BEC             MOV EBP,ESP
    7. 00783471   837D 0C 00       CMP DWORD PTR SS:[EBP+C],0
    8. 00783475   74 09            JE SHORT vkbd.00783480
    9. 00783477   FF75 0C          PUSH DWORD PTR SS:[EBP+C]
    10. 0078347A   E8 11E3FFFF      CALL vkbd.00781790
    11. 0078347F   59               POP ECX
    12. 00783480   837D 10 00       CMP DWORD PTR SS:[EBP+10],0
    13. 00783484   74 09            JE SHORT vkbd.0078348F
    14. 00783486   FF75 10          PUSH DWORD PTR SS:[EBP+10]
    15. 00783489   E8 02E3FFFF      CALL vkbd.00781790
    16. 0078348E   59               POP ECX
    17. 0078348F   56               PUSH ESI
    18. 00783490   FF75 10          PUSH DWORD PTR SS:[EBP+10]
    19. 00783493   FF75 0C          PUSH DWORD PTR SS:[EBP+C]
    20. 00783496   FF75 08          PUSH DWORD PTR SS:[EBP+8]
    21. 00783499   FF15 68427800    CALL DWORD PTR DS:[784268]
    22. 0078349F   68 E4167800      PUSH vkbd.007816E4                       ; ASCII "True Function Called"
    23. 007834A4   8BF0             MOV ESI,EAX
    24. 007834A6   E8 E5E2FFFF      CALL vkbd.00781790
    25. 007834AB   83C4 10          ADD ESP,10
    26. 007834AE   8BC6             MOV EAX,ESI
    27. 007834B0   5E               POP ESI
    28. 007834B1   5D               POP EBP
    29. 007834B2   C3               RETN
     
  3. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. int __cdecl MystrOut(HDC hDC, LPCSTR a2, LPCSTR a3)
    2. {
    3.     int ret;
    4.     if (a2)
    5.         DebugPrintF(a2);
    6.     if (a3)
    7.         DebugPrintF(a3);
    8.     ret=pstrOut(hDC,a2,a3);
    9.     DebugPrintF("True Function Called");
    10.     return ret;
    11. }
    12. вот обработчик
     
  4. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    а вот переписаная функция

    Код (Text):
    1. bool SpliceBridgeAllProlog(__in DWORD addr,__in DWORD new_addr,__out DWORD& true_addr,int prolog_size)
    2. {
    3.     DWORD Protects=     NULL;
    4.     DWORD JA=           NULL;
    5.     BYTE* bridge=       NULL;
    6.     if(addr && new_addr)
    7.     {
    8.         //Create Bridge
    9.         bridge=(BYTE*)VirtualAlloc(NULL,5+prolog_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    10.         VirtualProtect((LPVOID)addr, prolog_size, PAGE_EXECUTE_READWRITE, &Protects);  
    11.        
    12.         memcpy(bridge, (LPVOID)addr,  prolog_size);
    13.         bridge[prolog_size]=0xE9;
    14.         JA=addr-(DWORD)bridge-prolog_size;
    15.         memcpy(&bridge[prolog_size+1],&JA,4);
    16.        
    17.         true_addr=(DWORD)bridge;       
    18.        
    19.         //Patch Function
    20.         BYTE *jmp=(BYTE*)VirtualAlloc(NULL,prolog_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    21.         jmp[0]=0xE9;
    22.  
    23.         JA=(DWORD)new_addr - addr - prolog_size;
    24.         memcpy(&jmp[1],&JA,4);
    25.         memset(&jmp[5],0x90,prolog_size-5);
    26.         if(memcpy((LPVOID)addr,jmp, prolog_size))
    27.         {
    28.             VirtualProtect((LPVOID)addr, prolog_size, Protects, &Protects);
    29.             return true;
    30.         }
    31.     }
    32. return false;
    33. }
     
  5. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Ну, Ё - прочитай еще раз #14 и #20:
    JA=addr-(DWORD)bridge-prolog_size; замени на JA=addr-bridge-5;

    и

    JA=(DWORD)new_addr - addr - prolog_size; замени на JA=new_addr - addr - 5;
     
  6. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    gorodon
    обьясни почему пожалуйсто
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Все заработало, но почему не пойму(( Сорри что туплю.
     
  8. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Команда jmp лежит по адресу addr и тебе надо задать для нее такое смещение, чтобы попасть на адрес new_addr.
    Сама команда jmp занимает в памяти 5 байт (для нашего случая).
    Тогда смещение, которое нужно задать в команде jmp(см. #20) ,будет вычисляться так:

    смещение=new_addr-(addr+5)=new_addr-addr-5

    где 5 - длина команды jmp (для нашего случая). Что не понятно?
     
  9. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    но в функции то патчится не 5 а 8 байт три из которых нопятся. для нашего случая длина патча то 8.
     
  10. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    gorodon

    нарисовал)) Все понял. Сорри за тупость. Утро) Спасибо.
     
  11. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Фууу....наконец-то! :)
     
  12. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    gorodon
    Я не заметил 20 поста ((
     
  13. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    punxer
    Взял краб захломил своими патчами, этот форум.. Сплайсинги нафиг никому не нужны, это отсталые способы контроля за кодом. Сейчас не актуально. Просто забудьте про это.
     
  14. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Clerk
    а что актуально? просвети.
     
  15. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Clerk
    Для каждой задачи актуально свое. Мне сейчас - это.
     
  16. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    punxer
    Код (Text):
    1. .text:00552E40
    2. .text:00552E40 ; =============== S U B R O U T I N E =======================================
    3. .text:00552E40
    4. .text:00552E40
    5. .text:00552E40 ; int __cdecl strOut(HDC, LPCSTR, LPCSTR)
    6. .text:00552E40 strOut          proc near            
    7. .text:00552E40                                        
    8. .text:00552E40
    9. .text:00552E40 var_4           = dword ptr -4
    10. .text:00552E40 arg_0           = dword ptr  4
    11. .text:00552E40 arg_4           = dword ptr  8
    12. .text:00552E40 arg_8           = dword ptr  0Ch
    13. .text:00552E40
    14. .text:00552E40                 push    ecx
    15. .text:00552E41                 push    ebx
    16. .text:00552E42                 push    ebp
    17. .text:00552E43                 push    esi
    18. .text:00552E44                 mov     esi, [esp+10h+arg_0]
    19. .text:00552E48                 mov     eax, [esi]
    20. .text:00552E4A                 mov     edx, [eax+44h]
    21. .text:00552E4D                 push    edi
    22. .text:00552E4E                 lea     ecx, [esp+14h+arg_0] ; Load Effective Address
    23. .text:00552E52                 push    ecx
    24. .text:00552E53                 push    esi
    25. .text:00552E54                 call    edx             ; Indirect Call Near Procedure
    Изменить ссылку на свой стаб в структуре, далее она будет вызвана кодом [.text:00552E54]. Типо сабклассинг..
    Если нельзя изменить ссылку на калбэк, то можно использовать технику IDP. Вызываем двиг, передав в него ссыль и обрабатываем останов при доступе к ней. Далее можно дотрассировать до куда нужно.
     
  17. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Clerk
    а по подробнее. с куском кода например пожалуйсто.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    punxer
    Большинство есчо видимо не доросло до техник, которые я сдесь описал, очень жаль. Тупо заменить ссылку - что есчо описывать ?
     
  19. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    что за IDP
     
  20. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Кусок кода например