Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > C++ > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

Ответ
 
Опции темы
Старый 17.05.2013, 00:18   #1
Muvvka
Пользователь
 
Аватар для Muvvka
 
Регистрация: 27.04.2012
Сообщений: 18
Репутация: 10

icq: 359992440
skype: Muvvka
По умолчанию подход к инжекту

значит начал я писать программки и рыться в памяти чужеродных процессов через ToolHelp и захотелось мне большей власти =) погуглил, почитал инфо в интернете и пришол к выводу сделать себе функцию инжекта из своего процесса в другой процесс библиотеки ну поискал я на форуме по этому вопросу (как же иначе) а суть вопроса такова:
какие заголовки.h "смотреть" и литературу "читать" могли бы посоветовать касательно памяти и работы с процессами?
заранее отвечу на вопрос "зачем" хочу написать свою функцию инжекта.
и
зачем он мне нужен? для удовлетворения своего интереса (большей частью)....
ПС: если кому интересно могу функции тул хэлпа выложить свои...
Muvvka вне форума   Ответить с цитированием
Старый 17.05.2013, 07:59   #2
Stilet
Белик Виталий :)
Профессионал
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Адрес: Украина, Донецкая область, г. Краматорск
Сообщений: 57,840
Репутация: 6850
По умолчанию

Цитата:
литературу "читать"
Статью MS-REMa "Перехват API функций в Windows NT"
P.S. Там правда на Делфи, но ты хотя бы получишь начальную точку поисков.
__________________
I'm learning to live...
Stilet вне форума   Ответить с цитированием
Старый 17.05.2013, 13:53   #3
coNsept
Участник клуба
 
Аватар для coNsept
 
Регистрация: 14.12.2009
Адрес: Republic of Moldova
Сообщений: 716
Репутация: 44

skype: mr.kernighan
По умолчанию

Все четко и понятно расписанно, плюс еще и на си: http://www.rsdn.ru/article/baseserv/IntercetionAPI.xml

Ты объясни конкретнее что тебе нужно перехватить, возможно помогу и покажу что и как нужно делать.
coNsept вне форума   Ответить с цитированием
Старый 17.05.2013, 18:17   #4
Muvvka
Пользователь
 
Аватар для Muvvka
 
Регистрация: 27.04.2012
Сообщений: 18
Репутация: 10

icq: 359992440
skype: Muvvka
По умолчанию

Код:
Ты объясни конкретнее что тебе нужно перехватить
я хочу с начала понять принципы и возможности, далее изучать принцип работы нужного мне процесса и далее думать как мне что то в нём крутить и поворачивать=)
Код:
возможно помогу и покажу что и как нужно делать.
спасибо огромное, статью почитаю!
нужды в помощи пока нету так как может быть и сам осилю!
Visual C++ == переделаю под C++ builder как нибудь....
1 пример вроде как реализовал (компилирует без ошибок и предупреждений сам *.Dll и код инжектера)
только к примеру вот :
Код:
HANDLE hProcess;
BYTE *p_code;
INJECTORCODE cmds;
DWORD wr, id;
//открыть процесс с нужным доступом
hProess=OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, FALSE, pid);
интересно он ошибок понаделал чтобы нельзя было просто копипаст и всё?

Последний раз редактировалось Muvvka; 17.05.2013 в 22:56.
Muvvka вне форума   Ответить с цитированием
Старый 17.05.2013, 22:56   #5
Muvvka
Пользователь
 
Аватар для Muvvka
 
Регистрация: 27.04.2012
Сообщений: 18
Репутация: 10

icq: 359992440
skype: Muvvka
По умолчанию

реализовал оба примера всё нормально компилируются но при попытке инжекта вылазит вот это


вот код инжектера :
Код:
using namespace std;

bool Process32();
DWORD dwProcessId;
struct INJECTORCODE
{
  BYTE  instr_push_loadlibrary_arg; //инструкция push
  DWORD loadlibrary_arg;            //аргумент push  

  WORD  instr_call_loadlibrary;     //инструкция call []  
  DWORD adr_from_call_loadlibrary;

  BYTE  instr_push_exitthread_arg;
  DWORD exitthread_arg;

  WORD  instr_call_exitthread;
  DWORD adr_from_call_exitthread;

  DWORD addr_loadlibrary;
  DWORD addr_exitthread;     //адрес функции ExitTHread
  BYTE  libraryname[100];    //имя и путь к загружаемой библиотеке  
};
BOOL InjectDll(DWORD pid, char *lpszDllName)
{
  HANDLE hProcess;
  BYTE *p_code;
  INJECTORCODE cmds;
  DWORD wr, id;

  //открыть процесс с нужным доступом
  hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_WRITE|PROCESS_VM_OPERATION, FALSE, pid);
  if(hProcess == NULL)
  {
    MessageBoxA(NULL, "You have not enough rights to attach dlls", 
               "Error!", 0);
    return FALSE;
  }
  
  //зарезервировать память в процессе
    p_code = (BYTE*)VirtualAllocEx(hProcess, 0, sizeof(INJECTORCODE),MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    if(p_code==NULL)
    {
      MessageBox(NULL, "Unable to alloc memory in remote process",
                       "Error!", 0);
      return FALSE;
    }

  //инициализировать  машинный код
  cmds.instr_push_loadlibrary_arg = 0x68; //машинный код инструкции push
  cmds.loadlibrary_arg = (DWORD)((BYTE*)p_code + offsetof(INJECTORCODE, libraryname));
  cmds.instr_call_loadlibrary = 0x15ff; //машинный код инструкции call
  cmds.adr_from_call_loadlibrary = (DWORD)(p_code + offsetof(INJECTORCODE, addr_loadlibrary));
  cmds.instr_push_exitthread_arg  = 0x68;
  cmds.exitthread_arg = 0;
  cmds.instr_call_exitthread = 0x15ff;
  cmds.adr_from_call_exitthread =(DWORD)(p_code + offsetof(INJECTORCODE, addr_exitthread));
  cmds.addr_loadlibrary = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
  cmds.addr_exitthread  = (DWORD)GetProcAddress(GetModuleHandle("kernel32.dll"),"ExitThread");
  if(strlen(lpszDllName)>99)
  {
     MessageBox(NULL, "Dll Name too long", "Error!", 0);
     return FALSE;
  }
  strcpy((char*)cmds.libraryname, lpszDllName );
  
  //записать машинный код по зарезервированному адресу
  WriteProcessMemory(hProcess, p_code, &cmds, sizeof(cmds), &wr);
  
  //выполнить машинный код
  HANDLE z = CreateRemoteThread(hProcess, NULL, 0,(unsigned long (__stdcall *)(void *))p_code, 0, 0, &id);


  //ожидать завершения удаленного потока
  WaitForSingleObject(z, INFINITE);
  VirtualFreeEx(hProcess, (void*)p_code, sizeof(cmds), MEM_RELEASE);//освободить память

  return TRUE;
}
bool Process32()
{
HANDLE hSnap;
PROCESSENTRY32 Pe32;
hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
if (hSnap == INVALID_HANDLE_VALUE){return false;}
Pe32.dwSize = sizeof(PROCESSENTRY32);
Process32First(hSnap, &Pe32);
while (Process32Next(hSnap, &Pe32)) 
{
cout<<Pe32.szExeFile<<" "<<Pe32.th32ProcessID<<"\n";
} 
CloseHandle(hSnap);
return true;
}
int main(int argc, char* argv[])
{
Process32();
cout<<"Enter process ID: ";
cin>>dwProcessId;
cout<<"\n";
char *DllName="inject.dll";
InjectDll(dwProcessId, DllName);
return 0;
}
может кто знает в чом может быть проблема?
Muvvka вне форума   Ответить с цитированием
Старый 18.05.2013, 11:54   #6
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,927
Репутация: 1937
По умолчанию

В alignment структуры. Или в неправильных вычислениях.
Можно также подключиться отладчиком к target процессу, так что когда все в нем сломается сможете посмотреть что к чему. Или можете сделать core dmp и опять смотреть отладчиком.

Кстати, вы выбрали самый сложный способ загрузить DLL. Поищите здесь на форуме, есть способы попроще, без необходимости ассемблера.

Ref:
http://en.wikipedia.org/wiki/Data_structure_alignment
waleri вне форума   Ответить с цитированием
Старый 18.05.2013, 17:52   #7
frommars
Форумчанин
 
Регистрация: 02.07.2011
Сообщений: 144
Репутация: 3
По умолчанию

права отладчика нужно получать, насколько помню
frommars вне форума   Ответить с цитированием
Старый 18.05.2013, 19:03   #8
Muvvka
Пользователь
 
Аватар для Muvvka
 
Регистрация: 27.04.2012
Сообщений: 18
Репутация: 10

icq: 359992440
skype: Muvvka
По умолчанию

Цитата:
права отладчика нужно получать
сори если ошибаюсь но вот без прав инжектит..
а мне бы просто сам инжект без перехватов и пр наворотов чтоб просто длл в процесс пихал... и птом мона было в модулях её найти=)
Вложения
Тип файла: rar inject.rar (25.7 Кб, 8 просмотров)
Muvvka вне форума   Ответить с цитированием
Старый 18.05.2013, 19:27   #9
Muvvka
Пользователь
 
Аватар для Muvvka
 
Регистрация: 27.04.2012
Сообщений: 18
Репутация: 10

icq: 359992440
skype: Muvvka
По умолчанию

значит я проблему решил (нашол сорц для Visual C++ и заэнчал его под билдер)=)
Цитата:
frommars
да код отладчика там был! но я его из интереса убрал, ибо у меня работает и без него...
далее буду пытаться перехватывать всякую чепуху, как наведу в нём красоту=)
буду тут помощи просить=)

Последний раз редактировалось Muvvka; 18.05.2013 в 23:35. Причина: нашол решение сам
Muvvka вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП подход. По правильному ли пути я иду? Ilnur888 Общие вопросы Delphi 1 26.02.2013 02:40
Вопрос по реализации агентно-ориентированного подход в С Zedd Общие вопросы C/C++ 0 03.10.2012 10:10
Грамотный подход к работе с прокси :) Once Работа с сетью в Delphi 8 24.08.2011 20:12
Подход к решению kaar Помощь студентам 2 04.04.2010 11:56


02:16.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.