Сплайсинг без Dll

Тема в разделе "WASM.BEGINNERS", создана пользователем Active, 20 фев 2007.

  1. Active

    Active New Member

    Публикаций:
    0
    Регистрация:
    20 фев 2007
    Сообщения:
    38
    В сети очень подробно расписан сплайсинг функций с использованием Dll. В статье "От зеленого к красному" встретил такой код:

    Код (Text):
    1. .data
    2. code1 label byte
    3.         db  68h ;ОПКОД команды PUSH
    4.         Hooker1 dd 0    ;ОПЕРАНД команды PUSH
    5.         db  0c3h    ;ОПКОД RET
    6. size_code1  equ $-code1
    7. ......
    8. .data?
    9. Old_Code1 db size_code1 dup (?)
    10. ......
    11.  
    12. .code
    13. SetHook1 proc NameFunc:dword,NameModul:dword
    14.     invoke GetModuleHandle,NameModul
    15.     invoke GetProcAddress,eax,NameFunc
    16.     mov RealAddr1,eax;сохраняем адрес перехватываемой функции
    17.     invoke ReadProcessMemory,-1,RealAddr1,offset Old_Code1,size_code1,0
    18.     mov Hooker1,offset Hooker
    19.     invoke WriteProcessMemory,-1,RealAddr1,offset code1,size_code1,0
    20.     ret
    21. SetHook1 endp
    Подскажите пожалуйста, как бы выглядел сам перехватчик и обращение к нему в SetHook1 в базонезависимом коде.
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    очень приблизительно так (это перехват DllEntryPoint):

    Код (Text):
    1. label_main:
    2.     dd  hook_size
    3.     dd  offset label_delta
    4.     dd  offset label_proc
    5.     dd  0
    6. label_entry:
    7. ;   db  0cch
    8.     push    eax
    9.     push    ecx
    10.     push    eax
    11.     push    ecx
    12.     push    edx
    13.     call      @F
    14. @@:
    15.     pop ecx
    16.     sub ecx,(@B-label_entry)
    17.     db  0b8h
    18. label_delta:
    19.     dd  0
    20.     lea edx,[ecx+(label_return-label_entry)]
    21.     mov [esp+010h],edx
    22.     mov byte ptr [ecx],0c2h
    23.     mov word ptr [ecx+001h],0ch
    24.     db  0b8h
    25. label_proc:
    26.     dd  0
    27.     lea ecx,[ecx+eax]
    28.     mov edx,[ecx]
    29.     mov [esp+00ch],edx
    30.     pop edx
    31.     pop ecx
    32.     pop eax
    33.     retn
    34. label_return:
    35.     push    1
    36.     pop eax
    37.     retn    0ch
    38. hook_size equ $-label_entry
    а тебе зачем это ? :)
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Прошу прощения, при чем тут dll?
     
  4. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    Просто испорченный объектным программированием недоделанный кодер пытается сделать инжект с перехватом, без dll =) .....и попутно выучить asm, ну может быть написать ламерский вирус :) Прости мою наглость, но не мог бы ты поподробнее расписать?
     
  5. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    Извини, перепутал - подстановка в чужой процесс и перехват в нем api.
     
  6. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    тоесть ты хочешь в WriteProcessMemory передать адресс кода с перехватом(который традиционно и лежит в длл) а не кода загрузки длл?
     
  7. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    Именно =) А это просто традиция, или по другому сделать нельзя (...или слишком трудно)?
     
  8. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    просто так удобней, ты можешь сразу писать в процесс тот код который тебя интересует....
     
  9. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    Просто как не пытаюсь - не могу привести перехватчик, приведенный в моем примере, в соответствие с тем кодом, который привел z0mailbox (непонятен принцип). Сказывается неопытность.....ну может и мозги подкачали
     
  10. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    z0mailbox приводил код в ответ на вопрос о базонезависимом коде, ты же говоришь о перехвате без дополнительных длл.
     
  11. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    Тогда повторюсь, чтобы не создавать путаницы: есть фрагмент (пример) кода сплайсинга.
    Код (Text):
    1. .data
    2. (1)code1 label byte
    3. (2)     db  68h ;ОПКОД команды PUSH
    4. (3)     Hooker1 dd 0    ;ОПЕРАНД команды PUSH  - здесь код "прыжка" на обработчик
    5. (4)         db  0c3h    ;ОПКОД RET
    6. (5)size_code1   equ $-code1
    7. ......
    8. .data?
    9. (6)Old_Code1 db size_code1 dup (?)
    10. RealAddr1 DWORD ?
    11. ......
    12. .code
    13. SetHook1 proc NameFunc:dword,NameModul:dword
    14.     invoke GetModuleHandle,NameModul
    15.     invoke GetProcAddress,eax,NameFunc
    16.     mov RealAddr1,eax;сохраняем адрес перехватываемой функции
    17.     invoke ReadProcessMemory,-1,RealAddr1,offset Old_Code1,size_code1,0
    18.     mov Hooker1,offset Hooker
    19.     invoke WriteProcessMemory,-1,RealAddr1,offset code1,size_code1,0 ;здесь устанавливаем прыжок
    20.     ret
    21. SetHook1 endp
    Где Hooker - сам обработчик. Меня интересует, как будут выглядеть код перехода со связанными метками и переменными (1-6) в базонезависимом коде, и как будет выглядеть их использование в ReadProcessMemory\WriteProcessMemory.
     
  12. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Вышеприведенный принцип базонзависимого кода (кстати, этим принципом вирусы под ДОС часто пользовались)

    1)Делаем call на следующую команду.
    call @@1
    @@1:
    2)Берем из стека реальный адрес @@1
    pop eax
    3)все остальные обращения к памяти должны идти из расчета смещения (eax-@@1) т.е при компиляции кода у тебя смещение метки @@1 было одно, но сейчас стало другим, и разницу куда-то нужно приткнуть :))
     
  13. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    Спасибо, это понятно. Тогда адрес какой-либо переменной или функции будет выглядеть как "offset Name + Дельта". Но каким образом в масме сделать "Old_Code1 db size_code1 dup (?)" (мет. 6) с использованием дельта смещения? Ведь здесь одна переменная служит параметром, определяющим размер другой переменной.
     
  14. wasm_test

    wasm_test wasm test user

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

    зы. а нафиг при сплайсинге нужен базонезависимый код и вычисление дельта-смещения?
     
  15. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    Но тогда как понять "Old_Code1 db size_code1 dup (?)"? Ведь получается, что size_code1 указывает на кол-во выделяемых байт.

    Дак ведь смотря для каких целей=) Зачем exe+dll, если можно просто exe?
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а нафиг в сплайсинге DLL? длл там не нужна совсем.

    прочитай мою статью про сплайсинг, там пример есть. чистая EXE, никакого базонезависимого кода и прочего геморроя.
     
  17. colobos

    colobos New Member

    Публикаций:
    0
    Регистрация:
    30 янв 2007
    Сообщения:
    22
    По поводу идеи переноса полного образа файла в процесс читал в каком-то из номеров хакера, только там с объяснениями не заморачивались. В статье, вроде, все понятно. Большое спасибо=)
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    дык это же элементарно.
    идея такова - ставят себе большую базу, далее выделяют по этому адресу в другом адресном пространстве память, равную по размеру размеру нашего исполняемого образа. Дальше постранично копируют свое тело в чужое адресное пространство, но по тем же виртуальным адресам. После такой операции все будет работать чики-пики, т.к. все нужное мы скопировали. Можно ставить сплайсинг на наши адреса и все ништяк.
     
  19. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Оно конечно хорошо, только рано или поздно - налетим на длл чью-нибудь. Или на такую же нестандартную базу.