ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Code Injection (Migrar do delphi 7 para delphi 2010)

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
SrJeff
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 8 de Janeiro de 2010
Mensagens: 289

MensagemEnviada: Ter Jun 26, 2012 8:05 pm    Assunto: Code Injection (Migrar do delphi 7 para delphi 2010) Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
GustavoToyota
Profissional
Profissional


Registrado: Domingo, 9 de Outubro de 2011
Mensagens: 605
Localização: Sorocaba - SP

MensagemEnviada: Ter Jun 26, 2012 10:23 pm    Assunto: Responder com Citação

Onde que dá o erro no seu injetor?
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
SrJeff
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 8 de Janeiro de 2010
Mensagens: 289

MensagemEnviada: Qua Jun 27, 2012 12:07 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular
GustavoToyota
Profissional
Profissional


Registrado: Domingo, 9 de Outubro de 2011
Mensagens: 605
Localização: Sorocaba - SP

MensagemEnviada: Qua Jun 27, 2012 12:44 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail MSN Messenger
SrJeff
Aprendiz
Aprendiz


Registrado: Sexta-Feira, 8 de Janeiro de 2010
Mensagens: 289

MensagemEnviada: Qua Jun 27, 2012 1:05 pm    Assunto: Responder com Citação

Eu não consegui encontrar os erros, é muito complicado para mim, tem alguém ai que pode resolver???
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB