Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.08.2011, 21:17   #11
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

А ты вообще задавался себе вопросом, что за "ахинею" ты пишешь в строчках

Код:
  Inject.PushCommand    := $68;
  inject.PushArgument   := code + $1E;
  inject.CallCommand    := $15FF;
  inject.CallAddr       := code + $16;
  inject.PushExitThread := $68;
  inject.ExitThreadArg  := 0;
  inject.CallExitThread := $15FF;
  inject.CallExitThreadAddr := code + $1A;
  hKernel32 := GetModuleHandle('kernel32.dll');
  inject.AddrLoadLibrary := GetProcAddress(hKernel32, 'LoadLibraryA');
  inject.AddrExitThread  := GetProcAddress(hKernel32, 'ExitThread');
  lstrcpy(@inject.LibraryName, ModulePath);
?

Или содрал откуда-то "на авось" ?
mss вне форума Ответить с цитированием
Старый 12.08.2011, 21:22   #12
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Этот код я взял из примера JTG (ссылка выше). Однако, другие варианты этого кода тоже не дают результатов.


Код:
procedure AttachDllToProcess(pID: integer; LibName: string);
 var
 ThreadID:Cardinal;
 ThreadHndl:THandle;
 AllocBuffer:Pointer;
 BytesWritten:Cardinal;
 ProcAddr:Pointer;
 ExitCode:Cardinal;
 hProcess: integer;
 begin
 hProcess:=OpenProcess(PROCESS_CREATE_THREAD or PROCESS_VM_OPERATION or PROCESS_VM_WRITE, false, pID);
 if (hProcess=0) then
 Exit;

 AllocBuffer:=VirtualAllocEx(hProcess, nil, length(LibName)+1, MEM_COMMIT, PAGE_READWRITE);
 if (AllocBuffer<>nil) then
 WriteProcessMemory(hProcess, AllocBuffer, PChar(LibName), length(LibName)+1, BytesWritten)
 else
 Exit;

 ProcAddr:=GetProcAddress(LoadLibrary(PChar('Kernel32.dll')), PChar('LoadLibraryA'));
 ThreadHndl:=CreateRemoteThread(hProcess, nil, 0, ProcAddr, AllocBuffer, 0, ThreadID);

 WaitForSingleObject(ThreadHndl, INFINITE);
 GetExitCodeThread(ThreadHndl, ExitCode);
 CloseHandle(ThreadHndl);
 VirtualFreeEx(hProcess, AllocBuffer, 0, MEM_RELEASE);
 CloseHandle(hProcess);

 end;
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 12.08.2011, 21:33   #13
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

эээ.... а может не код драть надо, а головой думать? Принцип понять?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.08.2011, 21:39   #14
Larboss
Недо
Участник клуба
 
Регистрация: 11.08.2011
Сообщений: 1,394
По умолчанию

Возможно, я очень тупой, не исключаю. Не могли бы указать на мою ошибку?
С помощью программирования можно разбогатеть и изменить мир к лучшему (с) Бьерн Страуструп
Larboss вне форума Ответить с цитированием
Старый 12.08.2011, 21:43   #15
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ошибка номер 1 - тебе указал на неё mss.

Иными словами, у тебя нет обработки ошибок. Т.е. если что-то идёт не так - нельзя понять, что случилось.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.08.2011, 21:44   #16
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
может не код драть надо, а головой думать? Принцип понять?
Золотые слова !
mss вне форума Ответить с цитированием
Старый 12.08.2011, 21:45   #17
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Мат-часть: http://www.delphikingdom.ru/asp/view...=1392#Header_1

Пример правильной обработки:
Код:
Process := OpenProcess(...);
if Process = 0 then
  RaiseLastOSError;
try
  // работа с процессом
finally
  CloseHandle(Process);
end;
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.08.2011, 21:45   #18
mss
Заблокирован
 
Регистрация: 27.05.2010
Сообщений: 1,099
По умолчанию

Цитата:
Не могли бы указать на мою ошибку?
Функция отличается от процедуры тем что возвращает результат.
ЭТО тебе о чем-то вообще говорит ?

Цитата:
Пример правильной обработки
А еще более кратко и изящней
Код:
hProcess := OpenProcess(...);
Win32Check(hProcess <> INVALID_HANDLE)
Ну это, разумеется, на профессионально-любительский взгляд)

Последний раз редактировалось Stilet; 14.08.2011 в 17:13.
mss вне форума Ответить с цитированием
Старый 12.08.2011, 21:57   #19
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Давайте я просуммирую материал, а вы его обещаетесь прочитать и понять.

1. Почему, если кто-то сказал, что этот код у него работает, то это вовсе не означает, что код будет работать у вас.
2. Почему не надо копировать код, а его разбирать.
3. Базовые сведения об обработке ошибок (1.1 и 1.2).
4. Основы программирования на WinAPI в Delphi.
5. Базовые сведения об архитектуре памяти и изоляции процессов в Windows.
6. Дополнение по загруженным исполняемым модулям.
7. Введение в ловушки Windows.
8. Теория по внедрению DLL.
9. Здесь должна быть ссылка по IPC, но у меня нет ничего на примете, за исключением MSDN.

Вот, это необходимый багаж знаний для успешной реализации вашей задачи.

Что, думали, раз книжку "Delphi для чайников за 15 минут" прочитали - уже программист?

Без обид, но мудрый человек берётся за задачи, которые ему по плечу. Изучайте, экспериментируйте. Один маленький шаг за раз. И когда-нибудь эта задача станет для вас элементарной.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 12.08.2011, 21:59   #20
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
А еще более кратко и изящней
Если про Win32Check - таки да, но Win32Check не везде доступна. Я не помню, в какой версии Delphi она появляется и в каком модуле, так что перестраховался.

А насчёт "<> INVALID_HANDLE" - чему INVALID_HANDLE-то равен? В доке написано про 0. INVALID_HANDLE равен 0? Я к тому, что легко спутать с INVALID_HANDLE_VALUE равного -1. Так что уж пусть лучше 0.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Dll в ресурсах и вызов функций из нее Obsever0 Общие вопросы Delphi 15 15.09.2015 23:46
Вызов функций на Ассемблере в программе на С++ РагнаР Общие вопросы C/C++ 1 30.05.2011 16:15
объявление функций и вызов SnOoPKa Общие вопросы C/C++ 3 30.01.2011 01:53
Вызов другой программы Anatoly555 Помощь студентам 1 18.03.2010 08:08
Повторный вызов функций Roman Общие вопросы C/C++ 1 10.06.2009 14:48