Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Handle и windows 7 
V
    Опции темы
mayor123
Дата 27.9.2012, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.9.2012

Репутация: нет
Всего: нет



доброго времени суток!
помогите решить проблему. работает по win XP, отказывается работать под Win 7. алгоритм:
1) программа получает SeDebugPrivilege
2) программа определяет PID чужого процесса - определяет корректно
3) программа определяет хэндл - вот тут ХР отрабатывает нормально, а 7-ка в режиме совместимости с вин ХР показывает один хендл, без совместимости - другой, и оба неверные. в чем беда?
hProc := OpenProcess(PROCESS_ALL_ACCESS, false, PID);

вместо PROCESS_ALL_ACCESS были испробованы всеразличные, в т.ч. PROCESS_QUERY_LIMITED_INFORMATION, PROCESS_VM_READ и прочие.
PM MAIL   Вверх
bems
Дата 27.9.2012, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



каждое открытие даёт разный хендл. По числовому значению их сравнивать нельзя
как ты определяешь что хендл "неправильный"?


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Delvish
Дата 27.9.2012, 08:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 2
Всего: 4



у меня с ТС немного сходный вопрос - можно я паровозом встану? smile
если прога запущена в IDE - показывает один хендл (хоть 10 раз перезапускаю - он не изменяется и равен, скажем, 1944). а если из проводника запускаю - хендл совершенно другой (и тоже хоть 20 раз перезапущу - определится один и тот же, скажем, 64). но у меня WinXP. и совместимостями я не баловался.
PM MAIL   Вверх
bems
Дата 27.9.2012, 10:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



это значит что от проводника и ide процесс получает разный набор унаследованных хендлов, и нужный получает разной место в таблице хендлов процесса


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Delvish
Дата 27.9.2012, 11:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 2
Всего: 4



видимо, я не так выразился. или сам не так понял smile я запускаю программу 1.exe из IDE и она по PID процесса 2.exe смотрит его, 2.exe, хэндл, и получает одно значение. а когда 1.exe запущена из проводника, то она показывает что у 2.exe (который висит себе в памяти, никак не меняясь) совершенно другой хэндл. разве это нормально?
понятно что хэндл будет разный для 1.exe сколько раз я ее буду перезапускать. но почему же у другой проги хэндлы разные при разных обстоятельствах?

для ТС: попробуй "суповой набор"
OpenProcess(
 PROCESS_QUERY_INFORMATION or
 PROCESS_CREATE_THREAD or
 PROCESS_VM_OPERATION or
 PROCESS_VM_WRITE,
 FALSE, ProcID);

должно под 7й отработать нормально

Это сообщение отредактировал(а) Delvish - 27.9.2012, 11:44
PM MAIL   Вверх
mayor123
Дата 27.9.2012, 12:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.9.2012

Репутация: нет
Всего: нет



из модуля AdvAPIHook под экспихой InjectDLL работает - библиотека загружается в сторонний процесс и показывает MessageBox, а под 7й MessageBox не появляется. PID процесса верный, значит раз не появляется MessageBox, то проблема с хэндлом. тем более что программа определяет хэндл стороннего процесса в режиме совместимости и без него по разному - странно ведь
PM MAIL   Вверх
bems
Дата 27.9.2012, 13:34 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(Delvish @  27.9.2012,  11:41 Найти цитируемый пост)
 но почему же у другой проги хэндлы разные при разных обстоятельствах?
у процесса стабилен только пид. он является "глобальным" идентификатором объекта в системе, и пока процесс работает этот пид не может быть выдан другому процессу. Что касается хендла, то он "локальный идентификатор". Каждая операция открытия возвращает (с высокой вероятностью) разный хендл. все эти хендлы указывают на один и тот же объект. у одного объекта может быть много хендлов. пока хендл не закрыт, он не будет выдан для другого или того же объекта (но только если открывает тот же процесс). для проверки можешь открыть один и тот же объект два раза (не закрывая первый хендл перед вторым открытием), и убедиться что хендлы разные
прочитай это и посмотри на рисунки в статье http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx

Цитата(mayor123 @  27.9.2012,  12:56 Найти цитируемый пост)
из модуля AdvAPIHook под экспихой InjectDLL работает - библиотека загружается в сторонний процесс и показывает MessageBox, а под 7й MessageBox не появляется. PID процесса верный, значит раз не появляется MessageBox, то проблема с хэндлом. тем более что программа определяет хэндл стороннего процесса в режиме совместимости и без него по разному - странно ведь 
ничего странного. хендлы не обязаны быть одинаковыми. ты должен только проверять вернул ли OpenProcess корректный хендл (не 0). А на само значение хендла не смотри
что касается того что не работает инжект, то в семерке тому может быть много других причин. Если OpenProcess не вернула 0 значит у тебя есть валидный хендл


--------------------
Обижено школьников: 8
PM MAIL   Вверх
mayor123
Дата 27.9.2012, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.9.2012

Репутация: нет
Всего: нет



спасибо за ответ. OpenProcess возвращает не ноль - 100 без режима совместимости (сколько раз ни запускал) и около 250 в режиме совместимости. понять бы теперь что за причины отсутствия инжекта в 7й... если есть идея - расскажите, пожалуйста. у меня пока что ничего путного в голове не появляется
PM MAIL   Вверх
Delvish
Дата 27.9.2012, 13:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 2
Всего: 4



Цитата(bems @  27.9.2012,  14:34 Найти цитируемый пост)
у процесса стабилен только пид. он является "глобальным" идентификатором объекта в системе, и пока процесс работает этот пид не может быть выдан другому процессу. Что касается хендла, то он "локальный идентификатор". Каждая операция открытия возвращает (с высокой вероятностью) разный хендл. все эти хендлы указывают на один и тот же объект. у одного объекта может быть много хендлов. пока хендл не закрыт, он не будет выдан для другого или того же объекта (но только если открывает тот же процесс). для проверки можешь открыть один и тот же объект два раза (не закрывая первый хендл перед вторым открытием), и убедиться что хендлы разныепрочитай это и посмотри на рисунки в статье http://msdn.microsoft.com/en-us/library/wi...v=vs.85%29.aspx


хммм... я считал что хэндл при открытии процесса является "глобальным", сродни PID'у, и должен быть постоянным для запущенного приложения, сколько бы раз к нему не обратились. спасибо за просвещение!
PM MAIL   Вверх
bems
Дата 27.9.2012, 13:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



Цитата(mayor123 @  27.9.2012,  13:42 Найти цитируемый пост)
понять бы теперь что за причины отсутствия инжекта в 7й... если есть идея - расскажите, пожалуйста. у меня пока что ничего путного в голове не появляется 
выложи тестовый проект вместе с AdvAPIHook



--------------------
Обижено школьников: 8
PM MAIL   Вверх
mayor123
Дата 27.9.2012, 14:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.9.2012

Репутация: нет
Всего: нет



с библиотекой все просто - один лишь MessageBox(0, 'It is a work!', 'Inject', mb_OK);

код программки:
используемые функции из AdvAPIHook:

взятие ID процесса
Код

function GetProcessId(pName: PChar): dword;
var
 Snap: dword;
 Process: TPROCESSENTRY32;
begin
  Result := 0;
  Snap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  if Snap <> INVALID_HANDLE_VALUE then
     begin
      Process.dwSize := SizeOf(TPROCESSENTRY32);
      if Process32First(Snap, Process) then
         repeat
          if lstrcmpi(Process.szExeFile, pName) = 0 then
             begin
              Result := Process.th32ProcessID;
              CloseHandle(Snap);
              Exit;
             end;
         until not Process32Next(Snap, Process);
      Result := 0;
      CloseHandle(Snap);
     end;
end;


включение Debug-привилегий (вроде без них в 7й никак)
Код

function EnablePrivilegeEx(Process: dword; lpPrivilegeName: PChar):Boolean;
var
  hToken: dword;
  NameValue: Int64;
  tkp: TOKEN_PRIVILEGES;
  ReturnLength: dword;
begin
  Result:=false;
  OpenProcessToken(Process, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
  if not LookupPrivilegeValue(nil, lpPrivilegeName, NameValue) then
    begin
     CloseHandle(hToken);
     exit;
    end;
  tkp.PrivilegeCount := 1;
  tkp.Privileges[0].Luid := NameValue;
  tkp.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
  AdjustTokenPrivileges(hToken, false, tkp, SizeOf(TOKEN_PRIVILEGES), tkp, ReturnLength);
  if GetLastError() <> ERROR_SUCCESS then
     begin
      CloseHandle(hToken);
      exit;
     end;
  Result:=true;
  CloseHandle(hToken);
end;


инъекция
Код

Function InjectDll(Process: dword; ModulePath: PChar): boolean;
var
  Memory:pointer;
  Code: dword;
  BytesWritten: dword;
  ThreadId: dword;
  hThread: dword;
  hKernel32: dword;
  Inject: packed record
           PushCommand:byte;
           PushArgument:DWORD;
           CallCommand:WORD;
           CallAddr:DWORD;
           PushExitThread:byte;
           ExitThreadArg:dword;
           CallExitThread:word;
           CallExitThreadAddr:DWord;
           AddrLoadLibrary:pointer;
           AddrExitThread:pointer;
           LibraryName:array[0..MAX_PATH] of char;
          end;
begin
  Result := false;
  Memory := VirtualAllocEx(Process, nil, sizeof(Inject),
                           MEM_COMMIT, PAGE_EXECUTE_READWRITE);
  if Memory = nil then Exit;

  Code := dword(Memory);
  Inject.PushCommand    := $68;
  inject.PushArgument   := code + $1E;
  inject.CallCommand    := $15FF;
  inject.CallAddr       := code + $16;
  inject.PushExitThread := $68;
  inject.ExitThreadArg  := 0;
  inject.CallExitThread := $15FF;
  inject.CallExitThreadAddr := code + $1A;
  hKernel32 := GetModuleHandle('kernel32.dll');
  inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
  lstrcpy(@inject.LibraryName, ModulePath);
  WriteProcessMemory(Process, Memory, @inject, sizeof(inject), BytesWritten);
  hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
  if hThread = 0 then Exit;
  CloseHandle(hThread);
  Result := True;
end;


и сам код программочки:
Код

var hFile : Cardinal;
    PID : DWORD;

...

PID := GetProcessId('calc.exe');
EnablePrivilegeEx(INVALID_HANDLE_VALUE, 'SeDebugPrivilege');
hFile := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
InjectDll(hFile, 'test.dll');



Это сообщение отредактировал(а) mayor123 - 27.9.2012, 14:16

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  ADVAPIHOOK.pas 52,70 Kb
PM MAIL   Вверх
bems
Дата 27.9.2012, 14:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 21
Всего: 88



в InjectDll есть молчаливые выходы
 if Memory = nil then Exit;
 if hThread = 0 then Exit;
и не проверяется что возвращает WriteProcessMemory
посмотри не наворачивается ли где-то там

также базовые адреса системных дллок в семерке уже не обязаны совпадать во всех процессах (чтобы совпадали оба процесса должны работать в режиме совместимости с хр)

Добавлено через 51 секунду
еще этот код не будет работать на юникодных делфях и х64-виндах


--------------------
Обижено школьников: 8
PM MAIL   Вверх
mayor123
Дата 27.9.2012, 14:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 27.9.2012

Репутация: нет
Всего: нет



винда 32 бита, использую Delphi 7. чуть позже попробую с выводом промежуточных результатов в лог по каждому сомнительному моменту, о результатах отпишу. спасибо за идеи
PM MAIL   Вверх
Illusion Dolphin
Дата 27.9.2012, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1198
Регистрация: 3.5.2003

Репутация: 4
Всего: 63



Цитата

для ТС: попробуй "суповой набор"
OpenProcess(
 PROCESS_QUERY_INFORMATION or
 PROCESS_CREATE_THREAD or
 PROCESS_VM_OPERATION or
 PROCESS_VM_WRITE,
 FALSE, ProcID);


MSDN:
Код

//A handle to the process in which the thread is to be created. The handle must have the PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE, and PROCESS_VM_READ access rights, and may fail without these rights on certain platforms.


Цитата

EnablePrivilegeEx(INVALID_HANDLE_VALUE, 'SeDebugPrivilege');

Не работает под гостем.

Цитата

с библиотекой все просто - один лишь MessageBox(0, 'It is a work!', 'Inject', mb_OK);

Вы ведь в курсе что в DLL_PROCESS_ATTACH нельзя вызывать подобные функции?



--------------------
В мире всего две бесконечности: вселенная и человеческая глупость... На счёт вселенной я не уверен.
Шифрование и организация фотографий - Photo Database 4.5
PM MAIL WWW ICQ   Вверх
Delvish
Дата 28.9.2012, 01:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


oO
*


Профиль
Группа: Участник
Сообщений: 136
Регистрация: 13.12.2006

Репутация: 2
Всего: 4



Цитата(Illusion Dolphin @  28.9.2012,  00:13 Найти цитируемый пост)
с библиотекой все просто - один лишь MessageBox(0, 'It is a work!', 'Inject', mb_OK);

Вы ведь в курсе что в DLL_PROCESS_ATTACH нельзя вызывать подобные функции?


так тут у него вроде не виртуальная dll с отображением в памяти чужого процесса с измененной таблицей импорта и прочим. разве загруженная таким образом библиотека лишается части функций?

Это сообщение отредактировал(а) Delvish - 28.9.2012, 01:06
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0597 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.