Форум: "WinAPI";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
Внизвнедрение Dll и Open/SaveDialog Найти похожие ветки
← →
lu0 © (2006-09-07 10:09) [0]Проблема с вызовом Open/SaveDialog.
Ситуация такая:
- родительская программа запускает другую в suspended режиме и внедряет в неё dll.
выглядит внедрение так:
function Hoook(DLL:String):Boolean;
var
Memory,LoadL:Pointer;
hThread,TID:THANDLE;
DLLSize,Written:dword;
begin
Result:=False;
try
DLLSize:=Length(DLL)+2;
Memory:=VirtualAllocEx(PROCESS.hProcess,Nil,DLLSize,MEM_COMMIT or MEM_RESERVE,PAGE_READWRITE);
If Memory=Nil
then Exit;
If not WriteProcessMemory(PROCESS.hProcess,Memory,PChar(DLL),DLLSize,Written)
then Exit;
LoadL:=GetProcAddress(GetModuleHandle("Kernel32"),"LoadLibraryA");
hThread:=CreateRemoteThread(PROCESS.hProcess,Nil,0,LoadL,Memory,0,TID);
If hThread=0
then Exit;
WaitForSingleObject(hThread,INFINITE);
Result:=True;
код практически один-в-один из примера Рихтера
после чего в вызываемой проге перестают работать диалоги Open/SaveDialog.
может кто скажет чего?
← →
Сергей М. © (2006-09-07 10:28) [1]Мало ли что творится в твоей DLL, которую ты внедрил в "прогу" ..
← →
lu0 © (2006-09-07 13:11) [2]dll не трогайте, там всё пучком ... даже если в ней всё поотключать, то проблема остаётся.
← →
Rouse_ © (2006-09-07 13:56) [3]
> dll не трогайте, там всё пучком ...
А известно ли Вам что каждая исправленная ошибка является предпоследней? :)
Попробуй внедрить эту библиотеку:library TestDLL;
uses
Windows,
Messages,
SysUtils;
procedure DLLEntryPoint(dwReason: DWORD);
begin
case dwReason of
DLL_PROCESS_ATTACH:
begin
MessageBox(0, "DLL_PROCESS_ATTACH", "DLL_PROCESS_ATTACH", MB_OK);
ExitThread(0);
end;
end;
end;
begin
DLLProc := @DLLEntryPoint;
DLLEntryPoint(DLL_PROCESS_ATTACH);
end.
← →
Джо © (2006-09-07 13:57) [4]> [2] lu0 © (07.09.06 13:11)
> dll не трогайте, там всё пучком ... даже если в ней всё
> поотключать, то проблема остаётся.
Значит, опять фазы Луны и проклятие Билла Гейтса.
← →
medved_68 © (2006-09-07 13:58) [5]lu0 Смотри:
begin
//а здесь мой супер пупер секретный код
end;
блинн код не фурычет....уважаемые помогите найти ошибку!!!!! :))
> может кто скажет чего?
А вообще подозрительно:
> WaitForSingleObject(hThread,INFINITE);
особенно INFINITE
← →
lu0 © (2006-09-07 15:43) [6]
> Rouse_ © (07.09.06 13:56) [3]
>
>
> > dll не трогайте, там всё пучком ...
>
> А известно ли Вам что каждая исправленная ошибка является
> предпоследней? :)
>
> Попробуй внедрить эту библиотеку:
попробовал :) такаяже фигня.
попробуй внедрять в ЭТОТ код
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
SaveDialog1: TSaveDialog;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Button1Click(Sender: TObject);
begin
SaveDialog1.Execute;
end;
end.
интересует открытие диалога
← →
lu0 © (2006-09-07 15:45) [7]
> Джо © (07.09.06 13:57) [4]
> medved_68 © (07.09.06 13:58) [5]
смотрите мой ответ № 6
> А вообще подозрительно:
> > WaitForSingleObject(hThread,INFINITE);
>
> особенно INFINITE
это щас гляну ... самому подозрительно стало
← →
Rouse_ © (2006-09-07 16:02) [8]Ну внедрил, все работает нормально.
Что-то ты делаешь не так...
← →
lu0 © (2006-09-07 16:07) [9]вот интересно бы узнать ЧТО?
как такую ситуацию отлаживать ?
← →
Rouse_ © (2006-09-07 16:12) [10]> как такую ситуацию отлаживать ?
Не как, а куда :)
Попробуй пока отложить ее в сторону и накидать 3 тестовых приложения. Одно ты уже нарисовал, второе которое будет заниматься внедрением и третье сама простейшая библиотека. Если и там не заработает - кидай исходник на любой файловый архив и давай сюда ссылку.
← →
Сергей М. © (2006-09-07 16:14) [11]
> как такую ситуацию отлаживать ?
Для начала удивленно чесать репу, обнаружив для себя факт того, что WaitForSingleObject() - это функкция, а не процедура.
← →
medved_68 © (2006-09-07 16:21) [12]И ждет она установки события по хендлу....hThread:=CreateRemoteThread(PROCESS.hProcess,Nil,0,LoadL,Memory,0,TID) ;
ООООчень подозрительно особенно hThread
Сергей М.
> Для начала удивленно чесать репу
Бис, маэстро!!!! :)))
← →
Сергей М. © (2006-09-07 16:36) [13]
> Бис, маэстро!
Да с превеликим удовольствием)) ..
Репу следует чесать ! На то она и репа головы)
Бездумно передирать чужой код без "чесания репы" - бессмыслица)
← →
lu0 © (2006-09-07 16:40) [14]
> WaitForSingleObject() - это функкция, а не процедура.
я конечно может и туплю ......
где смеяться ?
правильно ... ждёт когда объект перейдет в сигнальное состояние.
ждёт ДОХРЕНА_КАК_ДОЛГО...
для потока сигнальное состояние это "завершение потока"
или я сильно не прав ?
← →
Rouse_ © (2006-09-07 16:42) [15]Да чего вы к WaitForSingleObject то привязались? :)
У него после внедрения в той программе в которую внедрили (а не в той, которая ожидает отработки потока) перестают диалоги срабатывать.
← →
lu0 © (2006-09-07 16:43) [16]
> внедрения в той программе в которую внедрили
ВОТ ИМЕННО!!!
← →
Rouse_ © (2006-09-07 16:43) [17]
> или я сильно не прав ?
не обязательно, еще можешь поймать WAIT_FAILED
← →
Сергей М. © (2006-09-07 16:44) [18]
> lu0 © (07.09.06 16:40) [14]
> где смеяться ?
Известно где - при слове "лопата")
> ждёт ДОХРЕНА_КАК_ДОЛГО
Ну и дожидается хоть ?)
Ты ж ни одним членом , судя по коду, не пошевелил, чтобы определить это ..
Потому тебе и был дан намек на то , что это есть ф-ция, а ф-ция, как известно, призвана возвращать результат, а результат вфызова сей ф-ции, как известно, как раз и подскажет, дождался ли ты сего события)
← →
lu0 © (2006-09-07 16:46) [19]в догонку ...
есть такая замечательная библиотечка advApiHook, в ней для внедрения DLL две функции InjectDll и InjectDllAlt.
так вот с InjectDll проблема, а с InjectDllAlt диалоги работают ....
← →
lu0 © (2006-09-07 16:47) [20]
> Ты ж ни одним членом , судя по коду, не пошевелил, чтобы
> определить это ..
повторюсь ждёт она завершения ПОТОКА ...
перечитай мой ответ № 14 ... только медленно ...
а штобы сильнее смеялось "ЭКСКАВАТОР"
← →
lu0 © (2006-09-07 16:57) [21]
> еще можешь поймать WAIT_FAILED
проверил ... возвращает WAIT_OBJECT_0. т.е. поток завершается нормально
да и не должен он глючить
← →
Сергей М. © (2006-09-07 17:01) [22]
> lu0 © (07.09.06 16:57) [21]
> проверил ... возвращает WAIT_OBJECT_0
малацца.
с этого следовало начинать.
> поток завершается нормально
> да и не должен он глючить
"глючит", видимо, не поток, а библиотека твоя, которую этот поток грузит.
Ы ?
Вновь будешь упираться а-ля [2] ?
← →
Ketmar © (2006-09-07 17:07) [23]а вот мне сильно подозрителен suspend. как известно, при suspend прошла ещё далеко не вся синхронизация, ибо суспендится оно в ливере ядра. не тут ли затык?
← →
Ketmar © (2006-09-07 17:07) [24]тьфу. не "синхронизация", а "инициализация".
← →
Ketmar © (2006-09-07 17:08) [25]отчего бы не открыть приложение с правами отладчика, дождаться правильного места, а потом внедрять, пока не надоест? в принципе, потом даже можно отладчик "отстрелить", но лучше не надо -- это ни разу не документированный хак.
← →
lu0 © (2006-09-07 17:16) [26]
> Вновь будешь упираться а-ля [2] ?
у томился я с тобой спорить ...
у меня на тесте сейчас код из Rouse_ © (07.09.06 13:56) [3]
>с этого следовало начинать.
это я ПРОВЕРИЛ УЖЕ ДАВНО, когда я говорил что dll не трогать я это и подразумевал.
проблема где-то при внедрении-инициализации.
← →
lu0 © (2006-09-07 17:17) [27]
> отчего бы не открыть приложение с правами отладчика, дождаться
> правильного места, а потом внедрять, пока не надоест? в
> принципе, потом даже можно отладчик "отстрелить", но лучше
> не надо -- это ни разу не документированный хак.
подробнее можно ???
где смотреть/читать
← →
Ketmar © (2006-09-07 17:48) [28]> [27] lu0 © (07.09.06 17:17)
MSDN, Debugger API (или Debug API, не помню %-).
← →
lu0 © (2006-09-08 11:53) [29]Дядя Ketmar сильно молодец, однако.
Проблема была в запуске дочерней проги в суспендеде
всем спасибо.
← →
Ketmar © (2006-09-08 11:58) [30]> [29] lu0 © (08.09.06 11:53)
исключительно для восстановления справедливости: это не я, это SleepyHead в своё время. %-)
← →
Сергей М. © (2006-09-08 13:29) [31]
> lu0 © (08.09.06 11:53) [29]
>
> Дядя Ketmar сильно молодец, однако.
> Проблема была в запуске дочерней проги в суспендеде
Что ж ты тогда горбатого лепил тут нам, что, мол, типа все остальное работает, кроме как Open/SaveDialog ?)))
А как еще, спрашивается, иначе можно было истолковать твою "проблему" при таком ее изложении ?)
← →
lu0 © (2006-09-08 14:59) [32]
> Сергей М.
в том-то и была беда что немалой проге перестали работать ТОЛЬКО диалоги открытия-закрытия ........
прога запускалась нормально, нормально работала ..... хотя чего я объясняю вода это. да и устал я уже тебе.
короче тема закрыта.
← →
Сергей М. © (2006-09-08 15:13) [33]
> lu0 © (08.09.06 14:59) [32]
Ты видать с дуба упал)
Как вообще "прога" могла "работать", если ты не выполнил resume при условии что стартовал ты ее как suspended ?)
О каких вообще "диалогах" может идти речь, если единственный трэд suspended-стартованного тобой процесса не квантуется, пока ты не выполнишь для него resume ?) ... Трэд-то стоит) ... Он не то что "диалоги" - он вообще ничего не делает) ... Он "спит")
← →
lu0 © (2006-09-11 09:33) [34]
> Ты видать с дуба упал)
>
> Как вообще "прога" могла "работать", если ты не выполнил
> resume при условии что стартовал ты ее как suspended ?)
no comments ...............................
мож тебе весь код проекта сюда запостить ??? ну так, чтобы ты лучше разобрался ???
resume - это ОЧЕВИДНО !!!
← →
Сергей М. © (2006-09-11 12:16) [35]
> lu0 © (11.09.06 09:33) [34]
> resume - это ОЧЕВИДНО
Столь же очевидно должно быть то, что после старта процесса в suspended-режиме статический импорт еще не выполнен, в т.ч. не выполнен импорт commdlg32, отвечающего за работу упомянутых диалогов.
Подозреваю что внедряемая тобой DLL тем или иным образом импортирует тот же модуль commdlg32. Поскольку твоя DLL грузится в доп.треде процесса-"жертвы", загрузка и инициализация commdlg32 при этом происходит том же самом доп.треде, хотя ризюмированный тобой после этого процесс-"жертва" на полном праве считает, что commdlg32 загружен и инициализирован в осн.треде, со всеми вытекающими последствиями.
В этом скорее всего и проблема.
← →
Ketmar © (2006-09-11 13:23) [36]> [35] Сергей М. © (11.09.06 12:16)
о чём я и писал выше. я, например, трассирую до EP, а только тогда внедряюсь %-)
← →
Сергей М. © (2006-09-11 14:03) [37]
> Ketmar © (11.09.06 13:23) [36]
> я, например, трассирую до EP
Чего ты трассируешь-то ?)
Нечего еще трассировать)
← →
Ketmar © (2006-09-11 14:23) [38]> [37] Сергей М. © (11.09.06 14:03)
я в свете своих рассуждений о debug api. %-)
← →
Сергей М. © (2006-09-11 14:26) [39]
> я в свете своих рассуждений
Ты, извини уж, в тех самых "рассуждениях" такую чушь несешь, что ...) ..
← →
lu0 © (2006-09-11 15:09) [40]
> Столь же очевидно должно быть то, что после старта процесса
> в suspended-режиме статический импорт еще не выполнен, в
> т.ч. не выполнен импорт commdlg32, отвечающего за работу
> упомянутых диалогов.
> Подозреваю что внедряемая тобой DLL тем или иным образом
> импортирует тот же модуль commdlg32. Поскольку твоя DLL
> грузится в доп.треде процесса-"жертвы", загрузка и инициализация
> commdlg32 при этом происходит том же самом доп.треде, хотя
> ризюмированный тобой после этого процесс-"жертва" на полном
> праве считает, что commdlg32 загружен и инициализирован
> в осн.треде, со всеми вытекающими последствиями.
> В этом скорее всего и проблема.
эх, дядька-дядька .... вот написал бы это с самого начала .... цены бы не было !
Страницы: 1 2 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.01.21;
Скачать: [xml.tar.bz2];
Память: 0.55 MB
Время: 0.049 c