Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
6-1155319975
anton773
2006-08-11 22:12
2007.01.21
ftp или http


15-1167591950
Piroxyline
2006-12-31 22:05
2007.01.21
С наступившим!


4-1157308645
иван8511
2006-09-03 22:37
2007.01.21
Печать на матричном принтере.


2-1167987067
Wahnsinng
2007-01-05 11:51
2007.01.21
Автоматичсекий переход


9-1140608209
grisme
2006-02-22 14:36
2007.01.21
OpenGL Extensions





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский