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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.12.2011, 16:23   #1
nls
Пользователь
 
Регистрация: 25.12.2011
Сообщений: 20
По умолчанию String и PAnsiChar

Нужно при запуске программы извлечь dll из ресурсов во временный каталог и проинжектить в другой процесс. Для извлечения dll из ресурсов используется ф-я ExtractRes(), для получения временного каталога - GetEnvironmentVariable('TEMP');. Ф-я возвращает значение типа String.

Инжект осуществляет вот эта ф-я (прошу обратить внимание на 2-й параметр) :
Код:
procedure InjectDll(TargetId: cardinal; DllName: PAnsiChar);
var
  BytesWrite    : cardinal;
  ParamAddr     : pointer;
  pThreadStart  : pointer;
  Hdl           : cardinal;
  hThread       : cardinal;
  hRemoteThread : Cardinal;
begin
  ChangePrivilege('SeDebugPrivilege', True);
  Hdl := OpenProcess(PROCESS_ALL_ACCESS, false, TargetId);
  ParamAddr := VirtualAllocEx(Hdl, nil, Length(DllName), MEM_COMMIT or MEM_RESERVE,PAGE_EXECUTE_READWRITE);
  WriteProcessMemory(Hdl,  ParamAddr, PAnsichar(DllName), Length(DllName), BytesWrite);
  pThreadStart := GetProcAddress(GetModuleHandle('KERNEL32.DLL'), PAnsiChar('LoadLibraryA'));
  hThread  := CreateRemoteThread(Hdl, nil, 0, pThreadStart, ParamAddr, 0,hRemoteThread);
  WaitForSingleObject(hThread, INFINITE);
  CloseHandle(hThread);
end;

В обработчике OnCreate() прописываю:
Код:
//var
   //Temp: String; Temp - глобальная переменная.
begin
   Temp := GetEnvironmentVariable('TEMP');
   ExtractRes('CUSTOM', 'DLL', Temp+'/mssxs64.dll');
end
Dll успешно извлекается во временный каталог. Теперь мне нужно передать этот путь во 2-й параметр ф-и InjectDll.
Делаю вот так:
Код:
 
Temp := GetEnvironmentVariable('TEMP');
InjectDll(pID, Temp+'/mssxs32.dll');
Но т.к. 2-й параметр ф-и InjectDll должен быть как PAnsiChar, а у меня он получается как String, компилятор выдает ошибку:
Код:
E2010 Incompatible types: 'string' and 'PAnsiChar'
Пробовал перевести в PAnsiChar вот таким вызовом:
Код:
InjectDll(pID, (PChar(Temp+'/mssxs32.dll')));
Но компилятор почему-то опять ругаеццо:
Код:
Incompatible types: 'Char' and 'AnsiChar'
Как можно этот String привести к PAnsiChar, чтобы компилятор не ругался и ф-я InjectDll() смогла понять этот путь?
nls вне форума Ответить с цитированием
Старый 27.12.2011, 16:34   #2
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

в 2009 и выше PChar соответсвует PWideChar
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.12.2011, 16:42   #3
nls
Пользователь
 
Регистрация: 25.12.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
в 2009 и выше PChar соответсвует PWideChar
Код:
InjectDll(pID, (PWideChar(Temp+'/mssxs32.dll')));
То же самое:
Код:
Incompatible types: 'Char' and 'AnsiChar'
nls вне форума Ответить с цитированием
Старый 27.12.2011, 16:59   #4
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

ну так надо же

Код:
InjectDll(pID, (PAnsiChar(Temp+'/mssxs32.dll')));
хотя лучше везде перейти на юникод
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.12.2011, 17:57   #5
nls
Пользователь
 
Регистрация: 25.12.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
ну так надо же

Код:
InjectDll(pID, (PAnsiChar(Temp+'/mssxs32.dll')));
хотя лучше везде перейти на юникод
Попробовал. Компилируется успешно, но инжект не проходит. Я вообще на раннем этапе указывал этот путь напрямую. Вот так:
Код:
InjectDll(pID, 'C:/mssxs64.dll');
И это отлично работает. Может можно ещё как-то получить путь к временной папке (так, чтобы не пришлось делать преобразование)?
nls вне форума Ответить с цитированием
Старый 27.12.2011, 18:45   #6
veniside
Старожил
 
Регистрация: 03.01.2011
Сообщений: 2,508
По умолчанию

Код:
ExtractRes('CUSTOM', 'DLL', Temp+'/mssxs64.dll');
тут у вас 64

Код:
InjectDll(pID, (PAnsiChar(Temp+'/mssxs32.dll')));
тут уже 32

Код:
InjectDll(pID, 'C:/mssxs64.dll');
тут опять 64
"Когда приходит положенное время, человек перестаёт играть в пинбол. Только и всего."
veniside вне форума Ответить с цитированием
Старый 27.12.2011, 19:14   #7
nls
Пользователь
 
Регистрация: 25.12.2011
Сообщений: 20
По умолчанию

Цитата:
Сообщение от veniside Посмотреть сообщение
Код:
ExtractRes('CUSTOM', 'DLL', Temp+'/mssxs64.dll');
тут у вас 64

Код:
InjectDll(pID, (PAnsiChar(Temp+'/mssxs32.dll')));
тут уже 32

Код:
InjectDll(pID, 'C:/mssxs64.dll');
тут опять 64
Поправил, но всё равно без результата. Просто тупо не инжектит.
nls вне форума Ответить с цитированием
Старый 27.12.2011, 19:23   #8
grafgrial
Просто хороший
Форумчанин
 
Аватар для grafgrial
 
Регистрация: 26.03.2010
Сообщений: 562
По умолчанию

nls ну есть еще способ получить путь к временной папке
http://www.delphilab.ru/content/view/160/85
Помог, нажми весы слева
grafgrial вне форума Ответить с цитированием
Старый 27.12.2011, 22:20   #9
nls
Пользователь
 
Регистрация: 25.12.2011
Сообщений: 20
По умолчанию

Не ну ппц полный. Злость через край лезет. Я просто не знаю что нужно этому компилятору. У кого есть время, гляньте плиз проект (delphi 2010). Там минимум кода. При успешном инжекте должен высветиться MessageBox(). Плиз.
Вложения
Тип файла: rar inject.rar (314.5 Кб, 21 просмотров)
nls вне форума Ответить с цитированием
Старый 27.12.2011, 22:34   #10
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

вам надо писать так:
Код:
PAnsiChar(AnsiString(Temp+'путь'))
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как string перевисти в PAnsiChar? jeki0 Общие вопросы Delphi 8 07.01.2011 18:41
Конвертация String в PAnsiChar в Delphi vandrouny Помощь студентам 5 28.10.2010 22:27
из String в Pansichar пауэрлифтинг Общие вопросы Delphi 10 05.02.2010 02:40
как из string перевести в PAnsiChar Sparky Общие вопросы Delphi 3 29.08.2009 14:12
pansichar to string Toxa Общие вопросы Delphi 16 31.05.2007 13:40