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

Inject dll, а также вызов функции из этой же dll

13.02.2016, 15:23. Показов 7585. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет, заинжектить dll в другой процесс получилось, но еще необходимо вызвать функцию в этой длл, каким образом это реализовать?

Ну а поконкретнее, после инжета в процесс, нужно вызвать функцию setHWND, для передачи значения...

кусок dll'ки
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure Init(Reason: integer);
begin
  Dll_reason := Reason;
  HookPoint_Address := 0;
  if (Reason = DLL_PROCESS_ATTACH) then
  begin
    ShowMessage('Прикрепились');
    InitHook;
  end;
end;
 
procedure setHWND(hwnd: Cardinal);
begin
 hwnd_param:=hwnd;
end;
 
exports
  setHWND;
 
begin
  DLLProc := Init;
  Init(DLL_PROCESS_ATTACH);
кусок инжетора
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
function InjectDLL(dwPID: DWORD; DLLPath: PWideChar): integer;
var
  dwThreadID: Cardinal;
  hProc, hThread, hKernel: THandle;
  BytesToWrite, BytesWritten: SIZE_T;
  pRemoteBuffer, pLoadLibrary: Pointer;
begin
  hProc := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or
    PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, False, dwPID);
  if hProc = 0 then
    exit(0);
  try
    BytesToWrite := SizeOf(WideChar) * (Length(DLLPath) + 1);
    pRemoteBuffer := VirtualAllocEx(hProc, nil, BytesToWrite, MEM_COMMIT,
      PAGE_READWRITE);
    if pRemoteBuffer = nil then
      exit(0);
    try
      if not WriteProcessMemory(hProc, pRemoteBuffer, DLLPath, BytesToWrite,
        BytesWritten) then
        exit(0);
      hKernel := GetModuleHandle('kernel32.dll');
      pLoadLibrary := GetProcAddress(hKernel, 'LoadLibraryW');
      hThread := CreateRemoteThread(hProc, nil, 0, pLoadLibrary, pRemoteBuffer,
        0, dwThreadID);
      try
        WaitForSingleObject(hThread, INFINITE);
      finally
        CloseHandle(hThread);
      end;
    finally
      VirtualFreeEx(hProc, pRemoteBuffer, 0, MEM_RELEASE);
    end;
  finally
    CloseHandle(hProc);
  end;
  exit(1);
end;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  PID: DWORD;
  dir: string;
begin
  SetSeDebugPrivilege;
  PID := GetPID('zorron.exe');
  if (PID > 0) then
  begin
    dir := GetCurrentDir;
    InjectDLL(PID, PWideChar(dir + '\trans.dll'));
  end;
 
end;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.02.2016, 15:23
Ответы с готовыми решениями:

Dll inject в exe
Насчет того, как внедрить dll в процесс вопросов нет, но вот возможно ли внедрить dll в не запущенный exe ? вот так я внедряю dll в процесс...

Вызов функции из dll. Dll не определена в коде и подключается программно
Я написал простую функцию которая возвращает негатив bitmap'а Function Negative(ByVal Bmp As Bitmap) Dim Bmp2 As New...

Вызов функции DLL VB.NET в DLL C++
Как вызывать функции dll VB.NET через dll С++, которая приинжекчена к процессу проводника?

11
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.02.2016, 15:39
Цитата Сообщение от SEMod94 Посмотреть сообщение
еще необходимо вызвать функцию в этой длл, каким образом это реализовать?
Точно так же - с использованием CreatreRemoteThread
1
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 6
13.02.2016, 16:14  [ТС]
Ну это логично, но мне нужно как то получить адрес на эту функцию чтобы её вызвать и т.д.

А также создать прототип функции в программе, по типу
myfunc=procedure (hwnd: Cardinal);

И прочие мелочи, поэтому и спрашиваю поконкретнее, куда и что писать...

Заранее спасибо....
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.02.2016, 16:19
Цитата Сообщение от SEMod94 Посмотреть сообщение
нужно как то получить адрес на эту функцию
Поскольку процедура экспортируемая, адрес точки входа в нее м.б. получен вызовом GetProcAddress
1
2838 / 1647 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
13.02.2016, 16:40
Создай в Init'е поток в этом процессе и потом делай из него, что угодно.
1
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 6
13.02.2016, 17:11  [ТС]
А можно пример, как это сделать? Логически вроде понимаю как это сделать, а на деле, даже не знаю за что взяться...
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.02.2016, 17:20
Не занимайся фигней. Вызов своей ф-ции в чужом адресном пространстве - нетривиальная задача.
С такими знаниями ты ее попросту не потянешь.
Много проще передать своему "засланному казачку" нужные данные с использованием разделяемой между процессами памяти.

CreateFileMapping + MapViewOfFile
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 6
13.02.2016, 18:43  [ТС]
Хм, просто инжектить нужно не в одно приложение... Да и программ для инжекта может быть несколько... Разруливать через общую память не ахти(((

Либо я чтото не так понял...
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
13.02.2016, 18:50
Цитата Сообщение от SEMod94 Посмотреть сообщение
Разруливать через общую память не ахти
Это почему же ?
Программа-пастырь создает MMF, пишет туда нужное значение нужного параметра и следом инжектирует агнцев в нужные процессы.
Каждый из них, как только очухивается, открывает MMF и забирает нужные значения нужных им для пастьбы параметров)

Вуа-ля !
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 6
14.02.2016, 10:38  [ТС]
Не, не совсем то что нужно выходит(( при использовании многих функций дельфи, процесс крашится, например при setlength и некоторых других... куда инжекчу, написан на C++

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
function GetProcAddressEx(Process: dword; lpModuleName,
                          lpProcName: pansichar; dwProcLen: dword): pointer;
type
  TGetProcAddrExInfo = record
    pExitThread: pointer;
    pGetProcAddress: pointer;
    pGetModuleHandle: pointer;
    lpModuleName: pointer;
    lpProcName: pointer;
  end;
var
  GetProcAddrExInfo: TGetProcAddrExInfo;
  ExitCode: dword;
  hThread: dword;
 
  procedure GetProcAddrExThread(lpParameter: pointer); stdcall;
  var
    GetProcAddrExInfo: TGetProcAddrExInfo;
  begin
    GetProcAddrExInfo := TGetProcAddrExInfo(lpParameter^);
    asm
      push GetProcAddrExInfo.lpModuleName
      call GetProcAddrExInfo.pGetModuleHandle
      push GetProcAddrExInfo.lpProcName
      push eax
      call GetProcAddrExInfo.pGetProcAddress
      push eax
      call GetProcAddrExInfo.pExitThread
    end;
  end;
 
begin
  Result := nil;
  GetProcAddrExInfo.pGetModuleHandle := GetProcAddress(GetModuleHandle('kernel32.dll'),
                                                       'GetModuleHandleA');
  GetProcAddrExInfo.pGetProcAddress  := GetProcAddress(GetModuleHandle('kernel32.dll'),
                                                       'GetProcAddress');
  GetProcAddrExInfo.pExitThread      := GetProcAddress(GetModuleHandle('kernel32.dll'),
                                                       'ExitThread');
  if dwProcLen = 4 then GetProcAddrExInfo.lpProcName := lpProcName else
    GetProcAddrExInfo.lpProcName := InjectMemory(Process, lpProcName, dwProcLen);
 
  GetProcAddrExInfo.lpModuleName := InjectString(Process, lpModuleName);
  hThread := InjectThread(Process, @GetProcAddrExThread, @GetProcAddrExInfo,
                          SizeOf(GetProcAddrExInfo), False);
 
  if hThread <> 0 then
  begin
    WaitForSingleObject(hThread, INFINITE);
    GetExitCodeThread(hThread, ExitCode);
    Result := pointer(ExitCode);
  end;
end;
Нашел на просторах интернета, вот такую функцию
При вызове, получаю nil, как не пытался
Delphi
1
test:=GetProcAddressEx(hProc, PAnsiChar('Packsets.dll'), PAnsiChar('setHWND'), 4);
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
14.02.2016, 19:20
Цитата Сообщение от SEMod94 Посмотреть сообщение
При вызове, получаю nil
В АП какого процесса ты ее вызываешь ?
0
0 / 0 / 0
Регистрация: 13.02.2016
Сообщений: 6
14.02.2016, 19:26  [ТС]
Решил сам проблему, mss, спасибо за помощь, хоть и не в том направлении))

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
function GetProcAddressEx(Process: dword; lpModuleName:PChar;
                          lpProcName: pansichar; dwProcLen: dword): pointer;
type
  TGetProcAddrExInfo = record
    pExitThread: pointer;
    pGetProcAddress: pointer;
    pGetModuleHandle: pointer;
    lpModuleName: pointer;
    lpProcName: pointer;
  end;
var
  GetProcAddrExInfo: TGetProcAddrExInfo;
  ExitCode: dword;
  hThread: dword;
 
  procedure GetProcAddrExThread(lpParameter: pointer); stdcall;
  var
    GetProcAddrExInfo: TGetProcAddrExInfo;
  begin
    GetProcAddrExInfo := TGetProcAddrExInfo(lpParameter^);
    asm
      push GetProcAddrExInfo.lpModuleName
      call GetProcAddrExInfo.pGetModuleHandle
      push GetProcAddrExInfo.lpProcName
      push eax
      call GetProcAddrExInfo.pGetProcAddress
      push eax
      call GetProcAddrExInfo.pExitThread
    end;
  end;
 
begin
  Result := nil;
  GetProcAddrExInfo.pGetModuleHandle := GetProcAddress(GetModuleHandle('kernel32.dll'),'GetModuleHandleW');
  GetProcAddrExInfo.pGetProcAddress  := GetProcAddress(GetModuleHandle('kernel32.dll'),'GetProcAddress');
  GetProcAddrExInfo.pExitThread      := GetProcAddress(GetModuleHandle('kernel32.dll'),'ExitThread');
  if dwProcLen = 4 then GetProcAddrExInfo.lpProcName := lpProcName else
    GetProcAddrExInfo.lpProcName := InjectMemory(Process, lpProcName, dwProcLen);
 
  GetProcAddrExInfo.lpModuleName := InjectString(Process, lpModuleName);
  hThread := InjectThread(Process, @GetProcAddrExThread, @GetProcAddrExInfo,
                          SizeOf(GetProcAddrExInfo), False);
 
  if hThread <> 0 then
  begin
    WaitForSingleObject(hThread, INFINITE);
    GetExitCodeThread(hThread, ExitCode);
    Result := pointer(ExitCode);
  end;
end;
 
procedure sendHWND(dwPID: dword);
var
  dwThreadID: Cardinal;
  hProc, hThread, hKernel: THandle;
  BytesToWrite, BytesWritten: SIZE_T;
  pRemoteBuffer, pLoadLibrary: pointer;
  h: hwnd;
  test:pointer;
begin
  hProc := OpenProcess(PROCESS_CREATE_THREAD or PROCESS_QUERY_INFORMATION or
    PROCESS_VM_OPERATION or PROCESS_VM_WRITE or PROCESS_VM_READ, False, dwPID);
  try
    BytesToWrite := 4;
    pRemoteBuffer := VirtualAllocEx(hProc, nil, BytesToWrite, MEM_COMMIT,
      PAGE_READWRITE);
    try
      h := findwindow(nil, 'Form1');
      WriteProcessMemory(hProc, pRemoteBuffer, ptr(h), BytesToWrite, BytesWritten);
      test:=GetProcAddressEx(hProc, PChar('Packets.dll'), PAnsiChar('setHWND'), length('setHWND'));
      hThread := CreateRemoteThread(hProc, nil, 0, test, pRemoteBuffer, 0, dwThreadID);
      try
        WaitForSingleObject(hThread, INFINITE);
      finally
        CloseHandle(hThread);
      end;
    finally
      VirtualFreeEx(hProc, pRemoteBuffer, 0, MEM_RELEASE);
    end;
  finally
    CloseHandle(hProc);
  end;
end;
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.02.2016, 19:26
Помогаю со студенческими работами здесь

Вызов программой, написанной на С++, функции из dll, написанной на Assembler (явное подключение dll)
Доброго времени суток!Задали лабораторную работу: программа, написанная на с++ должна подключать dll, написанную на Assembler и вызывать...

Создать DLL и из тестовой программы вызвать процедуру из этой DLL
Здравствуйте ,проверти правильно выполнения задания ,нужно создать библиотеку и использовать ее же в программе . Библиотека. format...

Как из DLL, в котором есть только DllGetClassObject, обратиться к методу, который должен быть в этой DLL?
Есть метод ITaskbarList3::SetProgressState, он предназначен для того, чтобы в значке программы рисовать прогресс, как например хром рисует,...

Dll inject
Укажите в чем ошибка? Все проверки проходит, возвращает истину...но функции dll недоступны. bool Inject() { if (pid == NULL)...

Dll inject
Есть игра одна, хотел попробывать заинжектить туда свою dll и по выполнять ф-ции игры ) Всё подключается, GetLastError ошибок не...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru