Форум: "Потрепаться";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];
ВнизЗадачка для любознательных Найти похожие ветки
← →
Digitman (2002-08-06 15:57) [40]>Ученик
хммм ..
вот то, что я вижу в модуле controls.pas
procedure TWinControl.DefaultHandler(var Message);
begin
if FHandle <> 0 then
begin
with TMessage(Message) do
begin
if (Msg = WM_CONTEXTMENU) and (Parent <> nil) then
begin
Result := Parent.Perform(Msg, WParam, LParam);
if Result <> 0 then Exit;
end;
case Msg of
WM_CTLCOLORMSGBOX..WM_CTLCOLORSTATIC:
Result := SendMessage(LParam, CN_BASE + Msg, WParam, LParam);
CN_CTLCOLORMSGBOX..CN_CTLCOLORSTATIC:
begin
SetTextColor(WParam, ColorToRGB(FFont.Color));
SetBkColor(WParam, ColorToRGB(FBrush.Color));
Result := FBrush.Handle;
end;
else
Result := CallWindowProc(FDefWndProc, FHandle, Msg, WParam, LParam);
end;
if Msg = WM_SETTEXT then
SendDockNotification(Msg, WParam, LParam);
end;
end
else
inherited DefaultHandler(Message);
end;
???
← →
Ученик (2002-08-06 16:08) [41]>Digitman
У меня Delphi 6, в Delphi 5 надо посмотреть
реализацию
function FindControl(Handle: HWnd): TWinControl;
← →
DiamondShark (2002-08-06 18:43) [42]Как внедриться в чужой процесс -- моя идея была правильной. Метод с хуками работает и на Мастдае и на НТ. Можно хоть свой аналог CreateRemoteThread писать.
Тяжелее с объектами.
Конечно, жизнь упрощает условие, что обе проги (и ломаемая и ломатель) созданы одной версией компилера.
Свою версию FindControl надо писать под каждую версию компилера.
Операторы IS и AS работают только в пределах одного исполняемого модуля (EXE или DLL), поэтому для поиска и проверки объекта надо использовать TObject.ClassName и TComponent.Name, но надо точно знать имя класса, а то если надо добраться до какогото TMyCoolLabel = class(TLabel), то балалайка (либо копать глубже в RTTI).
Приведение типов TAnyClass(X) работает (AS не работает), но как подумаешь, что при этом происходит...
Виртуальные методы вызываются те что в EXE, а статические -- те что в DLL с хуком. Бр-р-р!!! Жуть!
Короче, оцените
http://moldovacc.md/acoulichev/hack.htm
← →
DiamondShark (2002-08-06 19:07) [43]А вот такое извращение можно использовать вместо IS если класс в другом модуле:
function IsClass(ClassRef: TClass; const ClassName: string): boolean; overload;
begin
Result := UpperCase(ClassRef.ClassName) = UpperCase(ClassName);
while not Result do
begin
ClassRef := ClassRef.ClassParent;
if ClassRef = nil then break;
Result := UpperCase(ClassRef.ClassName) = UpperCase(ClassName);
end;
end;
function IsClass(Obj: TObject; const ClassName: string): boolean; overload;
var
ClassRef: TClass;
begin
ClassRef := Obj.ClassType;
Result := IsClass(ClassRef, ClassName);
end;
Этого в моем коде, кстати, нет.
← →
Ученик (2002-08-06 19:13) [44]>DiamondShark © (06.08.02 18:43)
Классно
← →
Almaz (2002-08-06 23:38) [45]
> Digitman © (06.08.02 08:31)
> >Almaz
> Отличная идея ! Все верно -"плясать" нужно от получения
> указателя на Frm в АП DstPrg ! Дальше - уже проще дело пойдет.
> Только вот зачем атом создаешь ? Его искать нужно ! Он уже
> существует - достаточно только локализовать его хэндл
Насчет искать атом - это ты точно подметил, просто в 3 часа ночи после вечеринки у меня были проблемы с логическим мышлением :)))
← →
DiamondShark (2002-08-26 12:36) [46]Просто чтоб в даун не ушла ;)
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.008 c