Хай ол! Может ктонить подсказать метод определения размера АПИ процедуры? метод симулирования програмного кода отпадает - много мороки... Мож какие нить стандартные апи есть для этого или как это вручную сделать?...
Загрузить адреса из экспорта нужной DLL, отсортировать, вычесть адрес нужной процедуры из адреса следующей.
Quantum > Загрузить адреса из экспорта нужной DLL, отсортировать, вычесть адрес нужной процедуры из адреса следующей. И ты надеешься что это будет работать и не даст косяков, как-будто код Dll состоит из одних процедур причем каждая есть в экспорте
Нет, это будет работать не всегда. Есть функции, которые вообще не экспортируются, экспорт может состоять из одних переходников на реальные функции, но с практичесой точки зрения этот метод мне кажется эффективным. Всё зависит от реальных условий задачи.
Предлагаю простой метод поиска конца процедуры, команды ret(опкоды: C3, CB, C2 iw, CA iw), причем в процессе поиска нужно следить за всеми jmp/jcc встречающимися по пути до ret чтоб не прыгнули ниже найденного ret Лучше применить какой-нить дизассемблер.
Что понимается под размером процедуры? Размер занимаемого ей кода? С учётом или без вложенный функций? Размер до первого RET или до последнего? Первое несложно реализовать, просуммировав длины инструкций. Со вторым сложнее, здесь нужно анализировать инструкции
Да в том то и дело,что работать будет не всегда, почему - уже сказали... А надо 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 байт.. куска именно полноценного кода...и потом выделять под него память и копировать его туда.. Встречный впрос - как же все таки определить КОНЕЦ инструкции? или размер инструкции..писать свой дасм?
unixoid код процедуры может состоять из множества отдельных кусков кода. Такую оптимизацию делает VC++ 7+ Теоретически нужно быть готовым выделить под процедуру память размером в целую DLL.
green да не,дофига памяти не надо...все,переделал уже..теперь достаточно загрузить в память кусок кода,большего,чем 6 байт... IceStudent Что єто за дизассемблеры? можно гдето пример кода посмотреть?
unixoid > Да понятно) но задача стоит не мне знать размер функции(я и сам подсчитаю ) Я имел ввиду: "Есть такая штука: дизассемблеры длин инструкций." (c) IceStudent > Задача - определить размер всей процедуры, выделить память, скопировать туда весь код этой процы... Я тебя успокою, есть один простой и весьма(100%) надежный способ, загрузить всю DLL, если не по LoadLibrary то вручную ее настроить, тогда точно с размером не ошибёшься
unixoid Например, на wasm.ru. Не помню раздел, кажется, в "Инструментах". Да, "дизассемблеры". Catchy32. Хм.. А совсем недавно лежал в "Инструментах HT"…
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
unixoid Ясно. Так бы сразу. Вам, батенька, действительно придётся писать свой IDA, но даже это не даст 100% гарантии, так-как возвращать уравление можно не только через ret.
Я догадываюсь что человек просто банально хочет хук поставить патчем кода API, а ведь его часто можно и изящнее поставить без грубого патча.
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?
Задача - определить размер всей процедуры, выделить память, скопировать туда весь код этой процы... 2 unixoid: В процедуре могут встречаться: 1. JMP на другие процедуры 2. CALL других процедур Ты это как будешь настраивать для нового места процедуры ? Или пусть "новая" процедура пашет как хочет ? )
Пофиг ) Задача вот: определить размер куска кода,который весит более 6 байт...выделить память под него,скопировать его туда. и все Ага,пусть как хочет так и пашет ))