Twister - исходники надо выкладывать, а не бинарный EXE. Где гарантия, что просто битмап с текстом не скопировал на DC?
Это просто коллекция системных файлов для разных версий винды. Пригождается при использовании недокументированных возможностей в своих программах.у тебя на сайте в разделе «Sys Files», на каждую ОС лежат какие-то архивы – это патчи обновлений
awl100Alex писал(а):Какой Хакер?? Что за проект??
Twister писал(а):Второй же основан на том, что jangle ошибся относительно того, что TextOutW последняя инстанция для вывода текста. На самом деле их только в юзермоде еще несколько, неговоря уже о ядре.
Я просто что хочу доказать - в винде есть тыща и один способ вывести текстовую графику на DC.
; Для WinXP
.text:77F17E3F mov eax, 1092h
.text:77F17E44 mov edx, 7FFE0300h
.text:77F17E49 call dword ptr [edx]
.text:77F17E4B retn 24h
ExtTextOutInternal: function (hDC,
nXStart,
nYStart,
Unk1,
Unk2: DWORD;
lpString: PChar;
cbString, //кол-во выводимых символов
Unk3,
Unk4: DWORD): DWORD; stdcall;
var
pCode: pointer;
hGDI, Len, Dif: DWORD;
pOpcode: pbyte;
begin
hGDI := GetModuleHandle('Gdi32.dll');
if hGDI = 0 then
hGDI := LoadLibrary('Gdi32.dll');
pCode := GetProcAddress(hGDI, 'TextOutA');
repeat
Len := SizeOfCode(pCode, @pOpcode);
if pOpcode^ <> $E8 then
pCode := pointer(DWORD(pCode) + Len);
until (Len = 5) and (pOpcode^ = $E8);
asm
mov eax, pCode
inc eax
mov eax, dword[eax]
mov Dif, eax
end;
ExtTextOutInternal := pointer(DWORD(pCode) + Dif + 5);
end;
Gdi32 экспортирует несколько функций: TextOutA, TextOutW (это те, о которых ты говорил как о последней инстанции). Есть еще ExtTextOutA, ExtTextOutW которые никак(!) не используют предыдущие.
Я надеюсь что я не зря все это расписывал и ты, jangle, согласишься со мной по поводу неуниверсальности твоего метода.
Рассказывая про политику мелкомягких я имел ввиду общий случай. В нашем же случае цепочка не сильно длинная. Ответ на вопрос - скорее всего да.Следуя твоей логике, компания Microsoft разработала все эти методы вывода текста для соблюдения совместимости между различными аппаратными платформами. Так?!..
Наконец-то ты дошел до истины, которую я уже два дня пытаюсь втолковать. Способ один - изучение конкретной программы (наблюдение за поведением, дизассемблирование). Это называется подготовка целенаправленной атаки.Как я могу узнать каким именно способом в данном конкретном(!) случаи выполняется вывод в Label???
jangle писал(а):ExtTextOutA, ExtTextOutW - это новые версии тех-же TextOutA, TextOutW, само их название (Ext)endent говорит, что они введены только в последних версиях Windows. Однако, разработчики сред программирования (C++, Delphi, VB) стараются, чтобы их программы работали под любой версией виндов.
Поэтому, находясь в здравом уме и трезвой памяти не станут использовать API функцию, которая, работает например, только начиная с Windows2000.
awl100Alex писал(а):Twister
«...если прога не Дельфовая?» - это тоже НЕ важно! Посмотри в библиотеку HookD.Dll... В строке, где определяется указатель перехватываемого окна:
hProcess = FindWindow("TForm1", ByCopy "Form1") – меняешь имя класса Дельфийской проги "TForm1", а также текст заголовка "Form1", на имя класса, скажем, проги на VB – «ThunderRT5Form», соответственно "Form1" (на примере Proba.rar см. выше...), и перехват ставится уже на ее.
К тому же через координаты X,Y подставной функции «MyTextOut» можно задавать какой именно Label в стороннем приложении будет перехватываться!
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Button1: TButton;
Timer1: TTimer;
Delphi: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure StartTime(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.Timer1Timer(Sender: TObject);
var
DateTime:TDateTime;
begin
Label2.Caption:=TimeToStr(Time);
end;
procedure TForm1.StartTime(Sender: TObject);
begin
Form1.Refresh;
if Button1.Caption='Старт' then
begin
Timer1.Enabled:=True;
Button1.Caption:='Стоп';
end
else
begin
Timer1.Enabled:=False;
Button1.Caption:='Старт';
Label2.caption:='Label2';
end
end;
end.
Лично я доказал что хотел, вот и молчу.Хм.. Как-то неожиданно закончились все обсуждения...
awl100Alex писал(а):Хм.. Как-то неожиданно закончились все обсуждения...
maxboot писал(а): Я отправил в личку сообщение как выбрать конкретный лабел
awl100Alex писал(а):Что такое "личку"???
If Len(MyString) >= 5 And Len(MyString) <= 6 Then
GetStr = Str$(Val(MyString))
SendMessage hProcess, %WM_SETTEXT, 0, STRPTR(GetStr)
End If
Сейчас этот форум просматривают: AhrefsBot и гости: 63