Базонезависимый код, где отладить?

Тема в разделе "WASM.BEGINNERS", создана пользователем JacK3, 6 авг 2009.

  1. JacK3

    JacK3 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    12
    Здравствуйте!
    Вот пытаюсь разобраться с базонезависимым кодом в программах. Сразу возник вопрос, а где на его работу можно посмотреть в действии? И логично, я пошёл сразу, менять ImageBase свеже скомпилированного экзешника, и отладить код в ОЛЕДБГ. Но тут появилась куча фигни. Да, дельта смещение видно, но при вызове меседжбокса call не вызывает ф-цию, а прыгает на jmp который и прыгает в ф-цию, но адрес то(в jmp) не патченый! И как же cделать чтобы в call находился непосредственный адрес функции, без дополнительного поиска адреса? Например в исходниках МсиРема такое прокатывает!
    Кстати, можно ведь обойтись без дельты, путём вычисления смещения до переменных и суммирования текущего адреса с этим смещением?
     
  2. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    в базонезависимом коде адреса АПИ-функций должны быть получены динамически, а не опираться на ИМПОРТ.

    PS: либо добавь к смещению джампа свою дельту и будет тебе счастье :)
     
  3. JacK3

    JacK3 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    12
    А вот в исходниках МсРема это работает! Я бы срадостью добавил и к джампу, но его пишу не я а компилятор! А вычислять смещения до этого джампа это по-индусски!
    А как можно отловить инжект в отлаживаемый процесс? Ну.. представляю примеро, это если отлаживать два процесса паралельно Получить результат VirtualAllocEx, и уже искать этот адресс в отлаживаемом коде? А можно проще?
     
  4. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    > Кстати, можно ведь обойтись без дельты
    получаешь EIP и складываешь с адресом, или что-то вроде такого (примерно такой код был в пакере от virogen):

    Код (Text):
    1. ; shellcode starts here
    2. call __start
    3. zeroday1 dd 12345678
    4. zeroday2 dd 12345678
    5. ;...
    6. zeroday1_addr = 4*0
    7. zeroday2_addr = 4*1
    8. ;...
    9. __start:
    10. pop ebp ; address of __start
    11. mov eax, ebp
    12. mov ecx, eax
    13. mov eax, [eax+zeroday1_addr] ; get zeroday1 value
    14. lea ecx, [eax+zeroday2_addr] ; get zeroday1 address
     
  5. dendi

    dendi New Member

    Публикаций:
    0
    Регистрация:
    3 сен 2007
    Сообщения:
    233
    fix: get zeroday2 address
     
  6. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    JacK3
    Межсегментное ветвление(Call far), в юзермоде база сегмента кода нулевая, тоесть смещение в сегменте равно его адресу, а селектор 0x1B(KGDT_R3_CODE | RPL_MASK), но всёравно инструкция требует указатель на описатель ветвления(Sel:Offset), поэтому было решено использовать код:
    Код (Text):
    1.     call Delta
    2.  Delta:
    3.     add dword ptr [esp],(offset Return - offset Delta)
    4.     push BranchAddress
    5.     ret
    6.  Return:
     
  7. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    jmp kernel32.GetModuleHandle ;это таблица импорта
    ...
    Call myexe.GetModuleHandle ;это вызов
    ....
    опкод кэла - 0xE8 0x00000000 ;дворд - это смещение на джамп относительно кэла
    опкод дальнего джампа - 0xE9 0x00000000 ;дворд - смещение функции относительно джампа


    можно
    поставить в твоем коде int3
    Целевой процесс запустить на выполнение
    При инжекте олька остановится на твоем коде (точнее на int3)
     
  8. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    А что мешает изменить базу образа в момент линковки? Причем на такую, которую загрузчик виндовс не выделит. Например на 0. Тогда загрузишься по нормальной базе и протестишь код.
     
  9. intel_x128

    intel_x128 New Member

    Публикаций:
    0
    Регистрация:
    17 май 2009
    Сообщения:
    345
    MSoft
    неа
    не загрузится
    Если не стоит галка "длл" и нет релоков - образ загружен не будет
     
  10. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    если не ставить флаг relocation_stripped, то будет
    а еще можно поставить флаг dynamic_image_base - тогда тем более будет
     
  11. JacK3

    JacK3 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    12
    Смещение переменных вычислять удобней с помощью макросов компилятора)) Так и буду делать!
    intel_x128 Ну это ясен! Приведу свой код и Рема.
    Мой:
    Код (Text):
    1. start:
    2. jmp next
    3. MsgBoxCaption  db "Пум пурум",0
    4. MsgBoxText     db "Ало",0
    5. next:
    6. call delta
    7. delta:
    8. pop ebx
    9. sub ebx,offset delta
    10. ;---------------------------------
    11. push MB_OK
    12. lea esi, [EBX + offset MsgBoxCaption]
    13. push esi
    14. lea esi, [EBX + offset MsgBoxText]
    15. push esi
    16. push 0
    17. lea eax, [ebx+MessageBox]
    18. call eax
    Как делает Рем:
    Код (Text):
    1. ;------------------
    2. InjectCode:
    3.   call     $+5
    4.   pop      esi
    5.   sub      esi, $-InjectCode-1
    6.   push     0
    7.   lea      eax, [esi+caption-InjectCode]
    8.   push     eax
    9.   lea      eax, [esi+text-InjectCode]
    10.   push     eax
    11.   push     0
    12.   call     [esi+p_MessageBox-InjectCode]
    13. ;--------------------------------
    14. p_MessageBox dd 0; выделил память под новый адрес
    15. ;--------------------------------
    16.   mov      eax, [MessageBox]
    17.   mov      [p_MessageBox], eax;запомнил!
    MSoft А можешь подсказать с какими парамитрами можно линковать в МАСМ(32)?
     
  12. JacK3

    JacK3 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    12
    intel_x128 В своём коде Рем не патчит jmp. Кстати, а в какое место инт ставить?
     
  13. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Код (Text):
    1. Microsoft (R) Incremental Linker Version 5.12.8078
    2. Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
    3.  
    4. usage: LINK [options] [files] [@commandfile]
    5.  
    6.    options:
    7.  
    8.       /ALIGN:#
    9.       /BASE:{address|@filename,key}
    10.       /COMMENT:comment
    11.       /DEBUG
    12.       /DEBUGTYPE:{CV|COFF}
    13.       /DEF:filename
    14.       /DEFAULTLIB:library
    15.       /DLL
    16.       /DRIVER[:{UPONLY|WDM}]
    17.       /ENTRY:symbol
    18.       /EXETYPE:DYNAMIC
    19.       /EXPORT:symbol
    20.       /FIXED[:NO]
    21.       /FORCE[:{MULTIPLE|UNRESOLVED}]
    22.       /GPSIZE:#
    23.       /HEAP:reserve[,commit]
    24.       /IMPLIB:filename
    25.       /INCLUDE:symbol
    26.       /INCREMENTAL:{YES|NO}
    27.       /LARGEADDRESSAWARE[:NO]
    28.       /LIBPATH:dir
    29.       /MACHINE:{ALPHA|ARM|IX86|MIPS|MIPS16|MIPSR41XX|PPC|SH3|SH4}
    30.       /MAP[:filename]
    31.       /MAPINFO:{EXPORTS|FIXUPS|LINES}
    32.       /MERGE:from=to
    33.       /NODEFAULTLIB[:library]
    34.       /NOENTRY
    35.       /NOLOGO
    36.       /OPT:{ICF[,iterations]|NOICF|NOREF|NOWIN98|REF|WIN98}
    37.       /ORDER:@filename
    38.       /OUT:filename
    39.       /PDB:{filename|NONE}
    40.       /PDBTYPE:{CON[SOLIDATE]|SEPT[YPES]}
    41.       /PROFILE
    42.       /RELEASE
    43.       /SECTION:name,[E][R][W][S][D][K][L][P][X]
    44.       /STACK:reserve[,commit]
    45.       /STUB:filename
    46.       /SUBSYSTEM:{NATIVE|WINDOWS|CONSOLE|WINDOWSCE|POSIX}[,#[.##]]
    47.       /SWAPRUN:{CD|NET}
    48.       /VERBOSE[:LIB]
    49.       /VERSION:#[.#]
    50.       /VXD
    51.       /WARN[:warninglevel]
    52.       /WINDOWSCE:{CONVERT|EMULATION}
    53.       /WS:AGGRESSIVE
    выбирай нужное.

    А вообще, получать дельту совершенно не обязательно. Код можно тестить и в обычном приложении. Если ты вдруг неправильно получишь дельту или не так присвоишь адрес переменной, твоя программа просто упадет. Лично я не вижу совершенно никакой необходимости в том, чтобы загружать код не по своему адресу.

    Но если уж так сильно прям горит иметь дельту, отличную от 0, то просто выдели память через VirtualAlloc, скопируй туда базонезависимый код и сделай туда прыжок - эдакий эмулятор инжекта
     
  14. JacK3

    JacK3 New Member

    Публикаций:
    0
    Регистрация:
    17 янв 2009
    Сообщения:
    12
    Спасибо!
     
  15. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    жертва для отладок - ехе/длл из кучи нопов/инт3. в фасме/масме и лепится. или сразу ваш шелл в ехе слинкить.
     
  16. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494