Форум программистов, компьютерный форум, киберфорум
Delphi: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
1 / 1 / 0
Регистрация: 10.04.2013
Сообщений: 101

Отключение dll от стороннего процесса

12.05.2013, 20:07. Показов 3965. Ответов 16
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброе время суток подскажите каким образом можно отключить длл от стороннего процесса?
Пробовал через такой код но не получилось
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
function UnInjectModule(ModulePath: PAnsiChar; ProcessID: DWORD): Boolean;
type
  TNtCreateThreadEx = function(
  ThreadHandle: PHANDLE;
  DesiredAccess: ACCESS_MASK;
  ObjectAttributes: Pointer;
  ProcessHandle: THANDLE;
  lpStartAddress: Pointer;
  lpParameter: Pointer;
  CreateSuspended: BOOL;
  dwStackSize: DWORD;
  Unknown1: Pointer;
  Unknown2: Pointer;
  Unknown3: Pointer): HRESULT; stdcall;
var
  lpStartAddress, lpParameter: Pointer;
  hProcess, hThread, lpThreadId, lpExitCode: Cardinal;
  hSnapshot: THandle;
  ModuleEntry32: TModuleEntry32;
  NtCreateThreadEx: TNtCreateThreadEx;
begin
  Result := False;
  hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, ProcessID);
  if (hSnapshot <> -1) then
  begin
    ModuleEntry32.dwSize := SizeOf(TModuleEntry32);
    if (Module32First(hSnapshot, ModuleEntry32)) then
      repeat
        if string(ModuleEntry32.szExePath) = string(ModulePath) then
        begin
          lpParameter := ModuleEntry32.modBaseAddr;
          Break;
        end;
      until
        not Module32Next(hSnapshot, ModuleEntry32);
    CloseHandle(hSnapshot);
  end;
  hProcess := 0;
  hProcess := OpenProcess(MAXIMUM_ALLOWED, False, ProcessID);
  if hProcess = 0 then
  begin
    Result := False;
    Exit;
  end;
  if GetOSVersion >= 60 then
    NtCreateThreadEx := GetProcAddress(GetModuleHandleW('ntdll'), 'NtCreateThreadEx');
  if GetOSVersion >= 60 then
    if (@NtCreateThreadEx = nil) then
      Exit;
  lpStartAddress := GetProcAddress(GetModuleHandleW('Kernel32'), 'FreeLibrary');
  if (lpStartAddress = nil) then
  begin
    if hProcess <> 0 then
      CloseHandle(hProcess);
    Result := False;
    Exit;
  end;
  hThread := 0;
  lpThreadId := 0;
  if GetOSVersion >= 60 then
    NtCreateThreadEx(@hThread, MAXIMUM_ALLOWED, nil, hProcess, lpStartAddress, lpParameter, False, 0, 0, 0, 0)
  else
    hThread := CreateRemoteThread(hProcess, nil, 0, lpStartAddress, lpParameter, 0, lpThreadId);
  if (hThread = 0) then
  begin
    if hProcess <> 0 then
      CloseHandle(hProcess);
    Result := False;
    Exit;
  end;
  GetExitCodeThread(hThread, lpExitCode);
  if hProcess <> 0 then
    CloseHandle(hProcess);
  if hThread <> 0 then
    CloseHandle(hThread);
  Result := True;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  UnInjectModule(PAnsiChar(Edit1.Text), StrToInt(Edit2.Text));
end;
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
12.05.2013, 20:07
Ответы с готовыми решениями:

Выгрузка DLL из стороннего процесса
Как возможно выгрузить DLL из стороннего процесса, желательно пару примеров.

Чтение из стороннего процесса из dll
Есть ли другие способы читать память стороннего приложения, помимо readprocessmemory, через свою DLL?

Как получить адрес функции в dll стороннего процесса?
Я подцепляюсь к чужому процессу, модифицирую память. Как рабочее пространство использую ненужную функцию в подгружаемой процессом dll. На...

16
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
14.05.2013, 18:04
Вы запускаете в качестве удаленного потока функцию FreeLibrary. Хоть это не лучшее решение, но ладно, сигнатура этой ф-ции совпадает с сигнатурой стандартной потоковой ф-ции, но что вы передаете в качестве параметра? Какой дескриптор передается в FreeLibrary? У вас есть параметр lpParameter, через который можно было бы его передать, но проблема в том, что в своем потоке мы этот дескриптор узнать никак не можем. Так что запускать удаленным потоком нужно отдельную функцию с такой сигнатурой:
Delphi
1
function RemoteThread(const lpParameter: Pointer): Cardinal; stdcall;
Тело этой функции должно выглядеть примерно так:
Delphi
1
2
3
4
5
6
7
var
  Handle: THandle;
begin
  Handle:= GetModuleHandle('LIBRARY.DLL'); // определяем дескриптор
  if Handle <> 0 then // если DLL загружена,
    while FreeLibrary(Handle) do; // то выгружаем ее пока счетчик ссылок не обнулится
end;
Как передавать имя библиотеки в поток -- это отдельный вопрос. Напрашивающийся метод передачи PChar-строки (как и любого другого указателя) через lpParameter для удаленного потока работать не будет из-за разных адресных пространств процессов. Так что если это имя не статично, передавать его придется через IPC-каналы.
0
1 / 1 / 0
Регистрация: 10.04.2013
Сообщений: 101
14.05.2013, 18:16  [ТС]
Вы говорите, что Вы запускаете в качестве удаленного потока функцию FreeLibrary. Хоть это не лучшее решение, подскажите болие удобное решение для отключения длл от стороннего процесса
0
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
14.05.2013, 18:21
TYMAH,
Так что запускать удаленным потоком нужно отдельную функцию с такой сигнатурой:
и далее по тексту.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.05.2013, 19:42
Цитата Сообщение от quwy Посмотреть сообщение
Тело этой функции должно выглядеть примерно так:
Только эту функцию саму надо в память процесса записать, а размер её узнать проблематично, да и вряд ли код её будет базонезависимым.
Цитата Сообщение от quwy Посмотреть сообщение
Так что если это имя не статично, передавать его придется через IPC-каналы.
Осталось передать строку с именем канала
Так что лучше код в dll'ку, WriteProcessMemory с путём к ней и CreateRemoteThread с адресом LoadLibrary (а он один во всех процессах) и именем dll'ки.
0
1 / 1 / 0
Регистрация: 10.04.2013
Сообщений: 101
14.05.2013, 20:07  [ТС]
длл исходника нету так что изменить ее не получится
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.05.2013, 20:20
Не, я говорю, что внедряемый код лучше оформить в виде dll, а через CreateRemoteThread запускать LoadLibrary.
0
1 / 1 / 0
Регистрация: 10.04.2013
Сообщений: 101
14.05.2013, 20:54  [ТС]
непонял? сможешь образец проекта накидать?
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.05.2013, 21:11
Типа такого:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
char dllFullName[MAX_PATH + 1];
const size_t dllFullNameMaxLen = sizeof(dllFullName) / sizeof(char);
SearchPath(0, "oidll.dll", 0, dllFullNameMaxLen, dllFullName, 0);
HWND hCsWnd = FindWindow("Valve001", "Counter-Strike");
DWORD csProcessId;
GetWindowThreadProcessId(hCsWnd, &csProcessId);
HANDLE hCsProcess = OpenProcess(PROCESS_ALL_ACCESS, false, csProcessId);
LPVOID pFileName = VirtualAllocEx(hCsProcess, 0, sizeof(dllFullName),
    MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE);
WriteProcessMemory(hCsProcess, pFileName, dllFullName, sizeof(dllFullName), 0);
HINSTANCE hKernel32 = GetModuleHandle("kernel32.dll");
LPTHREAD_START_ROUTINE pLoadLibrary =
    (LPTHREAD_START_ROUTINE)GetProcAddress(hKernel32, "LoadLibraryA");
HANDLE hLoadingThread = CreateRemoteThread(hCsProcess, 0, 0, pLoadLibrary,
    pFileName, 0, 0);
WaitForSingleObject(hLoadingThread, INFINITE);
CloseHandle(hLoadingThread);
А в DllMain oidll.dll - всё, что нужно в чужом процессе делать.
0
Native x86
Эксперт Hardware
 Аватар для quwy
6857 / 3790 / 1025
Регистрация: 13.02.2013
Сообщений: 11,861
14.05.2013, 21:18
Цитата Сообщение от Somebody Посмотреть сообщение
Только эту функцию саму надо в память процесса записать, а размер её узнать проблематично, да и вряд ли код её будет базонезависимым.
Согласен.

Осталось передать строку с именем канала
Именем канала может быть (без учета префиксов/суффиксов) и NativeInt, который без проблем передается в параметре.

Так что лучше код в dll'ку, WriteProcessMemory с путём к ней и CreateRemoteThread с адресом LoadLibrary (а он один во всех процессах) и именем dll'ки.
А за WriteProcessMemory современные антивирусы больно бьют по рукам.
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.05.2013, 21:20
А, это раздел Delphi, я что-то подумал, что C++. Вот тогда Delphi:
dll
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
library Drawer;
 
uses
  Windows, Messages;
 
var
  hWindow: HWND;
  processId: DWORD;
  hWndDc, hBitmapDc: HDC;
  hBitmap: HGDIOBJ;
  hPen, hBrush1, hBrush2: HGDIOBJ;
  wndRect: TRect;
  wndWidth, wndHeight, wndCX, wndCY, size: LongInt;
  prevWindowProc: Pointer;
 
function WindowProc(hWnd: HWND; Msg: UINT; wParam: WPARAM;
  lParam: LPARAM): LRESULT; stdcall;
begin
  Result := 0;
  case Msg of
    WM_ERASEBKGND:
    begin
      CallWindowProc(prevWindowProc, hWnd, Msg, wParam, lParam);
      BitBlt(wParam, 0, 0, wndWidth - 1, wndHeight - 1, hBitmapDc, 0, 0, SRCAND);
      Result := 1;
    end;
    else
      Result := CallWindowProc(prevWindowProc, hWnd, Msg, wParam, lParam);
  end;
end;
 
procedure DllEntryPoint(Reason: Integer);
var
  ProcessId: Cardinal;
begin
  GetWindowThreadProcessID(hWindow, ProcessId);
  if ProcessID <> GetCurrentProcessID() then
    exit;
  if Reason = DLL_PROCESS_DETACH then
  begin
    SetWindowLong(hWindow, GWL_WNDPROC, Integer(prevWindowProc));
 
    DeleteDc(hBitmapDc);
    DeleteObject(hBitmap);
    DeleteObject(hPen);
    DeleteObject(hBrush1);
    DeleteObject(hBrush2);
  end;
end;
 
begin
  DisableThreadLibraryCalls(hInstance);
 
  hWindow := FindWindow('Progman', nil);
  hWindow := GetWindow(hWindow, GW_CHILD);
 
  GetWindowThreadProcessID(hWindow, ProcessId);
  if ProcessID <> GetCurrentProcessID() then
    exit;
 
  GetWindowRect(hWindow, wndRect);
  wndWidth := wndRect.Right - wndRect.Left + 1;
  wndHeight := wndRect.Bottom - wndRect.Top + 1;
  wndCX := wndWidth div 2;
  wndCY := wndHeight div 2;
  if wndWidth > wndHeight then
    size := wndHeight div 4
  else
    size := wndWidth div 4;
 
  hWndDc := GetDC(hWindow);
  hBitmap := CreateCompatibleBitmap(hWndDc, wndWidth, wndHeight);
  hBitmapDc := CreateCompatibleDC(hWndDc);
  ReleaseDc(hWindow, hWndDc);
  hPen := GetStockObject(BLACK_PEN);
  hBrush1 := CreateHatchBrush(HS_CROSS, RGB(0, 0, 0));
  hBrush2 := GetStockObject(WHITE_BRUSH);
 
  SelectObject(hBitmapDc, hBitmap);
  SelectObject(hBitmapDc, hPen);
  SelectObject(hBitmapDc, hBrush1);
  PatBlt(hBitmapDc, 0, 0, wndWidth - 1, wndHeight - 1, PATCOPY);
  SelectObject(hBitmapDc, hBrush2);
  Ellipse(hBitmapDc, wndCX - size, wndCY - size, wndCX + size, wndCY + size);
 
  prevWindowProc := Pointer(
    SetWindowLong(hWindow, GWL_WNDPROC, Integer(@WindowProc))
    );
 
  DllProc := DllEntryPoint;
end.

exe
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
uses
  Windows;
 
var
  hWindow: HWND;
  hProcess, hThread: THandle;
  processId, threadId: Cardinal;
  pFileName: PChar;
  n: Cardinal;
  pLoadLibrary, pFreeLibrary: Pointer;
  hKernel32, hDrawerDll: HMODULE;
  fileName: array [0..MAX_PATH] of Char;
 
begin
  SearchPath(nil, 'drawer.dll', nil, sizeof(fileName), @fileName, PPChar(nil)^);
  hWindow := FindWindow('ProgMan', nil);
  GetWindowThreadProcessId(hWindow, processId);
  hProcess := OpenProcess(PROCESS_ALL_ACCESS, false, processId);
  pFileName := VirtualAllocEx(hProcess, nil, sizeof(fileName),
    MEM_RESERVE or MEM_COMMIT, PAGE_READWRITE);
  WriteProcessMemory(hProcess, pFileName, @fileName, sizeof(fileName), n);
  hKernel32 := GetModuleHandle('kernel32.dll');
  pLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  pFreeLibrary := GetProcAddress(hKernel32, 'FreeLibrary');
  hThread := CreateRemoteThread(hProcess, nil, 0, pLoadLibrary,
    pFileName, 0, threadId);
  WaitForSingleObject(hThread, INFINITE);
  GetExitCodeThread(hThread, hDrawerDll);
  CloseHandle(hThread);
  VirtualFreeEx(hProcess, pFileName, 0, MEM_RELEASE);
  MessageBox(0, 'Press OK to unload', '...', 0);
  hThread := CreateRemoteThread(hProcess, nil, 0, pFreeLibrary,
    Pointer(hDrawerDll), 0, threadId);
 
  WaitForSingleObject(hThread, INFINITE);
  GetExitCodeThread(hThread, hDrawerDll);
 
  CloseHandle(hThread);
  CloseHandle(hProcess);
end.
0
1 / 1 / 0
Регистрация: 10.04.2013
Сообщений: 101
14.05.2013, 21:24  [ТС]
получается где Progman это название процесса? и drawer.dll отключится от процесса?
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
14.05.2013, 21:27
Цитата Сообщение от TYMAH Посмотреть сообщение
получается где Progman это название процесса? и drawer.dll отключится от процесса?
Нет, это просто пример внедрения кода.
0
1 / 1 / 0
Регистрация: 10.04.2013
Сообщений: 101
14.05.2013, 21:34  [ТС]
так давай по порядку, для чего нужна эта длл и и exe
0
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
15.05.2013, 11:41
Exe - основная прога, в dll - код, который надо выполнять в другом процессе; таким образом, не будет проблем с тем, что всё грузится по неизвестному адресу.
Получаем адрес LoadLibrary - он будет во всех процессах одинаковый, так что тут проблем нет. Пишем путь к нашей dll в память чужого процесса - это будет параметр для LoadLibrary. Вызываем CreateRemoteThread с адесом LoadLibrary и путём к нашей dll. dll грузится, делает, что надо.
Чтобы саму эту dll выгрузить, так же можно вызвать FreeLibrary. Или (не пробовал, но вроде должно работать) в DllMain можно сделать CreateThread, а в том потоке - FreeLibraryAndExitThread.
0
1 / 1 / 0
Регистрация: 10.04.2013
Сообщений: 101
15.05.2013, 15:58  [ТС]
Есть скайп? Нужно пару вопросов обсудить
0
 Аватар для _lucius_
391 / 179 / 2
Регистрация: 14.03.2012
Сообщений: 443
17.05.2013, 16:14
TYMAH, Вот этот шел внедряйте:

E8 00 00 00 00 5B 8D 43 19 50 8B 43 11 FF D0 50 8B 43 15 FF D0 C3
41 B7 80 7C 7E AC 80 7C
75 73 65 72 33 32 2E 64 6C 6C 00
И не надо никаких либ грузить. Только перед инжектом пропатчите адреса и впишите имя вашей dll'ки.

41 B7 80 7C - адрес GetModuleHandleA
7E AC 80 7C - адрес FreeLibraryA
75 73 65 72 33 32 2E 64 6C 6C 00 - имя dll

Вот сам код, чтоб вам понятно было что он делает:

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
    call @Dlt
@Dlt:   pop ebx
    lea eax,[[ebx+(offset DllName - offset @Dlt)]]
    push eax
    mov eax,[[ebx+(offset PGetModuleHandleA - offset @Dlt)]]
    call eax
    push eax
    mov eax,[[ebx+(offset PFreeLibraryA - offset @Dlt)]]
    call eax
    ret
    PGetModuleHandleA dd 7C80B741h
    PFreeLibraryA dd 7C80AC7Eh
    DllName db 'user32.dll',0
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.05.2013, 16:14
Помогаю со студенческими работами здесь

Завершение стороннего процесса
День добрый. Возможно ли из программы завершить другую программу? Т.е. при нажатии на кнопку моей программы завершаем работу...

Запуск стороннего процесса
Здравствуйте , нужна помощь в работе с формами в VS 2012 . Мною была написана игра через OpenGL и хотелось бы к этой игре создать меню....

Закрытие стороннего процесса
Всем привет. У меня возникла проблема мне нужно закрыть сторонний процесс.Пока я понял только как закрыть процесс по названию например:...

Завершение стороннего процесса
Нужна помощь!!! как завершить какой либо процесс в Windows'e при нажатии кнопки на форме прошу ответ более подробно я новичок еще.:) ...

Перехват информации из стороннего процесса
Всем привет, появилась новая проблема. Хочу написать бота для одной простой игры. И возник вопрос, каким же способом можно перехватить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru