Наши руки не для йцукен

+--------------------------------------------------------------------------------------------------------------------------[release: 07.11.04]----+
|
|
|
|
|
|
|
  _|_|    _|_|_|    _|_|    _|_|_|    _|_|    _|  _|    _|  _|_|    _|_|_|      _|  _|    _|_|_|
_|      _|  _|  _|  _|  _|  _|        _|  _|      _|_|_|_|  _|  _|  _|        _|_|_|_|_|  _|    
_|      _|_|_|_|_|  _|  _|  _|_|      _|_|    _|  _| |  _|  _|_|    _|_|_|      _|  _|    _|_|_|
_|      _|  _|  _|  _|  _|  _|        _|      _|  _|    _|  _|          _|    _|_|_|_|_|      _|
  _|_|    _|_|_|    _|_|    _|_|_|    _|      _|  _|    _|  _|      _|_|_|      _|  _|    _|_|_|
|
|
|
|
|
|
|
+-------------------------------------------------------------------------------------------------------------------------------------------------------+
+-----------------------------------------[0x03: Цикл статей о Win32 API: Доминирование]------------------------------------------+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|


ПРЕ-ПРОЛОГ

Идея, написать статьи в этот журнал, родилась давно. А решил я эту статью написать потому, что материалу по таким вопросам мало. Даже если и есть, то не очень то понятно, что к чему. Вот только поэтому начат цикл статей. На протяжении всего цикла я буду затрагивать разные аспекты 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.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+-----[content]-----------------------------------------------------------------------------------------------------------------------[mail us]-----+