Сплайсинг

Тема в разделе "WASM.BEGINNERS", создана пользователем Gonzzik, 7 авг 2007.

  1. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    Хочю перехватить меседжбокс. При после перехода на NewMessageBox падает код с ошибкой чтение невозможно. Обьясните что делаю не правильно?
    вот код длл
    Код (Text):
    1.   CurrProc      dd ?
    2.   AdrMessageBox dd ?
    3.   szMessageBox  db 'MessageBoxA',0
    4.   szUser32dll   db 'user32.dll',0
    5.  
    6.   JmpCrProcA:
    7.   .PuhsOp       db 0x68
    8.   .PushArg      dd ?
    9.   .RetOp        db 0xC3
    10.  
    11.   OldCrp:
    12.   .One           dd ?
    13.   .two           dw ?
    14.  
    15. entry  $
    16.         cmp     dword [esp+8], DLL_PROCESS_ATTACH
    17.         jnz     @F
    18.         push    dword [esp+4]
    19.  
    20.   start:
    21.         call    SetHook
    22.         mov     eax, 1
    23.         retn    0Ch
    24.  
    25. proc    SetHook
    26.  
    27.         mov     eax,NewMessageBox
    28.         mov     [JmpCrProcA.PushArg],eax
    29.         invoke  GetCurrentProcess
    30.         mov     [CurrProc],eax
    31.  
    32.         invoke  GetModuleHandle,szUser32dll
    33.         test    eax,eax
    34.         jnz     @F
    35.         invoke  LoadLibrary,szUser32dll
    36.     @@:
    37.         invoke  GetProcAddress,eax,szMessageBox
    38.         mov     [AdrMessageBox],eax
    39.  
    40.         invoke  ReadProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0
    41.         invoke  WriteProcessMemory,[CurrProc],[AdrMessageBox],JmpCrProcA,6,0
    42.         ret
    43. endp
    44.  
    45.  
    46. NewMessageBox:
    47.         invoke  WriteProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0
    48.  
    49.   ;мой обработчик
    50.  
    51.         push    [AdrMessageBox] ;на начало Апи
    52.         ret
    она подгружается test.exe
    Код (Text):
    1.    szName       db 'MyDll.dll',0
    2.  
    3. entry $
    4.  
    5.   invoke  LoadLibrary,szName
    6.   invoke  MessageBox,0,szName,0,0
    7.   invoke  ExitProcess,0
    Вот прикрепил код полностью. Компилятор Фасм. Если кому не внапряг посмотрите плиз.
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    вызывай VirtualProtect для нужной страницы памяти, кодовая секция обычно мапится только с правами на чтение/выполнение
     
  3. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Gonzzik
    Иногда надо читать статьи, там все разжовано.
     
  4. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    По сплайсингу в юзермоде куча статей =\\\
     
  5. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    Статьи я читал. Делаю все как у рихтера, за исключением: потоки не останавливаю, но у меня же один поток.
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Нифига ты не читал.. перед тем, Как писать куда-то, не помешает убедиться, что туда действительно можно писать
     
  7. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    Great писать туда можно. вот уже при обработке пойманой Апи ошибка доступа к памяти.
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да это жесть. проверил бы хоть права доступа по VirtualQuery
     
  9. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    но по адресу точки входа ф-ии меседжбокса вписывается мой код )))

    push <адрес возврата>
    retn

    а вот процедура из статью Рема

    Код (Text):
    1. Procedure SetHook;
    2. var
    3.  HKernel32, HUser32: dword;
    4. begin
    5.  CurrProc := GetCurrentProcess;
    6.  //получение адреса CreateProcessA
    7.  AdrCreateProcessA := GetProcAddress(GetModuleHandle('kernel32.dll'), 'CreateProcessA');
    8.  //инициализация структуры перехвата CreateProcessA
    9.  JmpCrProcA.PuhsOp  := $68;
    10.  JmpCrProcA.PushArg := @NewCreateProcessA;
    11.  JmpCrProcA.RetOp   := $C3;
    12.  //сохраняем старое начало функции
    13.  ReadProcessMemory(CurrProc, AdrCreateProcessA, @OldCrp, SizeOf(OldCode), bw);
    14.  //записываем новое начало CreateProcessA
    15.  WriteProcessMemory(CurrProc, AdrCreateProcessA, @JmpCrProcA, SizeOf(far_jmp), Writen);
    16. end;
    он же здесь пишет туда без проблем
     
  10. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    msdn->VirtualProtect
    перечитай ещё раз
     
  11. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Второй раз за сегодня даю линк на свой недо-вирус: http://twister.orgfree.com/projects/index.php

    Скачай с этой страницы исходники VeRa v0.01 - там есть перехват MessageBoxExA (перехватывать нужно ее, а не MessageBoxA)
     
  12. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    ну причем здесь VirtualProtect кто нибутдь обьяснит мне. У меня эти ф-ии нормально работают, проблема совсем не в них
    Код (Text):
    1.   invoke ReadProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0
    2.   invoke WriteProcessMemory,[CurrProc],[AdrMessageBox],JmpCrProcA,6,0
    3.   ret
    4. endp
    5. NewMessageBox: invoke WriteProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0
     
  13. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    хм.. адрес выхода из длл энтри неправильный, зачем это:
    Код (Text):
    1. push    dword [esp+4]
     
  14. Gonzzik

    Gonzzik New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2007
    Сообщения:
    61
    Все заработало! rain распект. Помарка.. как я ее забыл вытереть..
     
  15. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    А у меня invoke ReadProcessMemory,[CurrProc],[AdrMessageBox],OldCrp,6,0 так и не заработал... Не хочет читать из Dllки :dntknw:
     
  16. Lex2029

    Lex2029 New Member

    Публикаций:
    0
    Регистрация:
    17 сен 2007
    Сообщения:
    199
    и invoke VirtualProtectEx,[CurrProc],[AdrMessageBox],6,PAGE_EXECUTE_READWRITE,memoryProtect
    Не работает, какие бы значения я в memoryProtect не подставлял... Там ведь нельзя чтоб NULL был, по MSDN.
     
  17. Deyton

    Deyton Member

    Публикаций:
    0
    Регистрация:
    7 мар 2007
    Сообщения:
    94
    Еще не советую помещать код в выделенную память (malloc, VirtualAlloc). Ради ~5 байт скопированного оригинального кода функции прийдется всю страницу памяти помечать как PAGE_EXECUTE, а ведь в ней могут оказаться данные, которые помещались программой в иной раз при вызове malloc... Если надо перехватывать не очень много функций, то я обычно делаю так, напр.:

    __declspec(naked) BOOL WINAPI TrueMoveFileEx(
    LPCTSTR lpExistingFileName,
    LPCTSTR lpNewFileName,
    DWORD dwFlags
    )
    {
    __asm {
    mov edi, edi
    mov edi, edi
    mov edi, edi
    mov edi, edi
    mov edi, edi
    mov edi, edi
    mov edi, edi
    mov edi, edi
    mov edi, edi
    mov edi, edi
    }
    }
    потом сюда при установке перехвата копируется оригинальный код (~5 байт) и переходник на продолжение функции.

    Или можно сделать отдельную секцию в исполняемом файле:

    #pragma data_seg( ".hook" )

    CHAR hook_section[ HOOK_SECTION_SIZE ] = { 0xCC };

    #pragma data_seg( )

    #pragma comment( linker,"/SECTION:.hook,ER" )

    и потом использовать ее для формирования трамплинов к оригинальной функции.