Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 17.08.2011, 02:45   #1
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
Стрелка Конвертация AutoIT в DELPHI.

Доброго времени суток, есть псевдокод на AutoIT, хотелось бы преобразовать его на DELPHI.
Не совсем понимаю некоторые конструкции, а некоторые и вовсе непонимаю

Код:
 
Func GETGAMEBASEADDRESS($PID)

	$HSNAP = DllCall("Kernel32.dll", "HANDLE", "CreateToolhelp32Snapshot", "DWORD", 8, "DWORD", $PID)

	$STMODULE = DllStructCreate("DWORD dwSize;DWORD th32ModuleID;DWORD th32ProcessID;" & "DWORD GlblcntUsage;DWORD ProccntUsage;
ptr modBaseAddr;" & "DWORD modBaseSize;HANDLE hModule;WCHAR szModule[256];" & "WCHAR szExePath[260]")

	DllStructSetData($STMODULE, "dwSize", DllStructGetSize($STMODULE))

	$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32FirstW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))

	IF ($RET[0] = False) Then
		DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])
		Return 0
	Else
		$RET[0] = True
		Do
			If DllStructGetData($STMODULE, "szModule") = "GAME.exe" Then

				DllCall("Kernel32.dll", "BOOLEAN", "CloseHandle", "HANDLE", $HSNAP[0])

				Return DllStructGetData($STMODULE, "modBaseAddr")
			EndIf
			$RET = DllCall("Kernel32.dll", "BOOLEAN", "Module32NextW", "HANDLE", $HSNAP[0], "ptr", DllStructGetPtr($STMODULE))
		Until $RET[0] = False
	EndIf
EndFunc   ;==>GETGAMEBASEADDRESS
Мне бы получить тот самый адресс "BASE" структуры чтобы использовать его в ReadProcessMemory функции.

Как я понимаю:
создаётся "снимок процесса" с идентификатором PID
далее создаётся структура с описанием процесса (имя файла и прочие параметры)
далее заполняется пустыми значениями
далее функция Module32FirstW "что-то ищет ..."
если ничего не нашла закрывает
если нашла , в цикле ищет соответствие "szModule" = "GAME.exe" и возвращает значение "modBaseAddr"
until "не найден ещё один элемент"

Спасибо за отзывы!

Последний раз редактировалось JTG; 17.08.2011 в 16:40.
Lime вне форума Ответить с цитированием
Старый 17.08.2011, 15:21   #2
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Возвращает базовый адрес загрузки Game.exe.


Код:
Function GetModuleBase(PID: DWord; moduleName: PChar): dword;
var
   snapshot: THandle;
   modules: TModuleEntry32;
begin
  result := 0;
  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);
  modules.dwSize := sizeof(TModuleEntry32);
  if Module32First(snapshot, modules) then
  repeat
      if StrComp(moduleName, modules.szModule) = 0 then
      begin
        result := dword(modules.modBaseAddr);
        break;
      end;
  until not Module32Next(snapshot, modules);
  CloseHandle(snapshot);
end;
moduleName - имя исполняемого файла (без пути). Для game.exe вернёт базовый адрес загрузки экзешника, условно он всегда постоянный. Для some.dll - базовый адрес загрузки библиотеки внутри адресного пространства процесса. Этот адрес при каждом запуске может быть разным.

Цитата:
тот самый адресс "BASE" структуры
Это не адрес структуры. Это адрес где расположен первый байт исполняемого файла или библиотеки, загруженной им.

З.Ы.: в uses нужно добавить TlHelp32
пыщь

Последний раз редактировалось JTG; 17.08.2011 в 15:47. Причина: поправил код
JTG вне форума Ответить с цитированием
Старый 17.08.2011, 15:55   #3
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

Гиганское Вам спасибо за проделанную работу!)
Этот кусок очень смущал меня но теперь я почти полностью понял его назначение!

немного модифицировав на скорую руку
Код:
Function GetModuleBase(PID: DWord; moduleName: PChar): dword;
var
   snapshot: THandle;
   modules: TModuleEntry32;
begin
  result := 0;
  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);
  modules.dwSize := sizeof(TModuleEntry32);
  if Module32First(snapshot, modules) then
    While Module32Next(snapshot, modules) do
    if StrComp(moduleName, modules.szModule) = 0 then
      begin
       CloseHandle(snapshot);
       result := dword(modules.modBaseAddr);
       form1.Memo1.Lines.Add('--> ' + modules.szModule);
       exit;
      end
      else
     begin
        form1.Memo1.Lines.Add('[' + StrPas(modules.szModule)+'] - '+strpas(modules.szExePath) );
     end;
   CloseHandle(snapshot);
end;
PID и pchar('Game.exe') были указаны верно...
Я увидел в memo 89 имён загруженных DLL и ничего кроме имён DLL...

P.S. Почти все пути к dll были C:\WINDOWS\ ... , несколько - помошники мышки и звуковой карты (хуки какие-то) и всего 2 адреса указывающих на dll из папки игры. Может это то что мне нужно? это один из результатов на вопрос у гугла, так-же в описании длл: Windows Image Helper так-же имеет цифровую подпись от Microsoft ..
2рой - dll связанная с авторизационным сервером игры.
Что я делаю не так?(

Последний раз редактировалось Lime; 17.08.2011 в 16:12.
Lime вне форума Ответить с цитированием
Старый 17.08.2011, 16:36   #4
JTG
я получил эту роль
Старожил
 
Аватар для JTG
 
Регистрация: 25.05.2007
Сообщений: 3,694
По умолчанию

Я там выше немного переписал цикл, иначе пропускало первый элемент списка. Вот вывод адресов всех модулей в АП процесса.

Код:
Function GetModuleBase(PID: DWord; moduleName: PChar): dword;
var
   snapshot: THandle;
   modules: TModuleEntry32;
begin
  result := 0;
  snapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, PID);
  modules.dwSize := sizeof(TModuleEntry32);
  if Module32First(snapshot, modules) then
  repeat
{ 
      if StrComp(moduleName, modules.szModule) = 0 then
      begin
        result := dword(modules.modBaseAddr);
        break;
      end;
}
      form1.memo1.lines.add(format('%-50s %.8xh', [modules.szExePath, dword(modules.modBaseAddr)]));
  until not Module32Next(snapshot, modules);
  CloseHandle(snapshot);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  GetModuleBase(5580,'')
end;
Код:
Что я делаю не так?
А что сделать-то нужно?
пыщь

Последний раз редактировалось JTG; 17.08.2011 в 16:38.
JTG вне форума Ответить с цитированием
Старый 17.08.2011, 17:09   #5
Lime
Форумчанин
 
Аватар для Lime
 
Регистрация: 10.02.2009
Сообщений: 815
По умолчанию

И в правду, пропускался 1вый элемент но после корректировки всё работает.
Вывод результатов в memo я добавил для наглядности и понимания
Lime вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
AutoIt megostudent Win Api 0 20.03.2011 04:30
Delphi конвертация неизвестно типа в string world12_tk Помощь студентам 2 13.03.2011 12:49
Конвертация String в PAnsiChar в Delphi vandrouny Помощь студентам 5 28.10.2010 22:27
Конвертация Delphi->C# templllar Помощь студентам 0 21.12.2009 11:08
Конвертация раскладки текста (Delphi) ekzobyte Помощь студентам 1 24.05.2009 17:29