Компьютерная помощь
Сайт комнаты "Компьютерная помощь"

Вставка dll в процесс

Программирование | 16 июля 2016 г.

Автор: Code_46

Часто надо заинжектить длл ку в какой нибудь процесс.
Мы сделаем удобную утилитку кликнув по длл ке в контекстном меню будет наш пункт inject to . . . кликнув по которому, можно легко и быстро внедрить длл ку в любой процесс. Ну а там кому что по душе и так добавим ресурс диалога на нем поместим listbox и начинаем кодить...

#include <stdio.h>
#include <string.h
#include <windows.h>
#include <tlhelp32.h>
#include <shlwapi.h>
#include "resource.h"

#define HASHSIZE 101

volatile unsigned long _data;
#define tls(_data) ((struct info*)TlsGetValue ( _data ))


struct process_in {
  char exe [ MAX_PATH ];
  unsigned pid;
};

struct info {
  char path [ MAX_PATH ];
  struct process_in arr [ HASHSIZE ];
};

unsigned hash ( char * s ) {
  unsigned hashval;

  for ( hashval = 0; *s; s++ )
    hashval = *s + 31 * hashval;
  return hashval % HASHSIZE;
}

/***************************************************************************\
* делаем снимок процессов заполняем listbox попутно сохраняем pid'ы
\***************************************************************************/
int select_prce ( HWND hListBox ) {
  PROCESSENTRY32 pe32;
  HANDLE hSnap;
  unsigned hashval;

  hSnap = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0 );
  if ( !hSnap )
    return 0;

  pe32.dwSize = sizeof pe32;
  Process32First ( hSnap, &pe32 );

  while ( Process32Next ( hSnap, &pe32 ) ) {
    wsprintf ( pe32.szExeFile + lstrlen ( pe32.szExeFile ), " %d", pe32.th32ProcessID );
    hashval = hash ( pe32.szExeFile );
    tls(_data)->arr [ hashval ].pid = pe32.th32ProcessID;
    lstrcpy ( tls(_data)->arr [ hashval ].exe, pe32.szExeFile );
    SendMessage ( hListBox, LB_ADDSTRING, 0, (LPARAM)pe32.szExeFile );
  }
  CloseHandle ( hSnap );
  return 1;
}

/***************************************************************************\
* берем привелегии отладчика чтоб открывались
* csrss.exe winlogon.exe нужны привелегии админа системы
\***************************************************************************/
int set_priv ( void ) {
  HANDLE hToken;
  TOKEN_PRIVILEGES tkp;
  DWORD dwRet;

  if ( !OpenProcessToken ( GetCurrentProcess ( ), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ))
    return 0;
  if ( !LookupPrivilegeValue ( NULL, "SeDebugPrivilege", &tkp.Privileges[0].Luid ))
    return 0;

  tkp.PrivilegeCount = 1;
  tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  return AdjustTokenPrivileges ( hToken, FALSE, &tkp, 0, NULL, &dwRet );
}

/***************************************************************************\
* инжектим длл ку в процесс выделяем память под строку к длл ке
* стартовый адрес LoadLibrary записываем в память строку к длл ке
* и запускаем поток в kernel32.dll:LoadLibrary для загрузки нашей длл ки
\***************************************************************************/
int inject ( unsigned pid ) {
  unsigned writes;
  void * addr, * hproc, * proc, *hremth;

  hproc = OpenProcess ( PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, pid );
  if ( !hproc )
    goto error;

  addr = VirtualAllocEx ( hproc, NULL, lstrlen ( tls(_data)->path ) + 1, MEM_COMMIT | MEM_TOP_DOWN, PAGE_READWRITE );
  if ( !addr )
    goto error;

  if ( !WriteProcessMemory ( hproc, addr, tls(_data)->path, lstrlen ( tls(_data)->path ) + 1, &writes ))
    goto error;

  proc = GetProcAddress ( GetModuleHandle ( "Kernel32.dll" ), "LoadLibraryA" );
  if ( !proc )
    goto error;

  hremth = CreateRemoteThread ( hproc, NULL, 0, proc, addr, 0, NULL );
  if ( !hremth )
    goto error;
  goto success;

error:
  if ( addr )
    VirtualFreeEx ( hproc, addr, writes, MEM_DECOMMIT | MEM_RELEASE );
  if ( hproc )
    CloseHandle ( hproc );
  return 0;

success:
  WaitForSingleObject ( hremth, INFINITE );
  VirtualFreeEx ( hproc, addr, writes, MEM_DECOMMIT | MEM_RELEASE );
  CloseHandle ( hproc );
  CloseHandle ( hremth );
  return 1;
}

/***************************************************************************\
* обычная диалоговая процедура по двойному клику на процессе инжектит длл ку
\***************************************************************************/
BOOL CALLBACK ShowPrce ( HWND hwnd, UINT msg, WPARAM wParam ,LPARAM lParam ) {
  switch ( msg ) {
    case WM_INITDIALOG:
      if (!set_priv ( ))
	MessageBox ( hwnd, "set_priv failed", "", 0 );

      select_prce ( GetDlgItem ( hwnd, IDC_LIST1 ));
      return TRUE;
    case WM_COMMAND:
      switch (LOWORD(wParam)) {
	case IDCANCEL:
          EndDialog ( hwnd, 0 );
          return TRUE;
      }
      switch (HIWORD(wParam)) {
        case LBN_DBLCLK:
          {
            int i;
            char buff [ 1024 ];

            i = SendMessage ( GetDlgItem ( hwnd, IDC_LIST1 ), LB_GETCURSEL, 0, 0 );
            SendMessage ( GetDlgItem ( hwnd, IDC_LIST1 ), LB_GETTEXT, i, (LPARAM)buff );
            if ( !inject ( tls(_data)->arr [ hash ( buff ) ].pid ))
              MessageBox ( hwnd, "failed", "", 0 );
            else
              MessageBox ( hwnd, "success", "", 0 );
          }
      }
  }
  return FALSE;
}

/***************************************************************************\
* при запуске получаем в lpCmdLine путь к длл ке и запускаем диалог
\***************************************************************************/
int __stdcall entry ( void ) {
  int i;
  char * lpCmdLine;
  struct info * inj;

  i = 0;
  lpCmdLine = GetCommandLine ( );
  lpCmdLine = StrRChr ( lpCmdLine, lpCmdLine + lstrlen ( lpCmdLine ) - 2, '"' );

  if ( (*(lpCmdLine - 2) != '"') && (*(lpCmdLine+2) != '"') )
    return 0;

  _data = TlsAlloc ( );
  inj = HeapAlloc ( GetProcessHeap ( ), 0, sizeof ( struct info ) );
  TlsSetValue ( _data, inj );


  lstrcpy ( tls(_data)->path, lpCmdLine + 1 );
  tls(_data)->path [ lstrlen ( tls(_data)->path ) - 1 ] = '\0';

  DialogBox ( GetModuleHandle ( NULL ), MAKEINTRESOURCE ( IDD_DIALOG1 ), NULL, ShowPrce );

  HeapFree ( GetProcessHeap ( ), 0, tls(_data) );
  TlsFree ( _data );
  return 0;
}

/***************************************************************************\
* несколько слов о добавлении нашего пункта в контекстное меню длл ки
* открываем реестр ключ HKEY_CLASSES_ROOT\dllfile\shell\ создаем в нем подключ с именем которое будет отображатся
* в контекстном меню например у меня он называется inject to . . . в нем подключ command в параметре по
* умолчанию пишем значение "C:\WINDOWS\system32\inject.exe""%1" тоесть бросаем нашу тузлу в системный
* каталог и записываем к ней путь на месте "%1" будет при разворачивании путь к нашей длл ке все пользуемся ))
\***************************************************************************/
twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru yandex.ru

При цитировании, копировании, клонировании материалов с сайта целиком или частично, ссылка на страницу, откуда был скопирован материал, обязательна! При нарушении данных условий прошу незамедлительно удалить со своих ресурсов скопированный материал. Администрация сайта.



Комментариев: 0

    Оставьте комментарий!

    grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

    Используйте нормальные имена

    Вы можете войти под своим логином или зарегистрироваться на сайте.

    (обязательно)