Сейчас на форуме: vsv1, _MBK_ (+3 невидимых)

 eXeL@B —› Вопросы новичков —› Запуск функции из длл. (Кроме файла dll ничего нету)
Посл.ответ Сообщение

Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 29 ноября 2007 15:04
· Личное сообщение · #1

В чем задача. У меня есть dll, но нет ее исходника и ни h ни lib файлов.
Мне нужно запустить некоторые функции из этой библиотеки. При этом с помощью IDA я могу вытащить список параметров функции.

Как мне проще всего это сделать???

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



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 29 ноября 2007 15:39
· Личное сообщение · #2

И еще один вопрос сюда.
Если использовать LoadLibrary, то какое надо передовать название в процедуру getProcAddress ( hndDLLHandle, 'calc_double' );
??0CEsCnclException@@QAE@ABV0@@Z
или
CEsCnclException
?

(в LordPE название функции указывается как ??0CEsCnclException@@QAE@ABV0@@Z)



Ранг: 29.8 (посетитель)
Активность: 0.020
Статус: Участник

Создано: 29 ноября 2007 18:07 · Поправил: Grom_
· Личное сообщение · #3

Смотри название функций с помощью утили типо dumpbin или типо такого (в Visual Studio 6/2003) с ключом /EXPORT, там Имя покажет в точности(до символа @ после помоему суммарный размер параметров в байтах ) как нужно вызывать. Это прокатит если Длл была сделанна на Си (у мя прокатывало). Учти там могут встретиться символы подчеркивания ,- они важны.

Выложи Длл.

А дальше хватай указатели функций через getProcAddress




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 29 ноября 2007 21:07 · Поправил: s0larian
· Личное сообщение · #4

shob_vas, качни dependency walker, он тебе сделает function name de-mangling. Потом напишешь свой header с class declarations, сделаешь GetProcAddress(полное_имя_со_всем_мусором) и cast полученного адреса в свой указатель.

Другой вариант, вчера нешёл в каком-то msdn блоге - сделать свой DLL с таким же классом и пустыми функциями - заглушками. В процессе получишь .lib который сможешь использовать вкупе с оригинальной либой. Геморно, но действенно. В таком случае просто будешь делать #include и компилер с линкером сделаюв все imports.



Ранг: 8.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 30 ноября 2007 00:01 · Поправил: D-503
· Личное сообщение · #5

D-503 пишет:
почему когда я пишу на фасме мне никакие lib и LoadLibrary не нужны просто пишу в импорт имя библиотеки и функции и нормально пашет надо только дллку в папку с прогой кинуть а на Си мне без lib или LoadLibrary не обойтись?


s0larian пишет:
D-503, эээ... для VC++ нужен import lib, либо сам делаешь LoadLibrary. Не уверен про fasm, но думаю что ты вызывал системные функции для которых у линкера есть import libs. Если нет, то давай пример в студию


весь пример выкладывать не буду... вот нужный кусок:

section '.idata' import data readable
;тут системные функции
library md, 'MD.DLL'

import md, md2, 'MD2', md4, 'MD4', md5, 'MD5'





Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 30 ноября 2007 01:55
· Личное сообщение · #6

D-503, слуш, мне интересно уже. Сделай мелкий пример корорый асемблируется, линкуется и вызывает одну функцию из dll-ки. Я кочну fasm и помучаю.



Ранг: 8.8 (гость)
Активность: 0=0
Статус: Участник

Создано: 30 ноября 2007 06:03
· Личное сообщение · #7

в атаче длл, исходник и ехе....

b75e_29.11.2007_CRACKLAB.rU.tgz - md.rar



Ранг: 203.3 (наставник)
Активность: 0.220
Статус: Участник
UPX Killer -d

Создано: 30 ноября 2007 18:40 · Поправил: AlexZ
· Личное сообщение · #8

shob_vas пишет:
В чем задача. У меня есть dll, но нет ее исходника и ни h ни lib файлов.
Мне нужно запустить некоторые функции из этой библиотеки. При этом с помощью IDA я могу вытащить список параметров функции.
Как мне проще всего это сделать???


Для разных языков/компиляторов по-разному. Для делфи, например, достаточно описать имя дллки и прототипы функций - этого хватит. Так же нужно учитывать тип вызова данной функции (читать соглашения о вызовах, stdcall, например ). Для МАСМ и, кажись, ТАСМ придется сначала создать .lib при помощи утили из комплекта - тебе уже подсказали.

-----
Я медленно снимаю с неё UPX... *FF_User*




Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 30 ноября 2007 22:32
· Личное сообщение · #9

s0larian AlexZ
Сейчас попробовал ваш совет. Сделал пробную _рабочую_ дллку и _заглушечную_ дллку с такими же функциями, но пустыми. Откомпили простенькую прогу под _заглушечную_ длл а потом поменял саму библиотеку (dll) на _рабочую_. И все работает!!! =)))
Большое спасибо!! Сейчас буду пробовать на библиотеке с експортами классов.




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 30 ноября 2007 23:09
· Личное сообщение · #10

D-503, прикольно. Сам компилер вставляет указатель на функцию и import.



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 01 декабря 2007 00:20
· Личное сообщение · #11

Создание заглушечной длл с экспортом/импортом целого класса так же работает!!!
В понедельник попробую проделать это еще раз на реальной программе =)



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 01 декабря 2007 00:31
· Личное сообщение · #12

Кстати интересен вот такой вопрос. Прога которую я собираюсь реверсить написана на VisuaC 6.0, а lib'ы по вышеописанной процедуре хотелось бы делать в Visual C .Net . Не может ли быть несовместимости?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 01 декабря 2007 01:12
· Личное сообщение · #13

Tестируй, кто знает. Если там DLL со statically linked runtime, то будет фачить. Но если dll, то ты, думаю, попал, т.к. imports будут другие.



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 03 декабря 2007 15:40
· Личное сообщение · #14

Начал делать хедер для библиотеки.
Не могу понять что такое
const CQuoteMsgInf::`vftable'
(это выдает вместе с другими процедурами dependence walker)
Как надо описать класс CQuoteMsgInf чтобы получить такую запись?



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 03 декабря 2007 18:15
· Личное сообщение · #15

Вроде создал хедер полностью аналогичный. Но при запуске приложения, выдается ошибка
"The procedure entry point X() could not be located in the dinamic link library"
Процедура X() существует, я проверил с помощью ependence Walker, какого могут быть причины такой ошибки?




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 03 декабря 2007 22:45
· Личное сообщение · #16

shob_vas, проверь mangled name. Скорее всего у тебя аргументы не те. Кста, проверь от чего там ты наследуешь...



Ранг: 11.4 (новичок)
Активность: 0.010
Статус: Участник

Создано: 03 декабря 2007 23:55
· Личное сообщение · #17

а как я по одной длл определю какой класс от какого наследуется???




Ранг: 387.4 (мудрец)
Активность: 0.170
Статус: Участник
системщик

Создано: 04 декабря 2007 21:12
· Личное сообщение · #18

shob_vas пишет:
а как я по одной длл определю какой класс от какого наследуется???

Анализом в IDA То есть тяжёлым и кропотливым трудом. Тебе ж надо создать header со всеми декларациями использованными в прототипах.


 eXeL@B —› Вопросы новичков —› Запуск функции из длл. (Кроме файла dll ничего нету)
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати