Сейчас на форуме: zombi-vadim, zds (+4 невидимых)

 eXeL@B —› Программирование —› Получить SizeOfImage процесса [GetModuleInformation error]
Посл.ответ Сообщение

Ранг: 5.1 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 августа 2013 13:43 · Поправил: bytewide
· Личное сообщение · #1

Здравствуйте уважаемые участники форума Появилась такая проблема, нужно получить SizeOfImage процесса. Нашел в инете код на делфи, попытался переписать его на плюсы.. Не работает чего то

Code:
  1. Delphi:
  2. var
  3.   hOpen, hMod: THandle;
  4.   MODINFO: MODULEINFO;
  5.   null: DWORD;
  6. begin
  7.   Result:= false;
  8.   hOpen:= OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, PID);
  9.   if hOpen <> INVALID_HANDLE_VALUE then begin
  10.            EnumProcessModules(hOpen, @hMod, SizeOf(hMod), null);
  11.            if GetModuleInformation(hOpen, hMod, @MODINFO, SizeOf(MODINFO)) then begin
  12.              dSize:= Cardinal(MODINFO.SizeOfImage);
  13.              dBaseAddr:= Cardinal(MODINFO.lpBaseOfDll);
  14.       EntryPoint:= Cardinal(MODINFO.EntryPoint);
  15.              Result:= true;
  16.          end;
  17.   end;
  18.   CloseHandle(hOpen);


Code:
  1. C++:
  2. HANDLE hOpen;
  3.          DWORD cbNeeded, SizeOfImage, EntryPoint, BaseAddr;
  4.          HMODULE hMod;
  5.          MODULEINFO MODINFO;
  6.  
  7.          SizeOfImage = 0; EntryPoint = 0; BaseAddr = 0;
  8.  
  9.          hOpen = OpenProcess(PROCESS_QUERY_INFORMATION || PROCESS_VM_READ, false, MemEng->GetProcessId());
  10.          if(hOpen == INVALID_HANDLE_VALUE)
  11.          {
  12.                  printf("[!] Error opening process\n");
  13.                  return 0;
  14.          } 
  15.          else
  16.          {
  17.                  printf("[!] Process open...\n");
  18.                  EnumProcessModules(hOpen, &hMod, sizeof(hMod), &cbNeeded);
  19.                  if(GetModuleInformation(hOpen, hMod, &MODINFO, sizeof(MODINFO)))
  20.                  {
  21.                         SizeOfImage = MODINFO.SizeOfImage;
  22.                         EntryPoint = (DWORD)MODINFO.EntryPoint;
  23.                         BaseAddr = (DWORD)MODINFO.lpBaseOfDll;
  24.                  }
  25.                  else
  26.                         printf("[!] GetModuleInformation error\n");
  27.          }
  28.          CloseHandle(hOpen);


выдает ошибку [!] GetModuleInformation error. Что не так? =_^

P.S. http://pastebin.com/f5eR8sJb , а то на форуме код не читаем как-то




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 21 августа 2013 13:59 · Поправил: ajax
· Личное сообщение · #2

нормальные примеры бери, а не х-ню. во первых - енум портит память аццки, в примере. енум проверяй на ошибки изначально. дальше смотреть нет желания
Code:
  1. function EnumModulesPS: Boolean;
  2.   var
  3.     ProcessHandle: THandle;
  4.     Needed: DWORD;
  5.     Modules: array of THandle;
  6.     I, Cnt: Integer;
  7.   begin
  8.     Result := False;
  9.     ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, ProcessID);
  10.     if ProcessHandle <> 0 then
  11.     try
  12.       Needed := 0;
  13.       Result := EnumProcessModules(ProcessHandle, nil, 0, Needed);
  14.       if Result then
  15.       begin
  16.         Cnt := Needed div SizeOf(HMODULE);
  17.         SetLength(Modules, Cnt);
  18.         if EnumProcessModules(ProcessHandle, @Modules[0], Needed, Needed) then
  19.           for I := 0 to Cnt - 1 do
  20.             AddToList(ProcessHandle, Modules[I]);
  21.       end
  22.       else
  23.         Result := EnumModulesVQ(ProcessHandle);
  24.     finally
  25.       CloseHandle(ProcessHandle);
  26.     end;
  27.   end;


-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 590.6 (!), 408thx
Активность: 0.360.18
Статус: Модератор

Создано: 21 августа 2013 14:00
· Личное сообщение · #3

::GetLastError()???

-----
старый пень





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 21 августа 2013 14:01
· Личное сообщение · #4

А ты || от | отличаешь?

| Сообщение посчитали полезным: Artem_N

Ранг: 5.1 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 августа 2013 14:12
· Личное сообщение · #5

ajax спасибо за пример, посмотрю
r_e
EnumProcessModules - 299
GetModuleInformation - 6
Archer всегда казалось, что оператор ИЛИ - || (--> Link <--) (но не с тем, не с тем не работает ^_^)




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 21 августа 2013 14:38
· Личное сообщение · #6

bytewide
Правильно, или, но смысл разный. Оператор || всегда возвращает значение типа bool (TRUE или FALSE), а оператор | делает or для целочисленных операндов. Вот и представьте, вам нужно указать маску доступа, комбинируя те или иные флаги, а вы вместо этого сравниваете первый флаг, ели он не равен NULL, берёте его, а если все нули, то ноль. Как-то так, хотя в жизни всякое бывает, может и я чего не понимаю.

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 136.0 (ветеран), 360thx
Активность: 0.270.14
Статус: Участник
Qt Developer

Создано: 21 августа 2013 14:44 · Поправил: hors
· Личное сообщение · #7

bytewide пишет:
EnumProcessModules - 299
GetModuleInformation - 6


--> Link <--

-----
http://ntinfo.biz




Ранг: 5.1 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 августа 2013 14:46 · Поправил: bytewide
· Личное сообщение · #8

ARCHANGEL хм.. спасибо, теперь вроде как понятно Заюзал PROCESS_ALL_ACCESS (чтобы пока не мучится). Открыл процесс -> EnumProcessModules возвращает false.

Code:
  1. HANDLE hOpen;
  2. HMODULE hMod;
  3. DWORD cbNeeded;
  4.  
  5. hOpen = OpenProcess(PROCESS_ALL_ACCESS, false, MemEng->GetProcessId()); //открыли процесс
  6. if(hOpen == INVALID_HANDLE_VALUE)
  7. {
  8.          printf("[!] Error opening process\n");
  9.          return 0;
  10. }
  11.  
  12. if(!EnumProcessModules(hOpen, &hMod, sizeof(hMod), &cbNeeded))
  13. {
  14.          printf("[!] EnumProcessModules error\n");
  15. }
  16.  
  17. CloseHandle(hOpen);


что этой EnumProcessModules нужно еще дать, чтобы она заработала? О_о

hors
EnumProcessModules failed with error 299: Запрос ReadProcessMemory или WriteProcessMemory был выполнен только частично.

Ничего не понял




Ранг: 337.6 (мудрец), 224thx
Активность: 0.210.1
Статус: Участник
born to be evil

Создано: 21 августа 2013 14:48
· Личное сообщение · #9

bytewide
в моем примере все идеал. не тормозите с размерами переменных

-----
От многой мудрости много скорби, и умножающий знание умножает печаль




Ранг: 5.1 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 августа 2013 15:00
· Личное сообщение · #10

ajax спасибо большое, разобрался.


 eXeL@B —› Программирование —› Получить SizeOfImage процесса [GetModuleInformation error]
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати