 |
ActiveDelphi .: O site do programador Delphi! :.
|
| Exibir mensagem anterior :: Exibir próxima mensagem |
| Autor |
Mensagem |
SrJeff Aprendiz

Registrado: Sexta-Feira, 8 de Janeiro de 2010 Mensagens: 289
|
Enviada: Ter Jun 26, 2012 8:05 pm Assunto: Code Injection (Migrar do delphi 7 para delphi 2010) |
|
|
Bom caros amigos programadores, tinha um código a muito tempo guardado, que era um code injection em delphi 7 que permite injetar um código de uma dll em um processo em execução, mas vocês já devem saber... O problema é que hoje precisei mas quando fui usar no delphi 2010 não funcionou, fiz vários testes e só funciona em delphi 7, creio eu que seja algum tipo incompatível algo como algum pansichar para widechar coisa do tipo, mas eu não consegui resolver, vou colocar o código do code injection se vocês conseguirem migrar e fazer funcionar no delphi 2010 postem o código que funcionou no delphi 2010.
Projeto no delphi 7
| Código: |
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, tlhelp32, StdCtrls, ExtCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
type
TInjectParams = record
LoadLibrary: function (lpLibFileName: PAnsiChar): Cardinal; stdcall;
LibName: PAnsiChar;
GetProcAddress: function (hModule: Cardinal; lpProcName: PAnsiChar): Pointer; stdcall;
ProcName: PAnsiChar;
end;
PInjectParams = ^TInjectParams;
var
Form1: TForm1;
implementation
{$R *.dfm}
function GetProcess(proc: string): Cardinal;
var
Snap: THandle;
pe: TProcessEntry32;
begin
Snap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
if Snap = 0 then Exit;
if Process32First(Snap,pe) then
begin
repeat
if proc = pe.szExeFile then
begin
Result:=pe.th32ProcessID;
break;
end;
until not Process32Next(Snap,pe)
end
end;
function WriteString(Process: Cardinal; s: string): Pointer;
var
bytes: Cardinal;
begin
Result:=VirtualAllocEx(Process, nil, length(s) + 1, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(Process, Result , pchar(s), length(s) + 1, bytes);
end;
function WriteData(Process, dwSize: Cardinal; RemoteData: pointer): pointer;
var
bytes: Cardinal;
begin
Result:=VirtualAllocEx(Process, nil, dwSize, MEM_COMMIT or MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(Process, Result, RemoteData, dwSize, bytes);
end;
procedure RemoteFunction(Parametros: PInjectParams); stdcall;
var
proc: procedure; stdcall;
begin
proc:=Parametros^.GetProcAddress(Parametros^.LoadLibrary(Parametros^.LibName),Parametros^.ProcName);
proc;
end;
procedure RemoteFunctionEnd; stdcall;
begin;
end;
procedure ChangePrivilege(szPrivilege: PChar; fEnable: Boolean);
var
NewState: TTokenPrivileges;
luid: TLargeInteger;
hToken: THandle;
ReturnLength: DWord;
begin
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, hToken);
LookupPrivilegeValue(nil, szPrivilege, luid);
NewState.PrivilegeCount := 1;
NewState.Privileges[0].Luid := luid;
if (fEnable) then
NewState.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED
else
NewState.Privileges[0].Attributes := 0;
AdjustTokenPrivileges(hToken, False, NewState, SizeOf(NewState), nil, ReturnLength);
CloseHandle(hToken);
end;
procedure Inject(process, dll, code: string);
var
PID, hProcess, ThreadId, ThreadHandle: Cardinal;
RemoteData,RemoteFunc,LibFileName,ProcName: pointer;
Parametros: TInjectParams;
begin
{Pega o Handle do processo}
PID:=GetProcess(Process);
{Seta o privilégio de debug}
ChangePrivilege('SeDebugPrivilege', True);
{Abre o processo}
hProcess := OpenProcess(PROCESS_ALL_ACCESS, False, PID);
{Define os parâmetros que serão usados para executar a procedure}
LibFileName:=WriteString(hProcess, dll);
ProcName:=WriteString(hProcess, code);
Parametros.LoadLibrary:=GetProcAddress(GetModuleHandle('kernel32'), 'LoadLibraryA');
Parametros.LibName:=LibFileName;
Parametros.GetProcAddress:=GetProcAddress(GetModuleHandle('kernel32'), 'GetProcAddress');
Parametros.ProcName:=ProcName;
{Abre um novo espaço de memória para guardar os parâmetros}
RemoteData:=WriteData(hProcess, sizeof(Parametros), @Parametros);
{Abre um novo espaço de memória para guardar a procedure}
RemoteFunc:=WriteData(hProcess, integer(@RemoteFunctionEnd) - integer(@RemoteFunction), @RemoteFunction);
{Cria a thread que executará a procedure}
ThreadHandle:=CreateRemoteThread(hProcess, nil, 0, RemoteFunc, RemoteData, 0, ThreadId);
WaitForSingleObject(ThreadHandle, 3000);
{Libera as memórias criadas}
VirtualFreeEx(hProcess,LibFileName,0,MEM_RELEASE);
VirtualFreeEx(hProcess,ProcName,0,MEM_RELEASE);
VirtualFreeEx(hProcess,RemoteFunc,0,MEM_RELEASE);
VirtualFreeEx(hProcess,RemoteData,0,MEM_RELEASE);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Inject('explorer.exe','C:\Codeinject\progmaster.DLL','Msg');
end;
|
O que preciso alterar para que esse código funcione no delphi 2010? |
|
| Voltar ao Topo |
|
 |
GustavoToyota Profissional


Registrado: Domingo, 9 de Outubro de 2011 Mensagens: 605 Localização: Sorocaba - SP
|
Enviada: Ter Jun 26, 2012 10:23 pm Assunto: |
|
|
| Onde que dá o erro no seu injetor? |
|
| Voltar ao Topo |
|
 |
SrJeff Aprendiz

Registrado: Sexta-Feira, 8 de Janeiro de 2010 Mensagens: 289
|
Enviada: Qua Jun 27, 2012 12:07 am Assunto: |
|
|
| GustavoToyota escreveu: | | Onde que dá o erro no seu injetor? |
O problema é exatamente este, não apresenta erro algum, mas também não funciona. |
|
| Voltar ao Topo |
|
 |
GustavoToyota Profissional


Registrado: Domingo, 9 de Outubro de 2011 Mensagens: 605 Localização: Sorocaba - SP
|
Enviada: Qua Jun 27, 2012 12:44 pm Assunto: |
|
|
| Código: | | WriteProcessMemory(Process, Result , pchar(s), length(s) + 1, bytes); |
Acho que nesse caso você deve usar PAnsiChar porque no Delphi 2010 PChar é igual a PWidechar, que tem 2 bytes em cada caractere. Mas deve ter mais coisa errada além disso. |
|
| Voltar ao Topo |
|
 |
SrJeff Aprendiz

Registrado: Sexta-Feira, 8 de Janeiro de 2010 Mensagens: 289
|
Enviada: Qua Jun 27, 2012 1:05 pm Assunto: |
|
|
| Eu não consegui encontrar os erros, é muito complicado para mim, tem alguém ai que pode resolver??? |
|
| Voltar ao Topo |
|
 |
|
|
Enviar Mensagens Novas: Proibido. Responder Tópicos Proibido Editar Mensagens: Proibido. Excluir Mensagens: Proibido. Votar em Enquetes: Proibido.
|
|