Сплайсинг

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

  1. 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* bridg=        NULL;
    6.     if(addr && new_addr)
    7.     {
    8.  
    9.         bridg=(BYTE*)VirtualAlloc(NULL,5+prolog_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    10.         VirtualProtect((LPVOID)addr, prolog_size, PAGE_EXECUTE_READWRITE, &Protects);  
    11.         ReadProcessMemory(GetCurrentProcess(), (LPVOID)addr, bridg, prolog_size, 0);
    12.         bridg[prolog_size]=0xE9;
    13.         JA=addr-(DWORD)bridg-prolog_size;
    14.         memcpy(&bridg[prolog_size+1],&JA,4);
    15.        
    16.         true_addr=(DWORD)bridg;    
    17.        
    18.        
    19.         BYTE* jmp= new BYTE(prolog_size);
    20.         jmp[0]=0xE9;
    21.  
    22.         JA=(DWORD)new_addr - addr - prolog_size;
    23.         memcpy(&jmp[1],&JA,4);
    24.        
    25.         for (int i=5;i<=prolog_size;i++)
    26.             jmp[i]=0x90;
    27.  
    28.         if(WriteProcessMemory(GetCurrentProcess(),(LPVOID)addr,jmp, prolog_size, 0))
    29.         {
    30.             VirtualProtect((LPVOID)addr, prolog_size, Protects, &Protects);
    31.             return true;
    32.         }
    33.     }
    34. return false;
    35. }
    Подскажите что не так, нужно перехватить функцию
    Код (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
    26. .text:00552E56                 push    offset aArial   ; "Arial"
    27. .text:00552E5B                 push    0               ; DWORD
    28. .text:00552E5D                 push    4               ; DWORD
    29. .text:00552E5F                 push    0               ; DWORD
    30. .text:00552E61                 push    0               ; DWORD
    31. .text:00552E63                 push    0CCh            ; DWORD
    32. .text:00552E68                 push    0               ; DWORD
    33. .text:00552E6A                 push    0               ; DWORD
    34. .text:00552E6C                 push    0               ; DWORD
    35. .text:00552E6E                 push    2BCh            ; int
    36. .text:00552E73                 push    0               ; int
    37. .text:00552E75                 push    0               ; int
    38. .text:00552E77                 push    0               ; int
    39. .text:00552E79                 push    12h             ; int
    40. .text:00552E7B                 call    ds:CreateFontA  ; Indirect Call Near Procedure
    41. .text:00552E81                 mov     ebx, eax
    42. .text:00552E83                 mov     eax, [esp+14h+arg_0]
    43. .text:00552E87                 push    ebx             ; HGDIOBJ
    44. .text:00552E88                 push    eax             ; HDC
    45. .text:00552E89                 call    ds:SelectObject ; Indirect Call Near Procedure
    46. .text:00552E8F                 mov     ecx, [esp+14h+arg_0]
    47. .text:00552E93                 push    6               ; UINT
    48. .text:00552E95                 push    ecx             ; HDC
    49. .text:00552E96                 mov     [esp+1Ch+var_4], eax
    50. .text:00552E9A                 call    ds:SetTextAlign ; Indirect Call Near Procedure
    51. .text:00552EA0                 mov     edx, [esp+14h+arg_0]
    52. .text:00552EA4                 push    1               ; int
    53. .text:00552EA6                 push    edx             ; HDC
    54. .text:00552EA7                 call    ds:SetBkMode    ; Indirect Call Near Procedure
    55. .text:00552EAD                 mov     eax, [esp+14h+arg_0]
    56. .text:00552EB1                 push    0FFFFh          ; COLORREF
    57. .text:00552EB6                 push    eax             ; HDC
    58. .text:00552EB7                 call    ds:SetTextColor ; Indirect Call Near Procedure
    59. .text:00552EBD                 mov     edi, [esp+14h+arg_4]
    60. .text:00552EC1                 mov     eax, edi
    61. .text:00552EC3                 lea     ebp, [eax+1]    ; Load Effective Address
    62. .text:00552EC6
    63. .text:00552EC6 loc_552EC6:                             ; CODE XREF: strOut+8Dj
    64. .text:00552EC6                 mov     cl, [eax]
    65. .text:00552EC8                 add     eax, 1          ; Add
    66. .text:00552ECB                 test    cl, cl          ; Logical Compare
    67. .text:00552ECD                 jnz     short loc_552EC6 ; Jump if Not Zero (ZF=0)
    68. .text:00552ECF                 mov     ecx, [esp+14h+arg_0]
    69. .text:00552ED3                 sub     eax, ebp        ; Integer Subtraction
    70. .text:00552ED5                 push    eax             ; int
    71. .text:00552ED6                 push    edi             ; LPCSTR
    72. .text:00552ED7                 mov     edi, ds:TextOutA
    73. .text:00552EDD                 push    196h            ; int
    74. .text:00552EE2                 push    0C1h            ; int
    75. .text:00552EE7                 push    ecx             ; HDC
    76. .text:00552EE8                 call    edi ; TextOutA  ; Indirect Call Near Procedure
    77. .text:00552EEA                 mov     ecx, [esp+14h+arg_8]
    78. .text:00552EEE                 mov     eax, ecx
    79. .text:00552EF0                 lea     ebp, [eax+1]    ; Load Effective Address
    80. .text:00552EF3
    81. .text:00552EF3 loc_552EF3:                             ; CODE XREF: strOut+BAj
    82. .text:00552EF3                 mov     dl, [eax]
    83. .text:00552EF5                 add     eax, 1          ; Add
    84. .text:00552EF8                 test    dl, dl          ; Logical Compare
    85. .text:00552EFA                 jnz     short loc_552EF3 ; Jump if Not Zero (ZF=0)
    86. .text:00552EFC                 mov     edx, [esp+14h+arg_0]
    87. .text:00552F00                 sub     eax, ebp        ; Integer Subtraction
    88. .text:00552F02                 push    eax             ; int
    89. .text:00552F03                 push    ecx             ; LPCSTR
    90. .text:00552F04                 push    1A9h            ; int
    91. .text:00552F09                 push    0C1h            ; int
    92. .text:00552F0E                 push    edx             ; HDC
    93. .text:00552F0F                 call    edi ; TextOutA  ; Indirect Call Near Procedure
    94. .text:00552F11                 mov     eax, [esp+14h+var_4]
    95. .text:00552F15                 mov     ecx, [esp+14h+arg_0]
    96. .text:00552F19                 push    eax             ; HGDIOBJ
    97. .text:00552F1A                 push    ecx             ; HDC
    98. .text:00552F1B                 call    ds:SelectObject ; Indirect Call Near Procedure
    99. .text:00552F21                 push    ebx             ; HGDIOBJ
    100. .text:00552F22                 call    ds:DeleteObject ; Indirect Call Near Procedure
    101. .text:00552F28                 mov     eax, [esp+14h+arg_0]
    102. .text:00552F2C                 mov     edx, [esi]
    103. .text:00552F2E                 mov     ecx, [edx+68h]
    104. .text:00552F31                 push    eax
    105. .text:00552F32                 push    esi
    106. .text:00552F33                 call    ecx             ; Indirect Call Near Procedure
    107. .text:00552F35                 pop     edi
    108. .text:00552F36                 pop     esi
    109. .text:00552F37                 pop     ebp
    110. .text:00552F38                 pop     ebx
    111. .text:00552F39                 pop     ecx
    112. .text:00552F3A                 retn                    ; Return Near from Procedure
    113. .text:00552F3A strOut          endp
    пеередаю 5 отрабатывает обработчик и падает, передаю 8 падает сразу при запуске.
     
  2. RET

    RET Well-Known Member

    Публикаций:
    17
    Регистрация:
    5 янв 2008
    Сообщения:
    789
    Адрес:
    Jabber: darksys@sj.ms
    ReadProcessMemory(GetCurrentProcess(..... - уже не надоело из своего АП так память читать?
    Сдампь процесс сразу после сплайса и посмотри что там насплайсилось... или под отладчиком потрейси, поставив бряк на начало функции, которую сплайсишь.

    -вообще жесть
     
  3. punxer

    punxer Андрей

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

    punxer Андрей

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

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. .text:00552E40                 push    ecx
    2. .text:00552E41                 push    ebx
    3. .text:00552E42                 push    ebp
    4. .text:00552E43                 push    esi
    5. .text:00552E44                 mov     esi, [esp+10h+arg_0]
    Перезаписывать нада это я так понимаю, вписываем джамп и дополняем нопами тремя. В мост копируем это и джамп на функцию + 8? да?
     
  6. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    >>точнее memset
    почему потом, а не сразу? Что мешает мысль которая "по уму" применитть сразу?
     
  7. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    EvilsInterrupt
    это не суть
     
  8. 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* bridg=        NULL;
    6.     if(addr && new_addr)
    7.     {
    8.  
    9.         bridg=(BYTE*)VirtualAlloc(NULL,5+prolog_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    10.         VirtualProtect((LPVOID)addr, prolog_size, PAGE_EXECUTE_READWRITE, &Protects);  
    11.        
    12.         memcpy(bridg,(LPVOID)addr, prolog_size);
    13.        
    14.         bridg[prolog_size]=0xE9;
    15.         JA=addr-(DWORD)bridg-prolog_size;
    16.         memcpy(&bridg[prolog_size+1],&JA,4);
    17.        
    18.         true_addr=(DWORD)bridg;    
    19.        
    20.        
    21.         BYTE* jmp= new BYTE(prolog_size);
    22.         jmp[0]=0xE9;
    23.  
    24.         JA=(DWORD)new_addr - addr - prolog_size;
    25.         memcpy(&jmp[1],&JA,4);
    26.  
    27.         memset(&jmp[5],0x90,prolog_size-5);
    28.         if(memcpy(jmp,(LPVOID)addr, prolog_size, ))
    29.         {
    30.             VirtualProtect((LPVOID)addr, prolog_size, Protects, &Protects);
    31.             return true;
    32.         }
    33.     }
    34. return false;
    35. }
    Пусть будет такой вариант, помогите с ним пожалуйсто.
     
  9. 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* bridg=        NULL;
    6.     if(addr && new_addr)
    7.     {
    8.  
    9.         bridg=(BYTE*)VirtualAlloc(NULL,5+prolog_size,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    10.         VirtualProtect((LPVOID)addr, prolog_size, PAGE_EXECUTE_READWRITE, &Protects);  
    11.        
    12.         memcpy(bridg,(LPVOID)addr, prolog_size);
    13.        
    14.         bridg[prolog_size]=0xE9;
    15.         JA=addr-(DWORD)bridg-prolog_size;
    16.         memcpy(&bridg[prolog_size+1],&JA,4);
    17.        
    18.         true_addr=(DWORD)bridg;    
    19.        
    20.        
    21.         BYTE* jmp= new BYTE(prolog_size);
    22.         jmp[0]=0xE9;
    23.  
    24.         JA=(DWORD)new_addr - addr - prolog_size;
    25.         memcpy(&jmp[1],&JA,4);
    26.  
    27.         memset(&jmp[5],0x90,prolog_size-5);
    28.         if(memcpy((LPVOID)addr,jmp, prolog_size, ))
    29.         {
    30.             VirtualProtect((LPVOID)addr, prolog_size, Protects, &Protects);
    31.             return true;
    32.         }
    33.     }
    34. return false;
    35. }
    36. точнее так
     
  10. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    Код (Text):
    1. int __cdecl MystrOut(HDC hDC, LPCSTR a2, LPCSTR a3);
    2. int (__cdecl *pstrOut)(HDC hDC, LPCSTR a2, LPCSTR a3);
    3. volatile ULONG* pGameTextOut=(ULONG*)0x00552E40;
    Код (Text):
    1.             ret=SpliceBridgeAllProlog((DWORD)pGameTextOut,(DWORD)MystrOut,true_ptr,5);
    2.             if (!ret)
    3.             {
    4.                 exit(0);
    5.             }
    6.             pstrOut=(int (__cdecl *)(HDC hDC, LPCSTR a2, LPCSTR a3))true_ptr;
    7.             DebugPrintF("GameTextOut hooked");
    перехватывается но в обработчике падает на вызове pstrOut
     
  11. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    это со сплайсом начало текстаут игрового
    Код (Text):
    1. 00552E40   $-E9 37062300    JMP vkbd.0078347C
    2. 00552E45   . 74 24          JE SHORT game.00552E6B
    3. 00552E47   . 14 8B          ADC AL,8B
    4. 00552E49   . 06             PUSH ES
    5. 00552E4A   . 8B50 44        MOV EDX,DWORD PTR DS:[EAX+44]
    6. 00552E4D   . 57             PUSH EDI
    7. 00552E4E   . 8D4C24 18      LEA ECX,DWORD PTR SS:[ESP+18]
    первый прыжок- в мою процедуру/
    это оригинал
    Код (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
     
  12. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Напиши по пунктам, что ты хочешь сделать (а лучше нарисуй на бумаге все переходы) - сам увидишь ошибки... :)
     
  13. punxer

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    gorodon
    ты их видишь? я пока нарисую а ты можешь написать)
     
  14. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    Вот здесь ты куда хочешь попасть? на new_addr?
    Так, может тогда: JA=(DWORD)new_addr - addr - 5;

    Формирование bridg тоже не совсем понятно - куда надо прыгнуть? (на addr+prolog_size)?
    Если с (bridg+prolog_size) надо прыгнуть на (addr + prolog_size), то
    JA=(addr + prolog_size)-(bridg+prolog_size)-5=addr - bridg - 5;
     
  15. PSR1257

    PSR1257 New Member

    Публикаций:
    0
    Регистрация:
    30 ноя 2008
    Сообщения:
    933
    punxer

    0. Где текст обработчега?
    1. Если падает в обработчиге (при беглом осмотре перехватчега ошибок не увидел) - можно попробовать максимально его упростить - для начала просто выполнить "стыренные" несколько команд оригинальной функи и прыгнуть / push ret_addr retn в оригинальный код после джампа. Если все регистры после такого возврата целые и стек целый и ничего не сдохло - усложнять...
     
  16. punxer

    punxer Андрей

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

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    PSR1257
    с пятибайтовым прологом все работает.
    Код (Text):
    1. bool SpliceBridge(__in DWORD addr,__in DWORD new_addr,__out DWORD& true_addr)
    2. {
    3.     DWORD Protects=     NULL;
    4.     DWORD JA=           NULL;
    5.     BYTE* bridg=        NULL;
    6.     if(addr && new_addr)
    7.     {
    8.  
    9.         bridg=(BYTE*)VirtualAlloc(NULL,10,MEM_COMMIT,PAGE_EXECUTE_READWRITE);
    10.         VirtualProtect((LPVOID)addr, 5, PAGE_EXECUTE_READWRITE, &Protects);  
    11.         ReadProcessMemory(GetCurrentProcess(), (LPVOID)addr, bridg, 5, 0);
    12.         bridg[5]=0xE9;
    13.         JA=addr-(DWORD)bridg-5;
    14.         memcpy(&bridg[6],&JA,4);
    15.         true_addr=(DWORD)bridg;    
    16.         BYTE jmp[5]={0xE9,0x00,0x00,0x00,0x00};
    17.         JA=(DWORD)new_addr - addr - 5;
    18.         memcpy(&jmp[1],&JA,4);
    19.         if(WriteProcessMemory(GetCurrentProcess(),(LPVOID)addr,jmp, 5, 0))
    20.         {
    21.             VirtualProtect((LPVOID)addr, 5, Protects, &Protects);
    22.             return true;
    23.         }
    24.     }
    25. return false;
    26. }
    нужно модифицировать для пролога любой величины, всмысле начала функции произвольной длины.

    Код (Text):
    1. Код:
    2. .text:00552E40
    3. .text:00552E40 ; =============== S U B R O U T I N E =======================================
    4. .text:00552E40
    5. .text:00552E40
    6. .text:00552E40 ; int __cdecl strOut(HDC, LPCSTR, LPCSTR)
    7. .text:00552E40 strOut          proc near            
    8. .text:00552E40                                        
    9. .text:00552E40
    10. .text:00552E40 var_4           = dword ptr -4
    11. .text:00552E40 arg_0           = dword ptr  4
    12. .text:00552E40 arg_4           = dword ptr  8
    13. .text:00552E40 arg_8           = dword ptr  0Ch
    14. .text:00552E40
    15. .text:00552E40                 push    ecx
    16. .text:00552E41                 push    ebx
    17. .text:00552E42                 push    ebp
    18. .text:00552E43                 push    esi
    19. .text:00552E44                 mov     esi, [esp+10h+arg_0]
    20. .text:00552E48                 mov     eax, [esi]
    21. .text:00552E4A                 mov     edx, [eax+44h]
    22. .text:00552E4D                 push    edi
    23. .text:00552E4E                 lea     ecx, [esp+14h+arg_0] ; Load Effective Address
    сдесь джамп разрывает инструкции
     
  18. punxer

    punxer Андрей

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

    punxer Андрей

    Публикаций:
    0
    Регистрация:
    16 окт 2006
    Сообщения:
    1.327
    Адрес:
    Ржев
    а именно портит
    Код (Text):
    1.  mov     esi, [esp+10h+arg_0]
     
  20. gorodon

    gorodon New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2009
    Сообщения:
    301
    1) "Операнд команды jmp является значением со знаком, являющемся смещением переходаотносительно следующей за jmp команды" - вот отсюда и -5

    2) Замени расчет смещений (как показано в #14) и поставь prolog_size равным 8 при вызове SpliceBridgeAllProlog

    3) Схему jmp-ов нарисовал?