| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
ПРЕ-ПРОЛОГ
Идея, написать статьи в этот журнал, родилась давно.
А решил я эту статью написать потому, что материалу по таким вопросам мало.
Даже если и есть, то не очень то понятно, что к чему. Вот только поэтому
начат цикл статей. На протяжении всего цикла я буду затрагивать разные
аспекты API касаемые творения от незыблемой и непотопляемой Microsoft ;)
ПРОЛОГ
Почему статья называется "Доминирование"? По-моему тут всё предельно просто.
Дескрипторы (хендлы) играют очень важную роль в мире Windows, без них невозможно
существование самой Windows, т.к. Дескрипторы есть у: процессов, тредов (thread),
окон, сервисов, визуальных и не очень компонентов и многое другое.
Одним словом получив дескриптор вы можете практически ВСЁ.
Перечислять ВСЁ нет смысла, т.к. это будет довольно громоздкий текст.
По дескрипторам идентифицируется объекты, через дескрипторы посылаются сообщения и
многое другое. Вот поэтому я и назвал эту статью "Доминирование".
СТАТЬЯ 1: ДОМИНИРОВАНИЕ
Сегодня мы будем писать ArtMoney-подобную прогу на Delphi и C++.
Таких прог куча, некоторые даже бабосы косят, а чем мы хуже?
Вот и напишем тоже, чтоб не завидно было...
И так, приступим:
Что нужно для работы?:
1) название окошка с игрой яссесно...
2) немного мозговой деятельности
3) местами ровные руки
Едем:
Delphi version:
1) copy&paste:
function GetWindowProcessIDHandle(AppName: PAnsiChar): DWORD;
begin
if LongBool(GetWindowThreadProcessId(FindWindow(nil,AppName),Result)) then
// С помощью FindWindow мы получаем хендл нужного окна и с помощью
// GetWindowThreadProcessId пытаемси получить в Result PID (Process ID) окошка,
// результатом работы функции будет TID (Thread ID), поскольку результат 4х байтный,
// то с помощью LongBool проверяем на 0. 0 = False, >0 = True..
Result := OpenProcess(PROCESS_ALL_ACCESS,False,Result);
// А с помощью OpenProcess получаем хендл процесса, всё гениально и просто...
end;
2) юзаем фукнц. под названием WriteProcessMemory/ReadProcessMemory...думаю сами
разберётесь что к чему...
*function WriteProcessMemory( hProcess: THandle;
// тот самый хэндл, который мы получили
const lpBaseAddress: Pointer;
// указатель на переменную с адресом
lpBuffer: Pointer;
// указатель на переменную с записываемым значением
nSize: DWORD;
// ВАЖНО ТОЧНО!!! знать размер заменяемого значения
// если вы попытаетесь записать 4х байта в 2х..
// то сами знаете, ничего хорошего не выйдет..
var lpNumberOfBytesWritten: DWORD): BOOL; stdcall;
// а здесь мы получаем кол-во реально записанных байт
*function ReadProcessMemory( hProcess: THandle;
// думаю и сами догадались :)
const lpBaseAddress: Pointer;
// я не ошибся ?
lpBuffer: Pointer;
// а енто, указатель на переменную, куда буим записывать
// прочитанное значение..
nSize: DWORD;
// Хехе, думаю догадались да?
var lpNumberOfBytesRead: DWORD): BOOL; stdcall;
// а здесь мы получаем кол-во реально прочитанных байт
* если функция выполнилась успешно, результат True, иначе False...
3) после работы с хендлом PID'a, надо его закрыть CloseHandle(hObject: DWORD);
P.S: Да и с любым хендлом надо так же поступать, закрывать.
C++ version:
1) copy&paste:
DWORD GetWindowProcessIDHandle(char* AppName)
{
DWORD Temp=0;
if(GetWindowThreadProcessId(FindWindow(NULL,AppName),&Temp))
// Описание см. выше.
return DWORD(OpenProcess(PROCESS_ALL_ACCESS,false,Temp));
}
2) см. выше.
3) см. выше.
Недостаток этих конструкций:
1) Надо знать пункт назначения, т.е. адрес
2) надо знать размер значения, т.е. 1,2,4 или 8 байт...
Вот и всё, фундамент заложен, осталось вам активировать пункты 2,3 описанные в начале
статьи и у вас всё получицца...способ нахождения диапазона адресов использующихся
приложением есть...но вам самим предстОит его найти...мне же не всё за вас делать..:))
P.S: Те, у кого всё-таки ничего не получилось, смотрите приложение.
ЭПИЛОГ
Сегодня вы научились получать** дескрипторы процессов, с помощью которых вы, прибегая к
недюжинной мозговой деятельности, можете сделать многое, но не всё. А ведь ещё есть
дескрипторы тредов (весьма забавная вещь), дескрипторы окон, дескрипторы кнопок, чекбоксов
и т.д. Например вы можете убрать виндосовкие часы и воткнуть свои, можете пимпу "ПУСК" убрать
и воткнуть свою (есесно что и функции будут выполняться ваши) и т.д. В общем, дело будет
ограничиваться исключительно вашим воображением.
** не всегда эта процедура может оказаться успешной, к примеру, нельзя получить хендл
системного/критического процесса.
ПОСТ-ЭПИЛОГ
А насчёт тех недостатков, которые имеются в приведённых конструкциях, дело обстоит следующим
образом: я не знаю как эти проблемы разрешить, но буду пытаться найти решение этих проблем.
В следующей статье вы узнаете что такое сервис, и с чем его едят.
P.S: Не забывайте о MSDN, там тоже многое можно найти.
З.ЫЫЫ: M$ лажа, винда вынужденость, си (++,--,**,## и т.д.) отстой.
by Eternal Shield. Copyright (c) 2002, 2004 Saturn Star, Inc.
|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |