Определение размера процедуры..

Тема в разделе "WASM.WIN32", создана пользователем unixoid, 17 мар 2005.

  1. unixoid

    unixoid New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2005
    Сообщения:
    31
    Адрес:
    Ukraine
    Хай ол!:)

    Может ктонить подсказать метод определения размера АПИ процедуры? метод симулирования програмного кода отпадает - много мороки...

    Мож какие нить стандартные апи есть для этого или как это вручную сделать?...
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Загрузить адреса из экспорта нужной DLL, отсортировать, вычесть адрес нужной процедуры из адреса следующей.
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Quantum

    > Загрузить адреса из экспорта нужной DLL, отсортировать, вычесть адрес нужной процедуры из адреса следующей.



    И ты надеешься что это будет работать и не даст косяков, как-будто код Dll состоит из одних процедур причем каждая есть в экспорте :derisive:
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Нет, это будет работать не всегда. Есть функции, которые вообще не экспортируются, экспорт может состоять из одних переходников на реальные функции, но с практичесой точки зрения этот метод мне кажется эффективным. Всё зависит от реальных условий задачи.
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Предлагаю простой метод поиска конца процедуры, команды ret(опкоды: C3, CB, C2 iw, CA iw), причем в процессе поиска нужно следить за всеми jmp/jcc встречающимися по пути до ret чтоб не прыгнули ниже найденного ret :derisive:



    Лучше применить какой-нить дизассемблер.
     
  6. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Что понимается под размером процедуры? Размер занимаемого ей кода? С учётом или без вложенный функций?

    Размер до первого RET или до последнего?

    Первое несложно реализовать, просуммировав длины инструкций. Со вторым сложнее, здесь нужно анализировать инструкции
     
  7. unixoid

    unixoid New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2005
    Сообщения:
    31
    Адрес:
    Ukraine


    Да в том то и дело,что работать будет не всегда, почему - уже сказали... А надо 100%..





    Задача - определить размер всей процедуры, выделить память, скопировать туда весь код этой процы...





    Да,но что если будет на пример такой случай: 68 09 C3 FA 01 ?

    мы найдем C3, подумаем,что это ret.. хотя это push 01fac309h тут придется свой дасм писать - гиморно.. да и кто знает, последняя ли эта команда ret или нет...их может быть хоть и сотня в проце.. смотреть за джампами - это уже эмуляция кода...очень трудоемко, получается процессор(эмулятор его) надо руками писать :) не катит...





    Да понятно:)) но задача стоит не мне знать размер функции(я и сам подсчитаю :)), а прога должа их считать..на разных виндах НТ размер той или иной АПИ может менятся...





    Без учета всяких вложений итп..просто размер исполняемого кода.. на пример:

    push ebp

    mov ebp,esp

    xor eax,eax

    call 00AABBCCh

    mov esp,ebp

    pop ebp

    test eax,eax

    jz .bla

    ret

    .bla:

    dec eax

    ret

    размер ее равен 1+2+2+5+2+1+2+5+1+1+1=23, если я правильно подсчитал:) при чем ret`a тут два,так что на них ориентироваться нельзя...





    тоесть тут же тоже нужно проводить своего рода дизассемблирование? или как это реализовать?



    Хотя если поставить задачу иначе, то можно определять размер не всей функции, а куска ее,который занимает больше,чем 6 байт.. куска именно полноценного кода...и потом выделять под него память и копировать его туда..

    Встречный впрос - как же все таки определить КОНЕЦ инструкции? или размер инструкции..писать свой дасм?
     
  8. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine
    unixoid

    код процедуры может состоять из множества отдельных кусков кода. Такую оптимизацию делает VC++ 7+



    Теоретически нужно быть готовым выделить под процедуру память размером в целую DLL. :)
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine


    Есть такая штука: дизассемблеры длин инструкций. Они тебе помогут.
     
  10. unixoid

    unixoid New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2005
    Сообщения:
    31
    Адрес:
    Ukraine
    green

    да не,дофига памяти не надо...все,переделал уже..теперь достаточно загрузить в память кусок кода,большего,чем 6 байт...

    IceStudent

    Что єто за дизассемблеры? можно гдето пример кода посмотреть?
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    unixoid

    > Да понятно:)) но задача стоит не мне знать размер функции(я и сам подсчитаю :))



    Я имел ввиду: "Есть такая штука: дизассемблеры длин инструкций." (c) IceStudent



    > Задача - определить размер всей процедуры, выделить память, скопировать туда весь код этой процы...



    Я тебя успокою, есть один простой и весьма(100%) надежный способ, загрузить всю DLL, если не по LoadLibrary то вручную ее настроить, тогда точно с размером не ошибёшься
     
  12. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    unixoid

    Например, на wasm.ru. Не помню раздел, кажется, в "Инструментах". Да, "дизассемблеры". Catchy32.



    Хм.. А совсем недавно лежал в "Инструментах HT"…
     
  13. unixoid

    unixoid New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2005
    Сообщения:
    31
    Адрес:
    Ukraine
    Asterix



    A... ponyal,voprosov net;)



    IceStudent

    Sorry za tot tupoj vopros,tipa gde najti:)) byvaet u menya,na rabote kogda gonyayut so vseh storon:))..



    Spasibo,uzhe nashel neskol`ko variantov takih disasmov..pishu svoj..a to malo li,mozh u kaspera itd ono zaregano kak hack-tool :lol:
     
  14. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    unixoid

    Ясно. Так бы сразу. Вам, батенька, действительно придётся писать свой IDA, но даже это не даст 100% гарантии, так-как возвращать уравление можно не только через ret.
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Я догадываюсь что человек просто банально хочет хук поставить патчем кода API, а ведь его часто можно и изящнее поставить без грубого патча.
     
  16. unixoid

    unixoid New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2005
    Сообщения:
    31
    Адрес:
    Ukraine


    Ya uzhe pisal,chto vsya funkciya mne ne nuzhna...mne vsego lish polnocennyj kusok koda nuzhen,kotoryj vesit bolee 6bytes...

    Dasm pochti gotov...budet rabotat` kak tot zhe Catchy,te desh emu addres,on govorit dlinnu instrukcii..





    Aha :)))





    Nu SetWindowsHookEx ne prohodit...:

    1. moj kod ne dolzhen ispol`zovat` windowskih dll. ni odnoj,dazhe ntdll.dll

    2. ne vsegda prilozhenie okonnoe... i eshche neskol`ko momentov..

    Import Table tozhe ne katit...- za chastuyu eti API vyzyvayutsya zherez LoadLibraryA/GetProcAddress...

    Chto,eshche est` chtoto dlya NT?
     
  17. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Задача - определить размер всей процедуры, выделить память, скопировать туда весь код этой процы...



    2 unixoid:

    В процедуре могут встречаться:

    1. JMP на другие процедуры

    2. CALL других процедур



    Ты это как будешь настраивать для нового места процедуры ? Или пусть "новая" процедура пашет как хочет ? :))
     
  18. unixoid

    unixoid New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2005
    Сообщения:
    31
    Адрес:
    Ukraine


    Пофиг :))

    Задача вот: определить размер куска кода,который весит более 6 байт...выделить память под него,скопировать его туда. и все:)



    Ага,пусть как хочет так и пашет :)))
     
  19. unixoid

    unixoid New Member

    Публикаций:
    0
    Регистрация:
    2 мар 2005
    Сообщения:
    31
    Адрес:
    Ukraine
    Кусок кода ессно имеет начало там же,где и сама проца...
     
  20. green

    green New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2003
    Сообщения:
    1.217
    Адрес:
    Ukraine