Загрузка с произвольного адреса без секции релоков

Тема в разделе "WASM.WIN32", создана пользователем UTeX, 21 дек 2007.

  1. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    asd
    почему?

    время?
     
  2. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    к примеру код, который получает управление через seh. На него веть нет переходов через call/jmp. Вообще конечно можно, но очень сложно все варианты прощитать. И ещё, зачем тебе это надо? Может проще расчистить то место, куда должен грузиться образ в оригинале?
     
  3. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    asd +1
    PaCHER
    а если так
    Код (Text):
    1.    
    2.     mov sel, cs
    3.     mov _offset, @f ;fixup
    4.     db 9ah ;far call
    5.     _offset dd @some_label ; fixup?
    6.     sel dw 0  
    7. @@:
    А если результат джампа зависит от апишки ? А если результать джампа вообще на зависит от текущего модуля (к примеру модуль експотрирует функции сам их не вызывая)? А если результат зависит от хитро подкоректированной чем-то случайной величины?
    Кроме безошибочного дизасма, очень мощьного анализатора понадобится и эмулятор. Короче имхо задача полноценно приделать фиксапы к неизвестному модулю настолько сложна насколько нереальна.
     
  4. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    rain
    mov sel, cs
    mov _offset, @f ;ну тут из структуры понятно что @f это imm32 и можно определить нужно фиксить или нет
    db 9ah ;far call
    _offset dd @some_label ; тут еще проще, сразу ясно что нужно фиксить и то если переход идет в нашем адресном пространстве.
    sel dw 0

    И вообще вопрос был не в том чтоб придумать черезжопную ситуацию для фиксера релоков.

    Всмысле от апишки, непонял смысл?
    Адрес то ты всеравно выщитывать будеш относительно базы которая и будет под фиксами.
    Опять приведи пример как от этой рандомной величины ты будеш выщитывать прямой джамп на адрес, базу всеравно будеш брать.
    нет ничего нериально, также говорили и про декомпилер для С++ но результат на лицо.
    Имха задача решаема, просто нужно реализацию писать не просто одним методом, а несколькими, для отлова всех ситуаций.
     
  5. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    PaCHER
    Ну вот к примеру есть массив указателей на функции в памяти.
    Код (Text):
    1. base:
    2. dd Proc1
    3. dd Proc2
    4. dd Value ;не указатель, фиксить не нада
    5. dd Proc3
    6. ...
    Вызывается к примеру так:
    Код (Text):
    1. ...
    2. call ApiFunction ;заведомо никогда не вернёт значение 2
    3. lea ecx, base
    4. call [ecx + 4*eax]
    Т.е. результат джампа зависит от апи функции но не проверяется в модуле напрямую. Так же само вместо вызова апи можно вызвать какой-то ГПСЧ проверить резульат что удовлетворяет нашим условиям т.е. прыгает именно на функции а не на данные и прыгнуть.
    Ещё вариант например результать завит не от API а от некоторого параметра не проверяемом в нашем модуле. Примерно так:
    Код (Text):
    1. Gate proc Index: DWORD, Param1: DWORD, Param2: DWORD ...
    2.  
    3. push param2
    4. push param1
    5. push ...
    6.  
    7. lea ecx, base
    8. mov eax, Index
    9. jmp [ecx + eax*4]
    10. ...
    Т.е. вызывающий модуль (нам не известный) может вызвать только функции с определёнными параметрами, что тогда?
    сомнительно :) Насколько мне известно нет не только упоминаний о успешных результах такой работы но таже внятных предположений что это вообще возможно
     
  6. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    дык если правильный переход затирается и не используется или используется но до этого и совсем для других целей )
     
  7. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    на счёт моего предыдущего примера, до jmp eax ты отдизасмишь, а куда переход то идёт? если нет эмулятора, то дальше не сможешь дизасмить. Пусть топикстартер скажет, зачем ему это надо, может решения проще есть
     
  8. PaCHER

    PaCHER New Member

    Публикаций:
    0
    Регистрация:
    25 мар 2006
    Сообщения:
    852
    rain
    Нащет примеров с апи, это обычные кейсы, и я писал выше что эта структура детектится, и вся сложность состоит в определении ее границ, даже ида не полностью справляется с задачей.

    + Эмулятор тут тоже не поможет, т.к. эта функция может вызыватся когда темпиратура на марсе упадет на 50 градусов.
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Константы тоже разные бывают... если есть какое-то поле со флагами, в котором задействованы 30 бит, тогда вот такое
    Код (Text):
    1. mov ebx,410000h ; оптимизирующий компилятор запросто может поместить часто используемую константу в отдельный регистр
    2. ...
    3. test [flags_old], ebx
    4. jz ...
    5. ...
    6. test [flags_new], ebx
    7. jnz ...
    8. ...
    И чтобы отличить этот случай от
    Код (Text):
    1. mov ebx, offset unk_410000
    2. ...
    3. xor [ebx],eax
    4. ...
    придётся прочёсывать кучу кода...
     
  10. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Нужен был просто загрузчик нормальный - я вот написал но увы иногда он не работает
    когда не получается выделить память по предпочитаемому адресу либо если и получается то релоков нет

    Как быть в таком случае?
     
  11. wasm_test

    wasm_test wasm test user

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

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    только жосско ограничить лимит, чтоб отловить моменты обращения к АПИ
     
  13. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Никак не вкуривается твое предложение :)
    Что значит "если и получается то релоков нет"?
    Если не получается, они есть?

    to all:
    Потсоны, йазык русский выучите, а? Семачки йесть?
    Букафки там, запитые разные и прочие канструкции (не кейзы).
    Каг гопы, даже на олбанский не тьянедь.
    И не надо умничать, что я и сам его не знаю - без вас известно :)
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    потсан ты чо?! зачем иго учить фсе и таг панимайут што мы пишим
     
  15. nester7

    nester7 New Member

    Публикаций:
    0
    Регистрация:
    5 дек 2003
    Сообщения:
    720
    Адрес:
    Russia
    Наркоёжик, ни иго - их многа :)
    Та и фапще, сапейте, фацаны, эта тах,
    крик души, нагуи (не кансоль) негаму нинужный.
    И тах фсё ясна.
     
  16. yuzvir

    yuzvir New Member

    Публикаций:
    0
    Регистрация:
    20 май 2005
    Сообщения:
    97
    пытался написать что-то типа такой тулзы
    результат можно посмотреть здесь
    http://usar.pp.ru/download/index.php?path=&download=rebaser.0.1.rar
    часто не работает, особенно на прогах скомпиленных борландом.
    блокнот и калькулятор вроде работают без проблем (хз даже почему :)))
     
  17. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Возникла странная пролблема - все библиотеки грузятся с помощью LoadLibrary(..) кроме MSVCRxx.DLL
    кто-то сталкивался?

    ошибка ERROR_MOD_NOT_FOUND 126
    The specified module could not be found

    и GetModuleHandle(..) ничего не дает - хотя модуль уже загружен в память

    напишите если кто встречал такое поведение
     
  18. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    не найдена dll на диске

    Как ты его увидел?
     
  19. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    Ну эта CRT либа уже загружена вместе с моим загрузчиком - я ведь на МСВС пишу.
    почему же остальные модули найдены?
     
  20. UTeX

    UTeX New Member

    Публикаций:
    0
    Регистрация:
    19 окт 2007
    Сообщения:
    584
    тупо делаю LoadLibrary("msvcr80.dll")
    result == 126

    в чем бок подскажите