Сейчас на форуме: zombi-vadim, zds (+4 невидимых) |
eXeL@B —› Программирование —› Вопрос по GetProcAddress |
Посл.ответ | Сообщение |
|
Создано: 14 сентября 2013 23:34 · Поправил: MisterSmile · Личное сообщение · #1 Здравствуйте! Дописываю PE-загрузчик. Думал уж, конец скоро, как столкнулся с непредвиденной проблемой, реализуя аналог GetProcAdress. По спецификации она принимает первым параметром адрес загрузки DLL, вторым - указатель на строку, содержащую имя функции либо ординал. Хочу сделать так, чтобы она могла работать, как с именами функций, так и ординалами. И собственно вопрос: в случае, когда передается ординал, есть ли какие автоматизированные средства перевода, то бишь функции или макросы, из char* в DWORD? Например, если мне нужно преобразовать строку "07Е15A2C" в переменную DWORD со значением 07Е15A2C. Или нужно всё собственными ручками писать? Что-то я в интернете искал, но везде натыкался на вариант, когда строка переводится в последовательность значений, кодирующих каждый её символ. |
|
Создано: 14 сентября 2013 23:40 · Поправил: Veliant · Личное сообщение · #2 |
|
Создано: 14 сентября 2013 23:55 · Личное сообщение · #3 |
|
Создано: 15 сентября 2013 00:08 · Личное сообщение · #4 |
|
Создано: 15 сентября 2013 00:16 · Поправил: MisterSmile · Личное сообщение · #5 |
|
Создано: 15 сентября 2013 00:21 · Личное сообщение · #6 |
|
Создано: 15 сентября 2013 00:24 · Поправил: dosprog · Личное сообщение · #7 Ключевой момент здесь - сравнение параметра с числом 10000h (старшее слово 0?). Если параметр меньше, чем 10000h - то GetProcAddress считает, что нужно искать функцию по ординалу, если параметр больше , чем 10000h - то GetProcAddress считает, что это указатель на строку-имя функции. (Указатель в WIN32 PE-EXE всегда будет больше, чем 10000h). - - - - - - - - - >8 mov eax, 3 ;; -it's ORDINAL < 10000h ..... mov eax,402203h ;; -it's POINTER >10000h - адрес строки-имени функции ..... push eax push module_handle call GetProcAddress - - - - - - - - - >8 |
|
Создано: 15 сентября 2013 00:30 · Поправил: drin · Личное сообщение · #8 MisterSmile как то странно... с одной стороны вы пытаетесь реализовать совсем не тривиальную задачу, а с другой ваши познания спотыкаются на довольно простых вещах... а) вы не знаете как перевести Hex строку в DWORD б) переводить ничего не нужно, строка которая передается в GetProcAddress это PChar - 32битное число указатель на строку, если передается ordinal то это число и является тем порятковым номером ф-ии, а не указателем на имя... нужно просто рассматривать в таком случае этот PChar как DWORD и все, и как выше предложили если он ниже 0xFFFF это ординал,а если выше то ссылка на имя | Сообщение посчитали полезным: MisterSmile |
|
Создано: 15 сентября 2013 00:37 · Поправил: dosprog · Личное сообщение · #9 drin, уточю - рассматривать будет WIN32 при выполнении GetProcAddress. Если её что-то не устроит - вернёт ошибку, иначе вернёт адрес интересующей функции. Если даётся ординал - он должен присутствовать в этом подуле, если даётся указатель на строку-имя функции - то имя это должно присутствовать в числе экспортируемых имён. В любом случае, самое страшное, что тут может произойти, - это GetProcAddress вернёт ошибку. |
|
Создано: 15 сентября 2013 00:44 · Поправил: Veliant · Личное сообщение · #10 |
|
Создано: 15 сентября 2013 00:50 · Поправил: dosprog · Личное сообщение · #11 |
|
Создано: 15 сентября 2013 00:59 · Личное сообщение · #12 |
|
Создано: 15 сентября 2013 01:00 · Поправил: dosprog · Личное сообщение · #13 Veliant, >>вместо указателя на функцию будет указатель на имя функции в другой библиотеке. -- наверное, будет указатель на функцию в другой библиотеке ?... Dr0p, да тут речь идёт о простой маленькой утилитке, какую все или почти все когда-то для себя поделали. Десяток строчек на Си. Чуть больше на асме. ...хотя ... нет, видимо, я не до конца понял суть проблемы. Тут задумка, вроде, взрослая. Тогда я не понимаю, откуда проблема с конвертацией string->DWORD?.. |
|
Создано: 15 сентября 2013 01:04 · Поправил: dosprog · Личное сообщение · #14 |
|
Создано: 15 сентября 2013 01:06 · Личное сообщение · #15 dosprog Загрузчик нужен для не многих целей. Это загрузка из памяти, либо осевой для каких нить буткитов. В любых иных случаях есть системный. Да и GPA() позволяет по ординалам искать. Не пойму в чём проблема. | Сообщение посчитали полезным: dosprog |
|
Создано: 15 сентября 2013 01:30 · Личное сообщение · #16 > Тогда я не понимаю, откуда проблема с конвертацией string->DWORD?.. Строка это не массив символов загружаемый в стек в качестве аргументов. Строка в данном случае имеет фиксированный тип - PSTR. Префикс P" у типов означает Pointer". Это ссылка на строку, тоесть её адрес. Ординал же есть число. Лень смореть как там у виньапишки, для нтлдр прото конкретное: LdrGetProcedureAddress( IN HANDLE ModuleHandle, IN PANSI_STRING FunctionName OPTIONAL, IN ULONG Ordinal OPTIONAL, OUT PPOINTER ProcedureAddress ):NTSTATUS |
|
Создано: 15 сентября 2013 01:37 · Поправил: dosprog · Личное сообщение · #17 Dr0p Всё. Я понял. ТС просто грузит в память модуль, а потом хочет в памяти в этом модуле искать точки входа функций. Так это проще сделать вызовом GetProcAddress, если только не замышляется дизассемблер для DLL'ей. Как вы и написали в посте #15... Вопрос был - как сконвертировать строку "123h" в DWORD 123h, видимо, "123h" это будет задаваемый от-руки ординал. Вспомнилось, как это всё организовано было в WIN16 - там загрузка по ординалам делалась так: принимается FAR указатель на строку. Эта строка - или имя функции, или строка-ординал в виде "#123", где "123" - это WORD ординал 123dec. Правда, был и третий способ - в стек запихивался ординал в двоичном виде как DWORD, но старшее слово у него должно было быть 0000 (вроде сегмента в FAR-указателе). Ничего нового... |
|
Создано: 15 сентября 2013 01:43 · Личное сообщение · #18 |
|
Создано: 15 сентября 2013 02:41 · Личное сообщение · #19 У ординалов взведен старший бит адреса. т.е. Code:
| Сообщение посчитали полезным: ClockMan |
|
Создано: 15 сентября 2013 04:42 · Поправил: dosprog · Личное сообщение · #20 yagello, >>У ординалов взведен старший бит адреса. т.е. -- вы имеете в виду ординалы, находящиеся в таблице импорта PE-EXE файла. Но такое практически не встречается нигде. Так не делают. Можно, конечно, слинковать PE-EXE командой "C>TLINK32 /o ... ...", но делать такое - это заведомо иметь проблемы с переносимостью на другую версию той же Windows. ОРДИНАЛ ФУНКЦИИ НЕ ПОСТОЯНЕН В РАЗНЫХ ВЕРСИЯХ WIN32. Об этом и Микрософт предупреждала. Импорт в WIN32 PE-EXE - практически всегда только по именам функций. Конечно, импорт только из собственных библиотек можно реализовать и по ординалам. Для затруднения анализа кода. Но зачем это делать, я не знаю... Только злить людей. Что-то такое было в IDE. Вот, кстати, старинная утилитка на тему загрузки DLL'лей с помошью системного загрузчика: (LoadLibrary + GetProcAddress): d5aa_15.09.2013_EXELAB.rU.tgz - PROCADDR.RAR |
|
Создано: 15 сентября 2013 10:42 · Поправил: Dr0p · Личное сообщение · #21 yagello Code:
- старшее слово обнулено. |
|
Создано: 15 сентября 2013 13:55 · Личное сообщение · #22 |
|
Создано: 15 сентября 2013 14:20 · Личное сообщение · #23 |
eXeL@B —› Программирование —› Вопрос по GetProcAddress |
Эта тема закрыта. Ответы больше не принимаются. |