Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Подключение к процессу


Автор: Alexey68 31.5.2013, 13:50
Здравствуйте All!
Интересует подключение к процессу (или другой вариант) для получения информации о PE заголовке и т.п.
С помощью CreateFile всё нормально, но необходимо именно подключение, а не создание (открытие).
Вот мой код:
Код

#include <windows.h>
#include <stdio.h>
#include <winnt.h>


void main()
{
   HANDLE hFile;
   BYTE *BaseAddress;
   WORD x;
   DWORD FileSize, BR, PE, OEP;

   IMAGE_DOS_HEADER *ImageDosHeader;
   IMAGE_NT_HEADERS32 *ImageNtHeaders;
   IMAGE_OPTIONAL_HEADER32 *ImageOptionalHeader;
   IMAGE_DATA_DIRECTORY *ImageDataDirectory;
   IMAGE_EXPORT_DIRECTORY *ImageExportDirectory;
   IMAGE_SECTION_HEADER *ImageSectionHeader;


   char FileName[MAX_PATH];
//char FileName []="test.exe";
   char SectionName[9] = { 0 };


   printf("%s\n","Enter filename...");
   scanf("%s", FileName);

   printf("%s\n","Open file...");

   hFile = CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, 0,
      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

   if (hFile == INVALID_HANDLE_VALUE)
   {
      printf("%s\n","Cannot open file...");
      return 0;
   }

   FileSize = GetFileSize(hFile, NULL);
   BaseAddress = (BYTE *) malloc(FileSize);

   printf("%X\n%X\n", FileSize, BaseAddress);

   if (!ReadFile(hFile, BaseAddress, FileSize, &BR, NULL))
   {
      printf("Cannot read file...\n");
      free(BaseAddress);
      CloseHandle(hFile);
      return 0;
   }

   ImageDosHeader = (IMAGE_DOS_HEADER *) BaseAddress;

   printf("%s%x\n","DosHeader = ",ImageDosHeader);
   printf("%s%x%s\n","e_magic  = ",ImageDosHeader->e_magic, " -MZ");

   free(BaseAddress);
   CloseHandle(hFile);
system("pause");
}


Как реализовать именно подключение?
к выполняющемуся в данный момент модулю.
С Уважением Алексей.

Автор: Dem_max 31.5.2013, 15:53
Что такое подключение к процессу ???

Автор: Dem_max 1.6.2013, 06:37
Цитата

подключение к уже запущенному файлу и спроецированному в памяти.

Вот я и спрашиваю что в твоем понимание "подключение" к процессу.


Потому что телепаты сейчас в отпуске.

Автор: Alexey68 1.6.2013, 14:19
inject, внедрение в адресное пространство чужого процесса без использования dll

Автор: Dem_max 1.6.2013, 14:36
WriteProcessMemory()
ReadProcessMemory()

http://msdn.microsoft.com/en-us/library/windows/desktop/ms681674(v=vs.85).aspx

Автор: Alexey68 1.6.2013, 15:24
я неверно описал задачу.
Необходимо внедриться в чужой процесс и получить информацию о EP+ ImageBase = OEP, секциях и т.п.
В выше описанном мной коде (приведён не полностью) всю эту информацию я получаю через CreateFile, а необходимо внедриться в уже запущенный процесс (после распаковки в память (если файл был упакован)).
С WriteProcess и ReadProcess вопросов нет, необходим именно inject без dll.
RSDN, Рихтер и т.п. уже смотрел...

Автор: DarthTon 1.6.2013, 16:07
Так Вам всё же небходимо внедрение кода или получить информацию о главном модуле ("EP+ ImageBase = OEP, секциях и т.п.") ? Так как для получения этого вовсе не обязательно внедрять свой код.

Автор: Alexey68 1.6.2013, 16:12
да необходимо получение сведений о PE модуле отображённом в памяти

Автор: DarthTon 1.6.2013, 16:46
CreateToolhelp32Snapshot + Module32First + MODULEENTRY32W::modBaseAddr. После получения базового адреса модуля парсите его PE заголовок используя ReadProcessMemory().

http://msdn.microsoft.com/en-us/library/windows/desktop/ms682489(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684218(v=vs.85).aspx
http://msdn.microsoft.com/en-us/library/windows/desktop/ms684225(v=vs.85).aspx

Автор: Alexey68 1.6.2013, 17:13
спасибо, буду разбираться...

Автор: Dem_max 1.6.2013, 18:15
Цитата

необходим именно inject без dll.


это 
WriteProcessMemory()
ReadProcessMemory()

Автор: Alexey68 3.6.2013, 00:33
Код

#include <windows.h>
#include <tlhelp32.h> 
#include <tchar.h> 
 
int main( void )
{
HANDLE hModuleSnap = INVALID_HANDLE_VALUE;
MODULEENTRY32 me32;
DWORD PID;
BYTE t;

PID = 3920;

hModuleSnap = CreateToolhelp32Snapshot( TH32CS_SNAPMODULE, PID );

if( hModuleSnap == INVALID_HANDLE_VALUE )
{
 return( FALSE );
}

me32.dwSize = sizeof( MODULEENTRY32 );
Module32First(hModuleSnap, &me32);

printf("modBaseAddr --0x%08X\n", me32.modBaseAddr);

ReadProcessMemory(если использовать hModuleSnap, то получаю 0 ,(LPVOID) 0x004537F5, &t, 1, NULL);

И далее отталкиваясь от me32.modBaseAddr использовать смещения при "парсинге" заголовка PE?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)