информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Атака на InternetSpanning Tree Protocol: недокументированное применениеСтрашный баг в Windows
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Google заблокировала 2 с лишним... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
[Pascal] Давай исходник, гляну. Комментариев понатыкай! ;-) Мыло внутри 28.02.03 12:34  Число просмотров: 1092
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 28.02.03 12:38  Количество правок: 1
<"чистая" ссылка>
alex_wh (собака) mail.ru
<programming>
[Pascal] Память чужего процесса [Delphi] 24.02.03 19:08  
Автор: Ilya_Z Статус: Незарегистрированный пользователь
<"чистая" ссылка>
Мастера! Помогите мне, а то я уже тут совсем отчаялся! =( Уже 2 недели бьюсь, никак побороть не могу! =(

Вопрос: Есть некоторый процесс (например стандартный "калькулятор"), необходимо сделать дамп памяти этого процесса! Под Вынь98 все работает, но под ХП и 2000 не работает, проблема с правами! Как мне взять своему приложению права, чтобы можно было читать память чужего процесса ("Калькулятора")???

Итак текст процедуры (вроде так):

function GetWMPath:string;
var
  memarr:array of char;       // динамический массив для памяти!
  hProc : THandle;
  MBI : MEMORY_BASIC_INFORMATION;
  counter,i,j  : cardinal;
  ln : Integer;
  MaxAddy,temp : Cardinal;
  dwSize, dwAddress: cardinal;
  hwnd, proc_id: dword;

  f: file;
begin
  enabledebug;        // вызов процедуры получения прав, смотри ниже!!!

  counter :=0;
  SetLength(memarr, 0);

  dwAddress := $400000;
  MaxAddy := $80000000;

  hwnd:=FindWindow (pchar('SciCalc'), nil);      // получаем хэндл по классу окна

  GetWindowThreadProcessId (hwnd,@proc_id);
  hProc := OpenProcess(PROCESS_QUERY_INFORMATION, False, Proc_ID);

  While (VirtualQueryEx(hProc, Pointer(dwAddress), MBI, SizeOf(MEMORY_BASIC_INFORMATION)) > 0) and (cardinal(MBI.BaseAddress) + MBI.RegionSize < MaxAddy) do
  begin
    If (MBI.Protect = PAGE_READWRITE) and (MBI.Type_9 = MEM_PRIVATE) and ((MBI.State = MEM_COMMIT) or (MBI.State = MEM_RESERVE)) Then
    begin
      dwSize := MBI.RegionSize;
      dwAddress := cardinal(MBI.BaseAddress) + (MBI.RegionSize - dwSize);

      SetLength(memarr, counter + dwSize);
      ReadProcessMemory(hproc,
                        pointer(dwAddress),
                        @memarr[counter],
                        dwSize,
                        temp);
      counter := counter + dwSize;
    end;
    Inc(dwAddress, MBI.RegionSize);
  end;
  CloseHandle(hProc);



  assignfile(f, 'test.txt');                  // debug - сохранение дампа
  rewrite(f,1);                                // оставил на всякий случай!
  i:=0;
  repeat
    blockwrite(f, memarr[i], 50);
    i:=i+50;
  until i >= counter;
  closefile(f);

  Finalize(memarr);
  FreeMem(memarr);
end;

---

А вот так я пытаюсь взять себе нужные права(НЕ РАБОТАЕТ!!!):
procedure enabledebug;
var TokenHandle: THandle; dwNull: DWORD;
  TokenPrivilege, Tmp: TTokenPrivileges;
begin
  try
    OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle);
    LookupPrivilegeValue(nil, 'SeDebugPrivilege', TokenPrivilege.Privileges[0].Luid);

    with TokenPrivilege do begin
      PrivilegeCount := 1;
      Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
    end;

    dwNull := 0;

    AdjustTokenPrivileges(TokenHandle, False,
      TokenPrivilege, SizeOf(TTokenPrivileges), Tmp, dwNull);

  except
    ShowMessage('debug error!');
  end;
end;

---
Помогите, а то блин уже не знаю чего делать!!!
[Pascal] SeDebugPrivelege - это привилегия... 24.02.03 20:45  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
А права это PROCESS_VM_READ, PROCESS_VM_WRITE...

Короче при открытии процесса нужно указать PROCESS_VM_READ, если нужно ReadProcessMemory; PROCESS_VM_WRITE - для WriteProcessMemory; PROCESS_VM_OPERATION - еще для WriteProcessMemory и для VirtualProtectEx и т.д.

> Мастера! Помогите мне, а то я уже тут совсем отчаялся! =(
Зря ты так :-)))

> Вопрос: Есть некоторый процесс (например стандартный
> "калькулятор"), необходимо сделать дамп памяти этого
> процесса! Под Вынь98 все работает, но под ХП и 2000 не
> работает, проблема с правами! Как мне взять своему
> приложению права, чтобы можно было читать память чужего
> процесса ("Калькулятора")???
>
> Итак текст процедуры (вроде так):
>
>
> function GetWMPath:string;
> var
>   memarr:array of char;       // динамический массив для
> памяти!
>   hProc : THandle;
>   MBI : MEMORY_BASIC_INFORMATION;
>   counter,i,j  : cardinal;
>   ln : Integer;
>   MaxAddy,temp : Cardinal;
>   dwSize, dwAddress: cardinal;
>   hwnd, proc_id: dword;
> 
>   f: file;
> begin
>   enabledebug;	      // вызов процедуры получения прав,
> смотри ниже!!!
> 
>   counter :=0;
>   SetLength(memarr, 0);
> 
>   dwAddress := $400000;
>   MaxAddy := $80000000;
> 
>   hwnd:=FindWindow (pchar('SciCalc'), nil);	 //
> получаем хэндл по классу окна
> 
>   GetWindowThreadProcessId (hwnd,@proc_id);
>   hProc := OpenProcess(PROCESS_QUERY_INFORMATION, False,
Открывать с нужными правами здесь. А какие нужны - смотри MSDN (вкратце я привел выше)

> Proc_ID);
> 
>   While (VirtualQueryEx(hProc, Pointer(dwAddress), MBI,
Для VirtualQuery должно хватить, а ни на что другое не должно



>     AdjustTokenPrivileges(TokenHandle, False,
>       TokenPrivilege, SizeOf(TTokenPrivileges), Tmp,
> dwNull);
Это не нужно.

>   except
>     ShowMessage('debug error!');
>   end;
> end;
> 

---
> Помогите, а то блин уже не знаю чего делать!!!
[Pascal] SeDebugPrivelege - это привилегия... 24.02.03 23:57  
Автор: Ilya_Z Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> А права это PROCESS_VM_READ, PROCESS_VM_WRITE...

Ну с терминологией я наверное немного запутался....
А вообще, какая разница, главное чтобы работало =)

> Короче при открытии процесса нужно указать PROCESS_VM_READ,
> если нужно ReadProcessMemory; PROCESS_VM_WRITE - для
> WriteProcessMemory; PROCESS_VM_OPERATION - еще для
> WriteProcessMemory и для VirtualProtectEx и т.д.
Вроде все сделал как ты сказал, но чего то не работает под ВинХР. =(
hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, Proc_ID);
Даже ALL_ACCSESS пробовал - не хочет!

> > AdjustTokenPrivileges(TokenHandle, False,
> > TokenPrivilege, SizeOf(TTokenPrivileges), Tmp,
> > dwNull);
> Это не нужно.
Почему не нужно? разве мы не должны попросить винду дать нам привелегии на доступ к памяти???
[Pascal] Не должны :-) 25.02.03 12:17  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > А права это PROCESS_VM_READ, PROCESS_VM_WRITE...
>
> Ну с терминологией я наверное немного запутался....
> А вообще, какая разница, главное чтобы работало =)
Ну я в русскоязычной терминологии тоже не силен, короче то что тебе нужно это access rights, а не privileges

> > Короче при открытии процесса нужно указать
> PROCESS_VM_READ,
> > если нужно ReadProcessMemory; PROCESS_VM_WRITE - для
> > WriteProcessMemory; PROCESS_VM_OPERATION - еще для
> > WriteProcessMemory и для VirtualProtectEx и т.д.
> Вроде все сделал как ты сказал, но чего то не работает под
> ВинХР. =(
> hProc := OpenProcess(PROCESS_QUERY_INFORMATION or
> PROCESS_VM_READ, False, Proc_ID);
> Даже ALL_ACCSESS пробовал - не хочет!
Не хватает прав именно для открытия процесса? То бишь слетает именно в этом месте? И с ошибкой Access Denied?
Если да. То следует учесть, что чужую память могут читать только администраторы

> > > AdjustTokenPrivileges(TokenHandle, False,
> > > TokenPrivilege,
> SizeOf(TTokenPrivileges), Tmp,
> > > dwNull);
> > Это не нужно.
> Почему не нужно? разве мы не должны попросить винду дать
> нам привелегии на доступ к памяти???
Не проверял, но скорее всего админ и так может читать чужую память, а не админу все-равно не дадут никаких дополнительных привилегий
[Pascal] Не должны, но тем не менее надо........ =) 25.02.03 17:20  
Автор: Ilya_Z Статус: Незарегистрированный пользователь
<"чистая" ссылка>
> что тебе нужно это access rights, а не privileges
По моему так и то и другое нужно! В вин 98 вроде вообще такой штуки как "привилегия" нет, поэтому в ней все работает как есть.....

> > > Короче при открытии процесса нужно указать
> > PROCESS_VM_READ,
> > Вроде все сделал как ты сказал, но чего то не работает под
> > ВинХР. =(
> > Даже ALL_ACCSESS пробовал - не хочет!
> Не хватает прав именно для открытия процесса? То бишь
> слетает именно в этом месте? И с ошибкой Access Denied?
> Если да. То следует учесть, что чужую память могут читать
> только администраторы
Вроде че то читает, но там какая то лажа, почти все символы 0h. Так что фиг знает....... Ну я в вин ХР под админом и тестил........ А как ошибку то вывести?

> > > > AdjustTokenPrivileges(TokenHandle, False,
> > > > TokenPrivilege,
> > SizeOf(TTokenPrivileges), Tmp,
> > > > dwNull);
> > > Это не нужно.
> > Почему не нужно? разве мы не должны попросить винду дать
> > нам привелегии на доступ к памяти???
> Не проверял, но скорее всего админ и так может читать чужую
> память, а не админу все-равно не дадут никаких
> дополнительных привилегий
Читать то он может, но перед чтением он должен попросить разрешения у винды (типа запросить привелегии)!!!!!

ЗЫ слушай, а нельзя тебя попросить чтобы ты исходник посмотрел под ВинХП(или любой другой на ядре NT)? Если не получится, или будет очень сложно, тогда забей....... Просто так было бы проще, если ты согласишься, я тебе его на мыло кину??? Плз....... =)
[Pascal] Давай исходник, гляну. Комментариев понатыкай! ;-) Мыло внутри 28.02.03 12:34  
Автор: HandleX <Александр М.> Статус: The Elderman
Отредактировано 28.02.03 12:38  Количество правок: 1
<"чистая" ссылка>
alex_wh (собака) mail.ru
[Delphi] Ладно, щас подзаточу получше, и кину намыло... Жди через пару дней..... (З.Ы. Пасиба что откликнулся) 02.03.03 01:25  
Автор: Ilya_Z Статус: Незарегистрированный пользователь
<"чистая" ссылка>
[Pascal] Я в паскале не шарю - даже компилера не имею 25.02.03 22:31  
Автор: amirul <Serge> Статус: The Elderman
<"чистая" ссылка>
> > > > Короче при открытии процесса нужно указать
> > > PROCESS_VM_READ,
> > > Вроде все сделал как ты сказал, но чего то не
> работает под
> > > ВинХР. =(
> > > Даже ALL_ACCSESS пробовал - не хочет!
> > Не хватает прав именно для открытия процесса? То бишь
> > слетает именно в этом месте? И с ошибкой Access
> Denied?
> > Если да. То следует учесть, что чужую память могут
> читать
> > только администраторы
> Вроде че то читает, но там какая то лажа, почти все символы
> 0h. Так что фиг знает....... Ну я в вин ХР под админом и
Так если нет ошибки, значит не там читаешь. Посмотри ImageBase модуля, который ты хочешь сдампить и попробуй читать оттуда. Если все получится - значит просто не то читаешь

> тестил........ А как ошибку то вывести?
GetLastError/FormatMessage

> > > > > AdjustTokenPrivileges(TokenHandle,
> False,
> > > > > TokenPrivilege,
> > > SizeOf(TTokenPrivileges), Tmp,
> > > > > dwNull);
> > > > Это не нужно.
> > > Почему не нужно? разве мы не должны попросить
> винду дать
> > > нам привелегии на доступ к памяти???
> > Не проверял, но скорее всего админ и так может читать
> чужую
> > память, а не админу все-равно не дадут никаких
> > дополнительных привилегий
> Читать то он может, но перед чтением он должен попросить
> разрешения у винды (типа запросить привелегии)!!!!!
SeDebugPrivilege у администраторов есть по умолчанию - устанавливается в Local Security Policy. Дает возможность аттачить дебуггер к любому процессу (не только своему) к чтению памяти вроде бы отношения не имеет. А простому юзеру (если у него этой привилегии нет) ее все равно не дадут

> ЗЫ слушай, а нельзя тебя попросить чтобы ты исходник
> посмотрел под ВинХП(или любой другой на ядре NT)? Если не
> получится, или будет очень сложно, тогда забей.......
> Просто так было бы проще, если ты согласишься, я тебе его
> на мыло кину??? Плз....... =)
Не получится по причине сабж-а. Лучше отслеживай ошибку и скажи где и с каким кодом слетает. Если не слетает, значит все идет нормально и память РЕАЛЬНО читается (хотя, возможно, не та что ты хочешь)
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach