Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.01.21;
Скачать: CL | DM;

Вниз

внедрение 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 вся ветка

Текущий архив: 2007.01.21;
Скачать: CL | DM;

Наверх




Память: 0.57 MB
Время: 0.037 c
2-1167218022
term1t
2006-12-27 14:13
2007.01.21
ADO + MS VFP


2-1167356401
Digest
2006-12-29 04:40
2007.01.21
Из-за чего может выскакивать ошибка?


15-1167799269
Думкин
2007-01-03 07:41
2007.01.21
На юге Москвы пасмурно, на СЗ столицы.. , на Дальнем Востоке +5.


3-1162205718
oleg_v
2006-10-30 13:55
2007.01.21
как обнулить (обновить) поле Autoincrement(+)


2-1168019670
Влад
2007-01-05 20:54
2007.01.21
File of...