Busca la funcion que necesitas!

miércoles, 22 de junio de 2011

DELPHI - Funcion split o explode

Bueno en esta ocasión les he programado una función que simula al split de vb6 o explode de php para delphi 7 ya que pues bueno no existe en este lenguaje y aveces es algo necesaria... La función devuelve un array de strings por lo que hay que declarar en type un array de strings así:



Código:
type
TStringArray=array of string

Y despues colocar nuestra función en cualquier parte de tú programa:

Código:
{ *******************************
     FUNCION SPLIT BY Linkgl
     }
function split(cadena:string;delimitador:string):TStringArray;
var i:Integer;
begin
for i:=1 to length(cadena) do
begin
  if AnsiPos(delimitador,cadena) = 0 then
  begin
    Result[i]:=Copy(cadena,1,Length(cadena));
    exit;
  end
  else
  begin
    Result[i]:=Copy(cadena,1,AnsiPos(delimitador,cadena)-1);
    cadena:=Copy(cadena,length(Result[i])+length(delimitador)+1,length(cadena)-length(delimitador));
  end;
  end;
end;

Para que tengas una idea mas clara, sí estas haciendo un proyecto con un form en delphi 7  nuestro proyecto quedaría masomenos así:


Código:
{.... etcetc
  private
    { Private declarations }
  public
    { Public declarations }
  end;
type
TStringArray=array[1..10] of string;
var
  Form1: TForm1;
implementation

{$R *.dfm}

{ *******************************
     FUNCION SPLIT BY Linkgl
     }
function split(cadena:string;delimitador:string):TStringArray;
var i:Integer;
begin
for i:=1 to length(cadena) do
begin
  if AnsiPos(delimitador,cadena) = 0 then
  begin
    Result[i]:=Copy(cadena,1,Length(cadena));
    exit;
  end
  else
  begin
    Result[i]:=Copy(cadena,1,AnsiPos(delimitador,cadena)-1);
    cadena:=Copy(cadena,length(Result[i])+length(delimitador)+1,length(cadena)-length(delimitador));
  end;
  end;
end;



domingo, 5 de junio de 2011

DELPHI - Quitar los espacios de la derecha o izquierda en una cadena o string

He creado dos funciones, en donde la idea de programarlas surgió de una publicación de un personaje conocido como AX, y bueno están en delphi 7 las funciones, RLTrim quita los espacios que tenga una cadena al final de la derecha y LLTrim hace lo mismo pero quita los espacios de la izquierda en una string, les dejo las funciones.

Código:
Function RLTrim(szEntrada:String):String;
{->Coder - Linkgl <-}
{->Funcion-linkgl.blogspot.com}
{->indetectables.net<-}
var
i:Integer;
begin
for i:=length(szEntrada) downto 1 do
begin
  if not(copy(szEntrada,i,1)=' ') then
  begin
    Result:=copy(szEntrada,1,i);
    exit
  end
end
end;
Function LLTrim(szEntrada:String):String;
{->Coder - Linkgl <-}
{->Funcion-linkgl.blogspot.com}
{->indetectables.net<-}
var
i:Integer;
begin
for i:=1 to length(szEntrada) do
begin
  if not(copy(szEntrada,i,1)=' ') then
  begin
    Result:=copy(szEntrada,i,length(szEntrada));
    exit
  end
end
end;
{->EJEMPLO DE USO<-}
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text:=RLTrim('hola soy linkgl         ');
Edit2.Text:=LLTrim('      hola soy linkgl');
end;
end.

sábado, 4 de junio de 2011

C - Obtener y escribir el valor de los registros ASM de un programa

Hice estas funciones usando la estructura CONTEXT que nos fácilita el manejo de los registros, con estas funciones podrás obtener en runtime el valor que toma cualquier registro que context permita (Eax,edx,ecx...) yo puse por defecto eax, pero si quieres obtener otro registro cambia eax por el registro que gustes, así como lo hice obtiene el entrypoint ya que este al cargar el programa se encuentra en eax, entonces también puedes cambiar el entrypoint de un programa con la funcioncita de escribirRegistro, si quieres obtener en determinaado momento exacto el valor de algún registro entonces quizá necesites usar OPENPROCESS y pasarle el pid del proceso, en vez de CreateProcess, pero la sintaxis de las funciones es la misma



Código:
#include <stdio.h>
#include <windows.h>

/* 
USOS:
Para obtener el valor de otro registro 
cambiar donde dice con.Eax por
con.Registro_que_quieras
Indetectables.net/foro
funcion-linkgl.blogspot.com
*/

DWORD ObtenerRegistro(LPSTR szProcessName)
{
       /* Linkgl - Funcion-linkgl.blogspot.com */
    //Estructura startup requerida para createprocess
    //estructura process information requerida para el pid
    //estructura context contiene los valores de los registros
    STARTUPINFO si;
   PROCESS_INFORMATION pi;
   CONTEXT con;
   // limpiamos la estructura si
   memset(&si, 0, sizeof(si));
   //indicamos el tamaño de la estructura
   //en el flag como indica la msdn
   si.cb = sizeof(STARTUPINFO);
   con.ContextFlags = CONTEXT_FULL;
   CreateProcess(NULL, szProcessName, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
   //obtenemos el contexto y con ello se obtienen los registros
    GetThreadContext(pi.hThread, &con);
    //continuamos el hilo
    ResumeThread(pi.hThread);
    //mandamos el registro
    return con.Eax;
}

BOOL EscribirRegistro(LPSTR szProcessName,DWORD valor)
{
    /* Linkgl - Funcion-linkgl.blogspot.com */
    //Estructura startup requerida para createprocess
    //estructura process information requerida para el pid
    //estructura context contiene los valores de los registros
    STARTUPINFO si;
   PROCESS_INFORMATION pi;
   CONTEXT con;
   // limpiamos la estructura si
   memset(&si, 0, sizeof(si));
   //indicamos el tamaño de la estructura
   //en el flag como indica la msdn
   si.cb = sizeof(STARTUPINFO);
   con.ContextFlags = CONTEXT_FULL;
   //creamos el proceso
   CreateProcess(NULL, szProcessName, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);
   //obtenemos el contexto y con ello se obtienen los registros
    GetThreadContext(pi.hThread, &con);
    //ponemos el nuevo valor
   con.Eax = valor;
   //lo guardamos en el hilo
   SetThreadContext(pi.hThread,&con);
   //continuamos el hilo
    ResumeThread(pi.hThread);
    return TRUE;
}

//->EJEMPLO DE USO
int main()
{
DWORD eax;
//Cambiamos el valor eax (osea vamos a cambiar el entrypoint)
EscribirRegistro("c:\\final.exe",0x413b72f);
//Obtenemos el registro aver si se cambio
eax=ObtenerRegistro("c:\\final.exe");
//Imprimimos el nuevo registro o entrypoint
printf("%x",eax);
getchar();
return 0;
}