Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Buscar Temas de Hoy Marcar Foros Como Leídos

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 31-07-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Programa con su código fuente

Estaba revisando el disco duro y me he encontrado esta pequeña herramienta que programé hace algunos meses. Así que siguiendo mi política de dejar las aplicaciones cautivas en libertad, me he decidido a publicarla aquí. ¿Por que aquí y no en mi pagina web? Porque no tengo pagina web, soy muy vago para montar una, así que aprovecho la oportunidad que me brinda esta pagina para dejarla aquí colgada.

Lo primero decir que la aplicación no esta echa en Delphi, esta echa en C y compilada con MINGW que permite crear aplicaciones para windows usando herramientas GNU. Aunque debería de poder compilarse en cualquier compilador de C.

La aplicación es una herramienta que permite leer/grabar los sectores de un disco (disquetes, discos duros, memorias flash), permite leer/escribir archivos y también permite leer la información de backup de los archivos. Ahora explico todo mas detalladamente.

Al poder leer y restaurar los sectores de un disco podemos hacer cosas como esta. Supongamos que tenemos una memoria flash con la letra de unidad I, podemos crear una imagen con el siguiente comando:
Código:
  Dump /D \\.\I: > c:\imagen.bin
El comando anterior copiaría todos los sectores de la memoria usb a un archivo. Si luego queremos restaurar la imagen en la memoria usb solo tenemos que utilizar el siguiente comando:
Código:
  Dump /D /load \\.\I: < c:\imagen.bin
La imagen creada puede tener otros usos, como, por ejemplo, montarla como disco virtual usando FileDisk, crear copias de seguridad del sector de arranque, crear imágenes de Cds, etc.

Otro uso de la herramienta es el poder leer y escribir información adicional en los archivos, a la que normalmente no se tiene acceso. Me explico, puede leer la información adjunta a un archivo en forma de Alternate Data Streams ( si quieres saber lo que es un ADS lee esto http://www.diamondcs.com.au/index.ph...d=ntfs-streams ).

Por ejemplo si queremos agregar el archivo 2.txt como un ADS de 1.txt utilizaremos un comando como este:
Código:
  Dump /F /load 1.txt:2.txt < 2.txt
Para ver su contenido
Código:
  Dump /F 1.txt:2.txt
Para ver toda la informacion de backup del archivo 1.txt incluido todos los ADS y alguna informacion extra añadida por windows:
Código:
  Dump /B 1.txt
Bueno, aquí dejo la aplicación ya compilada y su código fuente. Si a alguien le interesa el tema podemos hablar mas profundamente, cualquiera puede usarla/copiarla/modificarla/distribuirla sin ningún tipo de restricción, siempre que se mencione mi nombre en los créditos.

PD: Espero que este sea el foro adecuado.
Archivos Adjuntos
Tipo de Archivo: zip Dump_src.zip (2,3 KB, 82 visitas)
Tipo de Archivo: zip Dump.zip (4,0 KB, 82 visitas)
Responder Con Cita
  #2  
Antiguo 01-08-2006
[fer21unmsm] fer21unmsm is offline
Miembro Premium
 
Registrado: dic 2005
Ubicación: Lima
Posts: 627
Poder: 19
fer21unmsm Va por buen camino
Hola Seoane, está muy interesante lo que hace tu programa, sabes algo sobre el MBR (Master Boot Record), lo que quiero hacer es una aplicación que repare los MBR, si tuvieras alguna información, te lo agradecería.

Saludos y gracias anticipadas.
__________________
"La información tiene más valor cuando se comparte"
Responder Con Cita
  #3  
Antiguo 01-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Antes de nada, tengo mis dudas sobre si trastear con el MBR desde windows sea buena idea. Pero que demonios, mientras no arda ...

En principio el MBR es el primer sector del disco, es decir los primeros 512 bytes. Simplemente con el programa Dump que pongo mas arriba podriamos copiarlo, escribirlo ya es una operacion mas complicada y peligrosa.

A modo de prueba, teclea lo siguiente:
Código:
  dump /d \\.\Physicaldrive0 > c:\imagen.bin
Esto crea una imagen del primer disco duro, Physicaldrive1 para el segundo, etc. Fíjate que estoy hablando de discos duros y no de particiones.

Código:
  \\.\Physicaldrive0  --> Primer disco duro
  \\.\C: --> Primera particion
Cuando ejecutamos el comando anterior, como mi programa esta preparado para crear imágenes enteras, se pondrá a copiar cientos de sectores por segundo como un loco así que pulsa Ctrl+C para pararlo. Ahora el archivo C:\imagen.bin contienen los primeros sectores del disco duro. Los que nos interesan son los primeros 512 bytes que corresponden al MBR. Como te dije esta es una forma un poco cutre de hacerlo, solo es una demostracion.

Ahora es cuando explico como funciona. Si conoces C y le has echado un vistazo al código ya tendrás una idea de como trabaja el programa. Es muy simple la API CreateFile permite abrir un disco como si se tratara de un archivo, y utilizar las API WriteFile y ReadFile para escribir y leer. La única limitación es que siempre se debe leer y escribir un numero de bytes múltiplo del tamaño del sector, es decir, si cada sector mide 512 bytes, puedes leer 512, 1024, 2048, etc pero no 1000 bytes.

Después de todo este rollo, podemos sacar en claro que utilizando CreateFile y ReadFile puedes leer los primeros 512 Bytes, el MBR, y usando WriteFile podemos escribirlo. El problema es que tienes el MBR roto como vas a iniciar windows y así ejecutar el programa de recuperación aunque una aplicación útil/divertida es copiar el MBR del disco duro y grabarlo en el primer sector de un disquete. Si el sector de arranque se estropea solo tienes que insertar el disquete y arrancar el equipo, el MBR hace su trabajo y arranca el sistema.

Por hoy ya solté mucho rollo, si el tema te interesa podemos seguir hablando.
Responder Con Cita
  #4  
Antiguo 01-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Aquí te dejo todo lo necesario para copiar el MBR al primer sector de un disquete, de esta manera podremos arrancar el sistema en caso de emergencia. En este caso el código esta en delphi:

Código Delphi [-]
function LeerMBR(Drive: Integer; Sector: Pointer): Boolean;
var
  hDisk: THandle;
  BytesRead: DWORD;
begin
  Result:= FALSE;
  hDisk:= CreateFile(PChar('\\.\Physicaldrive' + IntToStr(Drive)),GENERIC_READ,
    FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  if hDisk <> INVALID_HANDLE_VALUE then
  begin
    if ReadFile(hDisk,Sector^,512,BytesRead,nil) then
      Result:= BytesRead = 512
    else ShowMessage(SysErrorMessage(GetLastError));
    CloseHandle(hDisk);
  end else ShowMessage(SysErrorMessage(GetLastError));
end;

function EscribirMBR(Letra: Char; Sector: Pointer): Boolean;
var
  hDisk: THandle;
  BytesWritten: DWORD;
begin
  Result:= FALSE;
  hDisk:= CreateFile(PChar('\\.\' + Letra + ':'),GENERIC_WRITE,FILE_SHARE_READ,
    nil,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
  if hDisk <> INVALID_HANDLE_VALUE then
  begin
    if WriteFile(hDisk,Sector^,512,BytesWritten,nil) then
      Result:= BytesWritten = 512
    else ShowMessage(SysErrorMessage(GetLastError));
    CloseHandle(hDisk);
  end else ShowMessage(SysErrorMessage(GetLastError));
end;


var
  Buffer: array[1..512] of Byte;
begin
  // Leemos el primer sector del primer disco duro
  if LeerMBR(0,@Buffer) then
    // Lo copiamos al primer sector del disquete A
    if EscribirMBR('A',@Buffer) then
      ShowMessage('El sector se ha copiado al disquete');
end;

Con esto creo que ya se puede hacer una utilidad de rescate bastante resultona. ¿Que te parece?
Responder Con Cita
  #5  
Antiguo 01-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Seoane, hombre, todo lo que has comentado es muy interesante y puede resultar muy útil. ¿Porqué no publicas en el apartado de Trucos el par de funciones anterior? Más aún, ¿porqué no publicas en el apartado de Trucos tu anterior mensaje (por lo menos) al completo? NO es que te critique el que no lo publiques, es una forma de decirte, ¡publícalo, que está muy bien!
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #6  
Antiguo 01-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Dec, lo que pasa es que entiendo que en la sección de trucos se debe publicar código probado y seguro, en este caso probado si esta, el jueguecito de copiar el MBR a un disquete y arrancar desde ahí ya lo he echo varias veces. Pero seguro, ya no es tan seguro, si no se sabe lo que se esta haciendo trastear con el MBR puede dejarnos sin el arranque del sistema.

fer21unmsm por otros mensajes que ha publicado parece que le gusta experimentar, por eso le paso el código, no sin antes advertirle del riesgo que conlleva. De todas formas, deja que lo ponga todo un poco mas bonito, y ya lo publico.

EDITO: Ya está publicado: truco 356

Última edición por seoane fecha: 01-08-2006 a las 15:54:25.
Responder Con Cita
  #7  
Antiguo 01-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno. Yo creo que avisando en los trucos tal y como has hecho aquí... por eso decía de que publicaras todo tu mensaje anterior, porque me parecía curioso, pero, para que también quedara claro que se trata de algo que puede hacerse, pero, que hay que saber lo que se hace, que el que avisa no es traidor, vamos.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #8  
Antiguo 01-08-2006
[fer21unmsm] fer21unmsm is offline
Miembro Premium
 
Registrado: dic 2005
Ubicación: Lima
Posts: 627
Poder: 19
fer21unmsm Va por buen camino
Cita:
Empezado por seoane
Dec, lo que pasa es que entiendo que en la sección de trucos se debe publicar código probado y seguro, en este caso probado si esta, el jueguecito de copiar el MBR a un disquete y arrancar desde ahí ya lo he echo varias veces. Pero seguro, ya no es tan seguro, si no se sabe lo que se esta haciendo trastear con el MBR puede dejarnos sin el arranque del sistema.

fer21unmsm por otros mensajes que ha publicado parece que le gusta experimentar, por eso le paso el código, no sin antes advertirle del riesgo que conlleva. De todas formas, deja que lo ponga todo un poco mas bonito, y ya lo publico.

EDITO: Ya está publicado: truco 356
Jeje, si tienes razón me gusta investigar y experimentar, claro!! me gustaría hablar sobre este tema que es muy interesante en la universidad llevé un curso llamado sistemas operativos, donde nos explicaron un poco sobre el DIsco Duro (MBR, FAT, etc). Bueno tambien hay que tener en cuenta que el sector varía dependiendo del formateo que se le haga, segun he leído por ahí dicen que el mbr ocupa el primer sector del HHDD, como lo comentastes en tu post anterior, pero si el formato varia, entonces el tamaño del sector varía, por tanto supongo que el MBR varía dependiendo del tamaño del sector o no es así?.

Bueno, espero que podamos seguir comentando sobre este tema, yo trataré de aportar algo con mis pobres conocimientos, aunque estoy repasando, algunas cositas.

PD: Si llego a desarrollar el aplicativo, que repare el MBR, lo voy a postear.

Saludos y a seguir investigando y comentando este post tan bonito, y tambien se agradece por los aportes y el interes brindados por ustedes.

Bytes.
__________________
"La información tiene más valor cuando se comparte"
Responder Con Cita
  #9  
Antiguo 01-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Nunca había oído hablar de un MBR que no midiera 512 bytes, pero hay muchas cosas que desconozco. Aunque lo que si se es que el tamaño del sector depende de la geometría del disco y no del formateo que se haga del mismo, aunque también puedo estar equivocado

De todas formas si ese es todo el problema lo solucionamos fácilmente averiguando el tamaño del sector y actuando en consecuencia:

Código Delphi [-]
type
  DISK_GEOMETRY = record
    Cylinders: LARGE_INTEGER;
    MediaType: Integer;
    TracksPerCylinder: DWORD;
    SectorsPerTrack: DWORD;
    BytesPerSector: DWORD;
  end;

const
  IOCTL_DISK_GET_DRIVE_GEOMETRY = 458752;

function GetBytesPerSector(Drive: Integer): DWORD;
var
  hDisk: THandle;
  Geometry: DISK_GEOMETRY;
  Returned: DWORD;
begin
  Result:= 0;
  hDisk:= CreateFile(PChar('\\.\Physicaldrive' + IntToStr(Drive)),GENERIC_READ,
    FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0);
  if hDisk <> INVALID_HANDLE_VALUE then
  begin
    FillChar(Geometry,Sizeof(Geometry),0);
    if DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_GEOMETRY,nil,0,@Geometry,
      sizeof(Geometry),Returned,nil) then
     Result:= Geometry.BytesPerSector
    else ShowMessage(SysErrorMessage(GetLastError));
    CloseHandle(hDisk);
  end else ShowMessage(SysErrorMessage(GetLastError));
end;
Responder Con Cita
  #10  
Antiguo 01-08-2006
[fer21unmsm] fer21unmsm is offline
Miembro Premium
 
Registrado: dic 2005
Ubicación: Lima
Posts: 627
Poder: 19
fer21unmsm Va por buen camino
Cita:
Empezado por seoane
Nunca había oído hablar de un MBR que no midiera 512 bytes, pero hay muchas cosas que desconozco. Aunque lo que si se es que el tamaño del sector depende de la geometría del disco y no del formateo que se haga del mismo, aunque también puedo estar equivocado

De todas formas si ese es todo el problema lo solucionamos fácilmente averiguando el tamaño del sector y actuando en consecuencia:

Código Delphi [-]type DISK_GEOMETRY = record Cylinders: LARGE_INTEGER; MediaType: Integer; TracksPerCylinder: DWORD; SectorsPerTrack: DWORD; BytesPerSector: DWORD; end; const IOCTL_DISK_GET_DRIVE_GEOMETRY = 458752; function GetBytesPerSector(Drive: Integer): DWORD; var hDisk: THandle; Geometry: DISK_GEOMETRY; Returned: DWORD; begin Result:= 0; hDisk:= CreateFile(PChar('\\.\Physicaldrive' + IntToStr(Drive)),GENERIC_READ, FILE_SHARE_READ,nil,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,0); if hDisk <> INVALID_HANDLE_VALUE then begin FillChar(Geometry,Sizeof(Geometry),0); if DeviceIoControl(hDisk,IOCTL_DISK_GET_DRIVE_GEOMETRY,nil,0,@Geometry, sizeof(Geometry),Returned,nil) then Result:= Geometry.BytesPerSector else ShowMessage(SysErrorMessage(GetLastError)); CloseHandle(hDisk); end else ShowMessage(SysErrorMessage(GetLastError)); end;
Lo voy a probar, gracias man.
__________________
"La información tiene más valor cuando se comparte"
Responder Con Cita
  #11  
Antiguo 09-08-2006
pcicom pcicom is offline
Miembro
 
Registrado: may 2003
Ubicación: MONTERREY MEXICO
Posts: 253
Poder: 21
pcicom Va por buen camino
Super INteresante....

Esta super tu codigo y lo que el hace....... sabes hace tiempo navegando por internet encrontre un programa que te servia para recuperar archivos borrados en el sistema... el codigo estaba en DELPHI, en ese entonces lo grabe en mi disco, pero con el paso del tiempo cambie de disco porque me fallo y este programa ya no lo he podido encontrar...

en fin...


bueno leyendo algo de lo que haces, me gustaria saber si conoces un metodo o la forma en como saber en que sector del disco esta grabado un archivo que yo eliga... posiscion, pista, sector y esas cosas...


desde ya gracias......
__________________
Poco ha de saber el que no pregunta.. Yo por eso soy un pregunton
Responder Con Cita
  #12  
Antiguo 13-08-2006
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Cita:
Empezado por pcicom
bueno leyendo algo de lo que haces, me gustaria saber si conoces un metodo o la forma en como saber en que sector del disco esta grabado un archivo que yo eliga... posiscion, pista, sector y esas cosas...
Bueno, no exactamente el sector pero si se una forma de averiguar en que clusters esta localizado el archivo. Aunque no entiendo muy bien para que necesitas esa información, si es para conocer lo fragmentado que esta un fichero esto es lo que buscas, si lo que quieres es hacer algún tipo de protección anticopia esto también te puede servir.

Código Delphi [-]
program Cluster;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils;

const
  FSCTL_GET_RETRIEVAL_POINTERS = $90073;

type
  Extent = record
    Vcn: int64;
    Lcn: int64;
  end;

  RETRIEVAL_POINTERS_BUFFER = record
    ExtentCount: Cardinal;
    StartingVcn: int64;
    Extents: array[0..0] of Extent;
  end;
  PRETRIEVAL_POINTERS_BUFFER = ^RETRIEVAL_POINTERS_BUFFER ;

procedure OutString(Str: string);
begin
  Writeln(Str);
end;    

procedure DumpFile(Filename: string);
var
  hFile: THandle;
  Buffer: array[1..512+2] of int64;
  StartVcn: Int64;
  ClusterList: PRETRIEVAL_POINTERS_BUFFER;
  Returned: Cardinal;
  Success: BOOL;
  LastError: Cardinal;
  i: integer;
begin
  hFile:= CreateFile(PChar(Filename),GENERIC_READ, FILE_SHARE_READ or
    FILE_SHARE_WRITE ,nil, OPEN_EXISTING,FILE_FLAG_NO_BUFFERING,0);
  if hFile <> INVALID_HANDLE_VALUE then
  begin
    StartVcn:= 0;
    ClusterList:= @Buffer;
    repeat
      Success:= DeviceIOControl(hFile, FSCTL_GET_RETRIEVAL_POINTERS, @StartVcn,
        Sizeof(StartVcn),@Buffer, Sizeof(Buffer), Returned, nil);
      if Success then
        LastError:= 0
      else
        LastError:= GetLastError;
      if Success or (LastError = ERROR_MORE_DATA) then
      begin
        StartVcn:= ClusterList^.StartingVcn;
        for i:= 0 to ClusterList^.ExtentCount - 1 do
        begin
          OutString(Format('VCN: %d LCN: %d LEN: %d',[StartVcn, ClusterList^.Extents[i].Lcn,
            ClusterList^.Extents[i].Vcn - StartVcn]));
          StartVcn := ClusterList^.Extents[i].Vcn;
        end;
      end else OutString(SysErrorMessage(LastError));
    until LastError <> ERROR_MORE_DATA;
    CloseHandle(hFile);
  end else OutString(SysErrorMessage(GetLastError));
end;  

begin
  DumpFile(ParamStr(0));
  readln;
end.

El programa anterior muestra una lista con los cluster que pertenecen al archivo. VCN -> Virtual cluster, LCN -> Logic Cluster (el numero de cluster real, posiblemente el que te interesa), LEN -> Es el numero de clusters contiguos en ese trozo. Lo normal, sobre todo si el archivo es pequeño, es que todos los cluster del archivo sean contiguos, así que la lista solo tendrá una entrada. Busca un archivo muy fragmentado para probar la función y veras como te devuelve la posición de cada trozo.

Aquí te dejo el programa compilado y con el código fuente, listo para usar:
Archivos Adjuntos
Tipo de Archivo: zip Cluster.zip (25,8 KB, 44 visitas)
Responder Con Cita
  #13  
Antiguo 13-08-2006
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Poder: 28
Lepe Va por buen camino

¿habrá algo que este chico no pueda solucionar?
Él dice que sí... pero yo no me lo creo.


Vaya derroche de... de... yo que sé... no me salen las palabras....

Emilio: Muy buen punto ese de limitar a 10 el número de emoticones en cada mensaje jajaja, pero la verdad, a mí hoy se me han hecho pequeños .
Saludos
__________________
Si usted entendió mi comentario, contácteme y gustosamente,
se lo volveré a explicar hasta que no lo entienda, Gracias.
Responder Con Cita
  #14  
Antiguo 13-08-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.107
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Cita:
Empezado por Lepe
¿habrá algo que este chico no pueda solucionar?

Él dice que sí... pero yo no me lo creo.
Bueno. Gracias Lepe. Suelo decir que sí, ya sabes, por modestia y eso...
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
Respuesta


Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Codigo fuente programa P2P Niko Varios 2 11-07-2007 10:27:40
Código fuente chinchan C++ Builder 3 01-08-2006 05:59:25
codigo fuente o programa en delphi Ravent OOP 5 27-05-2006 17:04:33
TPV.- Codigo Fuente Rabata Varios 4 15-10-2005 14:48:51
Codigo fuente programa de instalación wallesis OOP 2 08-10-2004 11:11:07


La franja horaria es GMT +2. Ahora son las 07:06:57.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi