Сейчас на форуме: morgot, 2nd, Rio, CDK123, zds, tyns777, tihiy_grom, rmn (+5 невидимых)

 eXeL@B —› Программирование —› Вопрос по FakeDll
Посл.ответ Сообщение


Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 13 июля 2008 13:03
· Личное сообщение · #1

В примере к FakeDll dll экспортируются только процедуры, а я хочу импортировать с моёй фэйк-длл функцию, пробывал не получается. Можно ли это, или нет, и как?

-----
Лучше быть одиноким, но свободным © $me




Ранг: 617.3 (!), 677thx
Активность: 0.540
Статус: Участник

Создано: 13 июля 2008 13:29
· Личное сообщение · #2

В каком именно примере?
Как пытался?
Правильно заданный вопрос содержит в себе минимум половину ответа!!!!




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 13 июля 2008 15:20
· Личное сообщение · #3

Что за процедуры и функции? Это в дельфи такое разделение, в асме нет понятия процедура и функции, они все функции. И как ты пробовал? Пример где? И вопрос вообще по-русски задай.




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 13 июля 2008 16:24
· Личное сообщение · #4

Простой примерчик: в длл функция возращает сумму двух чисел, и по нажатии на кнопку вызывается эта ф-ия, а результат выодим в кэпшене.
Вот исходники:

3fea_13.07.2008_CRACKLAB.rU.tgz - for forum.7z

-----
Лучше быть одиноким, но свободным © $me





Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 13 июля 2008 19:54 · Поправил: borov
· Личное сообщение · #5

дело не в том что это, функция или процедура, а в том что оно не хочет(или я не так что-то делаю) работать с ф-ми или процедурами с параметрами.
В примере который был вместе с фэйк-длл:
...
// переменая через которую будут работать с процедурой
Proc : procedure;
...
procedure TForm1.Button6Click(Sender: TObject);
begin
Proc := FakeDll.GetFDProcAddress(Proc1Name); // присваиваем адрес процедуры
Proc; // вызываем процедуру
end;
...

А я хочу так:
...
Proc : procedure(n: integer);
...
procedure TForm1.Button6Click(Sender: TObject);
begin
Proc := FakeDll.GetFDProcAddress(Proc1Name); // присваиваем адрес процедуры
Proc(2); // вызываем процедуру
end;
...

выдает ошибку
при нормальном вызове все работает

может я не правильно объявляю переменую, или еще что-то не так делаю

-----
Лучше быть одиноким, но свободным © $me





Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 13 июля 2008 21:35
· Личное сообщение · #6

зависит от соглашений.

Либо объявляй так
...
// переменая через которую будут работать с процедурой
Proc : procedure(n: integer); stdcall;
...

Либо так
...
// переменая через которую будут работать с процедурой
Proc : procedure(n: integer); cdecl;
...

-----
Yann Tiersen best and do not fuck




Ранг: 63.8 (постоянный), 2thx
Активность: 0.030
Статус: Участник

Создано: 13 июля 2008 22:04 · Поправил: drin
· Личное сообщение · #7

PE_Kill
на самом деле и со стандартным борладовским fastcall все будет нормально, главное объявлять их абсолютно идентично

borov
когда ты вызывал Proc(2); как у тебя она была объявлена в FakeDll?




Ранг: 793.4 (! !), 568thx
Активность: 0.740
Статус: Участник
Шаман

Создано: 13 июля 2008 22:15
· Личное сообщение · #8

drin пишет:
на самом деле и со стандартным борладовским fastcall все будет нормально

Не понял, если proc в dll - stdcall, то как она может корректно работать при вызове ее как fastcall?

-----
Yann Tiersen best and do not fuck




Ранг: 63.8 (постоянный), 2thx
Активность: 0.030
Статус: Участник

Создано: 13 июля 2008 22:57 · Поправил: drin
· Личное сообщение · #9

PE_Kill
я же говорю что объявлять абсолютно идентично, если в fake_dll объявлять stdcall то и в том месте от куда вызывать объявлять как stdcall... или автор мапит не свою dll и не знает какие там соглашения внутри?




Ранг: 533.6 (!), 232thx
Активность: 0.450
Статус: Uploader
retired

Создано: 13 июля 2008 23:11
· Личное сообщение · #10

у меня stdcall, а вобще это я решил потренироватся фэйкать дллки, для того чтобы за собой не таскать кучу длл'ок

-----
Лучше быть одиноким, но свободным © $me




Ранг: 50.3 (постоянный), 2thx
Активность: 0.020
Статус: Участник

Создано: 13 июля 2008 23:30
· Личное сообщение · #11

Не уверен, но помоему должно быть через указатель:

@Proc := FakeDll.GetFDProcAddress(Proc1Name);

И понавтыкать кучу проверок. =)

Но самое простое - в отладчике посмотреть кто там что со стеком делает =)




Ранг: 199.6 (ветеран), 12thx
Активность: 0.10
Статус: Участник
www.uinc.ru

Создано: 07 октября 2008 23:35 · Поправил: Модератор
· Личное сообщение · #12

Правильно описанный прототип и указатель на него это - уже пол дела.
Дельфи уже лет 8 в глаза не видел, могу ошибаться, но должно быть примерно так:
Code:
  1. var
  2.   proc: function(:integer) :integer; stdcall;
  3. begin
  4.   @proc = FakeDll.GetFDProcAddress(ProcName);
  5.   result = proc(666);
  6. end;


соответсно calling convention и тип результата подгоняется под конкретные нужды.



Ранг: 65.7 (постоянный)
Активность: 0.050
Статус: Участник

Создано: 08 октября 2008 20:15 · Поправил: Halt
· Личное сообщение · #13

type
TDLLFunction = function(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;

var
HdeProcess: TDLLFunction;


.........................
hinstDLL := LoadLibrary(Pchar(dll_name2));
if hinstDLL=0 then
begin
exit;
end;
HdeProcess := TDLLFunction(GetProcAddress(hinstDLL,'HideProcess'));
if not Assigned(HdeProcess) then
begin
FreeLibrary(hinstDLL);
hinstDLL:=0;
exit;
end;
try

HdeProcess(GetCurrentProcessId, true);
except
end;


в ДЛЛ

function HideProcess(pid:DWORD; HideOnlyFromTaskManager:BOOL):BOOL; stdcall;

может поможет....


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


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