elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Curso de javascript por TickTack


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  no funciona ReadFile y overlapped
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: no funciona ReadFile y overlapped  (Leído 3,059 veces)
Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
no funciona ReadFile y overlapped
« en: 4 Febrero 2014, 00:48 am »

hola

tengo un problema con Readfile

Código
  1. d1 = (DWORD*)&crbig;
  2. overlapped.Offset = d1[1];
  3. overlapped.OffsetHigh = d1[0];
  4.  
  5. ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
  6.  

tengo a crbig que es igual a 322122547

los coloco en overlapped low y high

offsethigh = 00000003
offset = 22122547;

supuestamente ReadFile deberia leer los datos de la unidad hDevice, en este caso 1024 bytes y deberia empezar a leer desde donde le digo a overlapped que lo haga

al inicio lo hago de esta manera ya que quiero leer el inicio de la unidad

Código
  1. ZeroMemory(&overlapped ,sizeof(OVERLAPPED));
  2.  
  3. hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
  4.  
  5. if(hDevice != INVALID_HANDLE_VALUE){
  6.  
  7. ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
  8.  
  9. }
  10.  
si coloco un for de esta manera para saber que aparecio, me salen los bytes sin probemas en un printf

Código
  1. for (int n=0; n<sizeof(buff); n++)  
  2.    {  
  3.        printf("0x%02X ", buff[n]);  
  4.    }

pero despues es cuando modifico overlapped y uso por segunda vez ReadFile

Código
  1. d1 = (DWORD*)&crbig;
  2. overlapped.Offset = d1[1];
  3. overlapped.OffsetHigh = d1[0];
  4.  
  5. ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
  6.  

pero me siguen apareciendo los mismo bytes en el for(), ya intente antes de usar por segunda vez ReadFile, borrar el buffer usando memset e incluso usando un buffer diferente, pero me sigue mostrando lo mismo

y supuestamente como les mencione, deberia avanzar hacia donde overlapped dice, deberia leer los 1024 bytes de esa zona, y lo que deberia pasar es que el for me deberia mostrar otros bytes, pero no parece funcionar

alguien sabe o tiene alguna idea de porque no funciona?

salu2


En línea

.                                 
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: no funciona ReadFile y overlapped
« Respuesta #1 en: 4 Febrero 2014, 02:10 am »

¿Porqué razon necesitas hacer lecturas asincrónicas?
¿Es tu aplicación de multihilos?

Sino, pues se usa la funcion SetFilePointer para leer algun archivo o dispositivo apartir de un offset.


En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: no funciona ReadFile y overlapped
« Respuesta #2 en: 4 Febrero 2014, 02:50 am »

pues como le mencione en varios post, estoy siguiendo ejemplos de VB.net sobre MFT, ahorita trato de convertir un codigo de VB a C para ir aprendiendo que hace el programa, ya entendi la mitad junto con varios post teoricos sobre MFT, en este momento con overlapped estoy por llegar a MFT para empezar a tomar los atributos, donde se encuentran los nombres de archivos que estan en la computadora o fueron eliminados pero no puedo avanzar con readfile y overlapped

en VB usan overlapped para moverse por bytes, por ejemplo

Código
  1. Private Sub SetReadFileOffset(ByRef NO As System.Threading.NativeOverlapped, ByRef curBig As Int64)
  2.  
  3.        Dim lowoffset() As Byte = BitConverter.GetBytes(curBig)
  4.        Dim highoffset As Int32 = BitConverter.ToInt32(lowoffset, 0)
  5.        Dim high As Int32
  6.        Dim lastbytes(3) As Byte
  7.        Array.Copy(lowoffset, 4, lastbytes, 0, 4)
  8.        high = BitConverter.ToInt32(lastbytes, 0)
  9.        NO.OffsetLow = highoffset
  10.        NO.OffsetHigh = high
  11.    End Sub

Esto es hacer lo mismo que esto

Código
  1. crbig = (sectperclusters * (bytespercluster * MFTCluster));
  2.  
  3. d1 = (DWORD*)&crbig;
  4. overlapped.Offset = d1[1];
  5. overlapped.OffsetHigh = d1[0];

pero usandolo en Readfile parece que no funciona
En línea

.                                 
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: no funciona ReadFile y overlapped
« Respuesta #3 en: 4 Febrero 2014, 03:20 am »

pues como le mencione en varios post, estoy siguiendo ejemplos de VB.net sobre MFT, ahorita trato de convertir un codigo de VB a C para ir aprendiendo que hace el programa, ya entendi la mitad junto con varios post teoricos sobre MFT, en este momento con overlapped estoy por llegar a MFT para empezar a tomar los atributos, donde se encuentran los nombres de archivos que estan en la computadora o fueron eliminados pero no puedo avanzar con readfile y overlapped

en VB usan overlapped para moverse por bytes, por ejemplo

Código
  1. Private Sub SetReadFileOffset(ByRef NO As System.Threading.NativeOverlapped, ByRef curBig As Int64)
  2.  
  3.        Dim lowoffset() As Byte = BitConverter.GetBytes(curBig)
  4.        Dim highoffset As Int32 = BitConverter.ToInt32(lowoffset, 0)
  5.        Dim high As Int32
  6.        Dim lastbytes(3) As Byte
  7.        Array.Copy(lowoffset, 4, lastbytes, 0, 4)
  8.        high = BitConverter.ToInt32(lastbytes, 0)
  9.        NO.OffsetLow = highoffset
  10.        NO.OffsetHigh = high
  11.    End Sub

Esto es hacer lo mismo que esto

Código
  1. crbig = (sectperclusters * (bytespercluster * MFTCluster));
  2.  
  3. d1 = (DWORD*)&crbig;
  4. overlapped.Offset = d1[1];
  5. overlapped.OffsetHigh = d1[0];

pero usandolo en Readfile parece que no funciona

Lo mismo he visto que pasa en los anteriores temas, no podes esperar que ambos languajes traten de igual manera los diferentes tipos
de variables menos una framework como .NET puede tener sus propias maneras de como manipular array de bytes, cadenas ,etc.
Omite la lectura asincrónica y usa SetFilePointer para establecer el inicio en donde ReadFile queres que haga la lectura.
Acerca de porqué no aparecen los bytes, en el código C puede seer debido a que estas haciendo lectura asincrónica y los bytes no
son aun escritos en el buffer cuando estas intentado usarlos. no podria estar seguro ya que el código es incompleto.
Luego si tenes problemas con esto pues publica toda la función.
En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: no funciona ReadFile y overlapped
« Respuesta #4 en: 4 Febrero 2014, 03:51 am »

Este es el codigo que llevo hecho, por el momento todo me ha funcionado bien, hasta ahorita con overlapped

Código
  1.  
  2. #include <Windows.h>
  3. #include <winioctl.h>
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6.  
  7. #define zwpath L"\\\\.\\C:"
  8.  
  9.  
  10. long endianhextodec(BYTE *buffers, int offs){
  11.  
  12. BYTE tmp[2] = {0};
  13. BYTE tmp2[1] = {0};
  14. BYTE tmp3[3] = {0};
  15. BYTE tmp4[1] = {0};
  16.  
  17. if(offs == 11){
  18. tmp[0] = buffers[11];
  19. tmp[1] = buffers[12];
  20.  
  21. return tmp[1] << 8;
  22.  
  23. }
  24.  
  25. if(offs == 13){
  26.  
  27. tmp2[0] = buffers[13];
  28.  
  29. return tmp2[0];
  30.  
  31. }
  32.  
  33. if(offs == 30){
  34.  
  35. tmp3[0] = buffers[48];
  36. tmp3[1] = buffers[49];
  37. tmp3[2] = buffers[50];
  38.  
  39. return tmp3[2] << 16;
  40. }else{return 0;}
  41. }
  42.  
  43.  
  44. int main(int argc, char *argv[]){
  45.  
  46. HANDLE hDevice;
  47. OVERLAPPED overlapped;
  48. DWORD crbig;
  49. BYTE buff[1024] = {0};
  50. DWORD numerobyte = 0, nbytes = 0;
  51. UINT32 ret;
  52. DWORD *d1;
  53. int offset1 = 11, offset2 = 13, offset3 = 30;
  54. long MFTCluster = 0, bytespercluster = 0, sectperclusters = 0, offet = 0;
  55. unsigned long mult = 0;
  56.  
  57. ZeroMemory(&overlapped ,sizeof(OVERLAPPED));
  58.  
  59. hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
  60.  
  61. if(hDevice != INVALID_HANDLE_VALUE){
  62.  
  63. ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
  64.  
  65. }else
  66. {
  67. return NULL;
  68. }
  69.  
  70. if(ret == 0){
  71.  
  72.  
  73. ret = WaitForSingleObject(hDevice,INFINITE );
  74.  
  75. switch (ret)
  76. {
  77. case WAIT_OBJECT_0:break;
  78. case WAIT_TIMEOUT:break;
  79. default:
  80. break;
  81. }
  82. }
  83. else
  84. {
  85. return NULL;
  86. }
  87.  
  88.  
  89. if((int)buff[3] == 'N' && (int)buff[4] == 'T' && (int)buff[5] == 'F' && (int)buff[6] == 'S' ){
  90. printf("Volumen es formato NTFS\n\n\n");
  91. }
  92.  
  93. bytespercluster = endianhextodec(buff, offset1);
  94. sectperclusters = endianhextodec(buff, offset2);
  95. MFTCluster = endianhextodec(buff, offset3);
  96.  
  97. printf("Bytes por clusters = %d\nsectores por clusters = %d\nMFTClusters = %ld\n\n", bytespercluster, sectperclusters, MFTCluster);
  98.  
  99. crbig = (sectperclusters * (bytespercluster * MFTCluster));
  100.  
  101. d1 = (DWORD*)&crbig;
  102. overlapped.Offset = d1[1];
  103. overlapped.OffsetHigh = d1[0];
  104.  
  105. ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
  106.  
  107. if(ret == 0){
  108.  
  109.  
  110. ret = WaitForSingleObject(hDevice,INFINITE );
  111.  
  112. switch (ret)
  113. {
  114. case WAIT_OBJECT_0:break;
  115. default:
  116. break;
  117. }
  118. }
  119. else
  120. {
  121. return NULL;
  122. }
  123.  
  124. for (int n=0; n<sizeof(buff); n++)  
  125.    {  
  126.        printf("0x%02X ", buff[n]);  
  127.    }
  128.  
  129. CloseHandle(hDevice);
  130.  
  131. }

Y este es la parte del codigo de VB.NET que he hecho en C

Código
  1. Public Function IsNFTSDrive(ByVal strDrive As String) As Boolean
  2.        Dim Hnd As Integer, nRead As Integer
  3.        Dim ret As UInt32
  4.        Dim Buffer(1024) As Byte
  5.        Hnd = CreateFile("\\.\" & Mid(strDrive, 1, 2), GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
  6.        Nothing, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, IntPtr.Zero)
  7.        If (Hnd <> INVALID_HANDLE_VALUE) Then
  8.            ret = ReadFile(Hnd, Buffer, 1024, nRead, New System.Threading.NativeOverlapped)
  9.            Console.WriteLine(Buffer(200))
  10.        Else
  11.            Return False
  12.        End If
  13.        If ret = 0 Then
  14.            ret = WaitForSingleObject(Hnd, INFINITE)
  15.            Select Case ret
  16.                Case WAIT_OBJECT_0
  17.                Case WAIT_TIMEOUT
  18.            End Select
  19.        Else
  20.            Return False
  21.        End If
  22.        CloseHandle(Hnd)
  23.        Return Buffer(3) = 78 And Buffer(4) = 84 And Buffer(5) = 70 And Buffer(6) = 83
  24.    End Function
  25.  
  26.    Public Function GetFiles(ByVal strDrive As String, ByVal bnAllFiles As Boolean) As DataTable
  27.        Dim Hnd As Integer, nRead As Integer
  28.        Dim ret As UInt32
  29.        Dim Buffer(1024) As Byte
  30.  
  31.        Dim BytesPerSect As Long
  32.        Dim SectperCluster As Long
  33.        Dim MFTCluster As Long
  34.        Dim intIgnoredFiles As Integer = 0
  35.  
  36.        Dim NO As System.Threading.NativeOverlapped
  37.        'Read Partition Info
  38.        Hnd = CreateFile("\\.\" & Mid(strDrive, 1, 2), GENERIC_READ Or GENERIC_WRITE, FILE_SHARE_READ Or FILE_SHARE_WRITE, _
  39.        Nothing, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL Or FILE_FLAG_OVERLAPPED, IntPtr.Zero)
  40.        If (Hnd <> INVALID_HANDLE_VALUE) Then
  41.            ret = ReadFile(Hnd, Buffer, 1024, nRead, NO)
  42.        Else
  43.            Return Nothing
  44.        End If
  45.        If ret = 0 Then
  46.            ret = WaitForSingleObject(Hnd, INFINITE)
  47.            Select Case ret
  48.                Case WAIT_OBJECT_0
  49.                Case WAIT_TIMEOUT
  50.            End Select
  51.        Else
  52.            Return Nothing
  53.        End If
  54.        BytesPerSect = LittleEndianHEXToDecimal(Buffer, &HB, 2)
  55.        SectperCluster = LittleEndianHEXToDecimal(Buffer, &HD, 1)
  56.        MFTCluster = LittleEndianHEXToDecimal(Buffer, &H30, 8)
  57.        'Read MFT
  58.        SetReadFileOffset(NO, MFTCluster * SectperCluster * BytesPerSect)
  59.        ret = ReadFile(Hnd, Buffer, 1024, nRead, NO)
  60.        If ret = 0 Then
  61.            ret = WaitForSingleObject(Hnd, INFINITE)
  62.            Select Case ret
  63.                Case WAIT_OBJECT_0
  64.                Case Else
  65.            End Select
  66.        Else
  67.            Return Nothing
  68.        End If


Código
  1. Private Function LittleEndianHEXToDecimal(ByRef Buffer As Byte(), ByVal offset As Long, ByVal Length As Long) As Long
  2.        If Length = 1 Then
  3.            Return BitConverter.ToInt16(Buffer, offset)
  4.        End If
  5.        If Length = 2 Then
  6.            Return BitConverter.ToInt16(Buffer, offset)
  7.        End If
  8.        If Length = 4 Then
  9.            Return BitConverter.ToInt32(Buffer, offset)
  10.        End If
  11.        If Length = 8 Then
  12.            Return BitConverter.ToInt64(Buffer, offset)
  13.        End If
  14.  
  15.    End Function

Código
  1. Private Sub SetReadFileOffset(ByRef NO As System.Threading.NativeOverlapped, ByRef curBig As Int64)
  2.  
  3.        Dim lowoffset() As Byte = BitConverter.GetBytes(curBig)
  4.        Dim highoffset As Int32 = BitConverter.ToInt32(lowoffset, 0)
  5.        Dim high As Int32
  6.        Dim lastbytes(3) As Byte
  7.        Array.Copy(lowoffset, 4, lastbytes, 0, 4)
  8.        high = BitConverter.ToInt32(lastbytes, 0)
  9.        NO.OffsetLow = highoffset
  10.        NO.OffsetHigh = high
  11.    End Sub

Donde empieza mi problema es en la ultima parte donde dice 'Read MFT del codigo VB
En línea

.                                 
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: no funciona ReadFile y overlapped
« Respuesta #5 en: 4 Febrero 2014, 04:44 am »

Bien hoy si esta más claro.
Nota la declaración de crbig y como lo uso.

Código:
#define zwpath L"\\\\.\\C:"
     
     
long endianhextodec(BYTE *buffers, int offs)
{     
    BYTE tmp[2] = {0};
    BYTE tmp2[1] = {0};
    BYTE tmp3[3] = {0};
    BYTE tmp4[1] = {0};
     
    if(offs == 11){
    tmp[0] = buffers[11];
    tmp[1] = buffers[12];
     
    return tmp[1] << 8;
     
    }
     
    if(offs == 13){
     
    tmp2[0] = buffers[13];
     
    return tmp2[0];
     
    }
     
    if(offs == 30){
     
    tmp3[0] = buffers[48];
    tmp3[1] = buffers[49];
    tmp3[2] = buffers[50];
     
    return tmp3[2] << 16;
    }else{return 0;}

}
     
int main(int argc, char *argv[]){
{
    HANDLE hDevice;
    OVERLAPPED overlapped;
    LARGE_INTEGER crbig;
    BYTE buff[1024] = {0};
    DWORD numerobyte = 0, nbytes = 0;
    UINT32 ret;
    DWORD *d1;
    int offset1 = 11, offset2 = 13, offset3 = 30;
    long MFTCluster = 0, bytespercluster = 0, sectperclusters = 0, offet = 0;
    unsigned long mult = 0;
     
    ZeroMemory(&overlapped ,sizeof(OVERLAPPED));
     
    hDevice = CreateFileW(zwpath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING,  FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, NULL);
     
    if(hDevice != INVALID_HANDLE_VALUE){
     
    ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
     
    }else
    {
    return NULL;
    }
     
    if(ret == 0){
     
     
    ret = WaitForSingleObject(hDevice,INFINITE );
     
    switch (ret)
    {
    case WAIT_OBJECT_0:break;
    case WAIT_TIMEOUT:break;
    default:
    break;
    }
    }
    else
    {
    return NULL;
    }
     
     
    if((int)buff[3] == 'N' && (int)buff[4] == 'T' && (int)buff[5] == 'F' && (int)buff[6] == 'S' ){
    printf("Volumen es formato NTFS\n\n\n");
    }
     
    bytespercluster = endianhextodec(buff, offset1);
    sectperclusters = endianhextodec(buff, offset2);
    MFTCluster = endianhextodec(buff, offset3);
     
    printf("Bytes por clusters = %d\nsectores por clusters = %d\nMFTClusters = %ld\n\n", bytespercluster, sectperclusters, MFTCluster);
     

    RtlZeroMemory(&overlapped ,sizeof(OVERLAPPED));
    crbig.QuadPart = (sectperclusters * (bytespercluster * MFTCluster));
    overlapped.Offset = crbig.LowPart;
    overlapped.OffsetHigh = crbig.HighPart;
     
    ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);
     
    if(ret == 0){

     
    ret = WaitForSingleObject(hDevice,INFINITE );
     
    switch (ret)
    {
    case WAIT_OBJECT_0:break;
    default:
    break;
    }
    }
    else
    {
    return NULL;
    }
     
    for (int n=0; n<sizeof(buff); n++) 
       { 
           printf("0x%02X ", buff[n]); 
       }
     
    CloseHandle(hDevice);
     
    getchar();
}



por cierto, yo no sé porqué estos tios usaron lectura asincronica, no sé si la aplicación es de multihilos de todos modos se puede
usar SetFilePointer en lugar de FILE_FLAG_OVERLAPPED y WaitForSingleObject lo veo totalmente inutil, quizas no conocian SetFilePointer...
En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: no funciona ReadFile y overlapped
« Respuesta #6 en: 4 Febrero 2014, 05:17 am »

coincido contigo sobre WaitForSingleObject, pero no quiero empezar a hacer preguntas de algo que no me funciono y darme cuenta que fue por no colocar algo que en el otro codigo si habia, pero terminando hare lo que me mencionas sobre SetFilePointer y quitare y optimizare otras cosas que las estoy dejando pasar por ahora, solo que no me habia tocado el momento de trabajar con varias funciones y API's de ahorita, por eso se me esta dificultando entender

y el codigo que me pusiste, no se si estoy haciendo algo mal, porque el prinft me sigue mostrando los mismo bytes, como que no avanza, y necesito avanzar dependiendo el valor de overlapped, porque en el codigo de VB.net me sale un offset de 56 + 1

Código
  1. Dim offset As Long = LittleEndianHEXToDecimal(Buffer, 20, 2) + 1

al principio creia que no encontraba ese offset, pero lo busque y ninguno del offset 20 me sale 56 en decimal, es la suma de 2 bytes segun bitconverter, entonces es donde me di cuenta que readfile no avanza y parece que lee los mismo bytes

acabo de compilar el codigo y avanza igual de bien, pero me sigue mostrando los mismos bytes del inicio, en el tercer offset empieza NTFS, asi que sigue siendo el inicio y eso es lo que no entiendo, porque no avanza

Código:
0xEB 0x52 0x90 0x4E 0x54 0x46 0x53 0x20 0x20 0x20 0x20 0x00 0x02 0x08 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0xF8 0x00 0x00 0x3F 0x00 0xFF 0x00 0x00 0x28 0x03 0x00
0x00 0x00 0x00 0x00 0x80 0x00 0x80 0x00 0xFF 0xAF 0xEE 0x0C 0x00 0x00 0x00 0x00
0x00 0x00 0x0C 0x00 0x00 0x00 0x00 0x00 0x02 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0xF6 0x00 0x00 0x00 0x01 0x00 0x00 0x00 0x87 0xFF 0x92 0x82 0x24 0x93 0x82 0x1E
0x00 0x00 0x00 0x00 0xFA 0x33 0xC0 0x8E 0xD0 0xBC 0x00 0x7C 0xFB 0x68 0xC0 0x07
0x1F 0x1E 0x68 0x66 0x00 0xCB 0x88 0x16 0x0E 0x00 0x66 0x81 0x3E 0x03 0x00 0x4E
0x54 0x46 0x53 0x75 0x15 0xB4 0x41 0xBB 0xAA 0x55 0xCD 0x13 0x72 0x0C 0x81 0xFB
0x55 0xAA 0x75 0x06 0xF7 0xC1 0x01 0x00 0x75 0x03 0xE9 0xDD 0x00 0x1E 0x83 0xEC
0x18 0x68 0x1A 0x00 0xB4 0x48 0x8A 0x16 0x0E 0x00 0x8B 0xF4 0x16 0x1F 0xCD 0x13
0x9F 0x83 0xC4 0x18 0x9E 0x58 0x1F 0x72 0xE1 0x3B 0x06 0x0B 0x00 0x75 0xDB 0xA3
0x0F 0x00 0xC1 0x2E 0x0F 0x00 0x04 0x1E 0x5A 0x33 0xDB 0xB9 0x00 0x20 0x2B 0xC8
0x66 0xFF 0x06 0x11 0x00 0x03 0x16 0x0F 0x00 0x8E 0xC2 0xFF 0x06 0x16 0x00 0xE8
0x4B 0x00 0x2B 0xC8 0x77 0xEF 0xB8 0x00 0xBB 0xCD 0x1A 0x66 0x23 0xC0 0x75 0x2D
0x66 0x81 0xFB 0x54 0x43 0x50 0x41 0x75 0x24 0x81 0xF9 0x02 0x01 0x72 0x1E 0x16
0x68 0x07 0xBB 0x16 0x68 0x70 0x0E 0x16 0x68 0x09 0x00 0x66 0x53 0x66 0x53 0x66
0x55 0x16 0x16 0x16 0x68 0xB8 0x01 0x66 0x61 0x0E 0x07 0xCD 0x1A 0x33 0xC0 0xBF
0x28 0x10 0xB9 0xD8 0x0F 0xFC 0xF3 0xAA 0xE9 0x5F 0x01 0x90 0x90 0x66 0x60 0x1E
0x06 0x66 0xA1 0x11 0x00 0x66 0x03 0x06 0x1C 0x00 0x1E 0x66 0x68 0x00 0x00 0x00
0x00 0x66 0x50 0x06 0x53 0x68 0x01 0x00 0x68 0x10 0x00 0xB4 0x42 0x8A 0x16 0x0E
0x00 0x16 0x1F 0x8B 0xF4 0xCD 0x13 0x66 0x59 0x5B 0x5A 0x66 0x59 0x66 0x59 0x1F
0x0F 0x82 0x16 0x00 0x66 0xFF 0x06 0x11 0x00 0x03 0x16 0x0F 0x00 0x8E 0xC2 0xFF
0x0E 0x16 0x00 0x75 0xBC 0x07 0x1F 0x66 0x61 0xC3 0xA0 0xF8 0x01 0xE8 0x09 0x00
0xA0 0xFB 0x01 0xE8 0x03 0x00 0xF4 0xEB 0xFD 0xB4 0x01 0x8B 0xF0 0xAC 0x3C 0x00
0x74 0x09 0xB4 0x0E 0xBB 0x07 0x00 0xCD 0x10 0xEB 0xF2 0xC3 0x0D 0x0A 0x45 0x72
0x72 0x6F 0x72 0x20 0x64 0x65 0x20 0x64 0x69 0x73 0x63 0x6F 0x00 0x0D 0x0A 0x46
0x61 0x6C 0x74 0x61 0x20 0x62 0x6F 0x6F 0x74 0x6D 0x67 0x72 0x00 0x0D 0x0A 0x42
0x6F 0x6F 0x74 0x6D 0x67 0x72 0x20 0x63 0x6F 0x6D 0x70 0x72 0x69 0x6D 0x69 0x64
0x6F 0x00 0x0D 0x0A 0x50 0x72 0x65 0x73 0x2E 0x20 0x43 0x74 0x72 0x6C 0x2B 0x41
0x6C 0x74 0x2B 0x53 0x75 0x70 0x72 0x20 0x70 0x61 0x72 0x61 0x20 0x72 0x65 0x69
0x6E 0x69 0x63 0x69 0x61 0x72 0x0D 0x0A 0x00 0x6C 0x20 0x74 0x6F 0x20 0x72 0x65
0x73 0x74 0x61 0x72 0x74 0x0D 0x0A 0x00 0x8C 0x9D 0xAD 0xC2 0x00 0x00 0x55 0xAA
0x07 0x00 0x42 0x00 0x4F 0x00 0x4F 0x00 0x54 0x00 0x4D 0x00 0x47 0x00 0x52 0x00
0x04 0x00 0x24 0x00 0x49 0x00 0x33 0x00 0x30 0x00 0x00 0xD4 0x00 0x00 0x00 0x24
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0xEB 0x22 0x90 0x90 0x05 0x00 0x4E 0x00 0x54 0x00
0x4C 0x00 0x44 0x00 0x52 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x66 0x0F 0xB7 0x06 0x0B 0x00
0x66 0x0F 0xB6 0x1E 0x0D 0x00 0x66 0xF7 0xE3 0x66 0xA3 0x52 0x02 0x66 0x8B 0x0E
0x40 0x00 0x80 0xF9 0x00 0x0F 0x8F 0x0E 0x00 0xF6 0xD9 0x66 0xB8 0x01 0x00 0x00
0x00 0x66 0xD3 0xE0 0xEB 0x08 0x90 0x66 0xA1 0x52 0x02 0x66 0xF7 0xE1 0x66 0xA3
0x66 0x02 0x66 0x0F 0xB7 0x1E 0x0B 0x00 0x66 0x33 0xD2 0x66 0xF7 0xF3 0x66 0xA3
0x56 0x02 0xE8 0x95 0x04 0x66 0x8B 0x0E 0x4E 0x02 0x66 0x89 0x0E 0x26 0x02 0x66
0x03 0x0E 0x66 0x02 0x66 0x89 0x0E 0x2A 0x02 0x66 0x03 0x0E 0x66 0x02 0x66 0x89
0x0E 0x2E 0x02 0x66 0x03 0x0E 0x66 0x02 0x66 0x89 0x0E 0x3E 0x02 0x66 0x03 0x0E
0x66 0x02 0x66 0x89 0x0E 0x46 0x02 0x66 0xB8 0x90 0x00 0x00 0x00 0x66 0x8B 0x0E
0x26 0x02 0xE8 0x83 0x09 0x66 0x0B 0xC0 0x0F 0x84 0x5E 0xFE 0x66 0xA3 0x32 0x02
0x66 0xB8 0xA0 0x00 0x00 0x00 0x66 0x8B 0x0E 0x2A 0x02 0xE8 0x6A 0x09 0x66 0xA3
0x36 0x02 0x66 0xB8 0xB0 0x00 0x00 0x00 0x66 0x8B 0x0E 0x2E 0x02 0xE8 0x58 0x09
0x66 0xA3 0x3A 0x02 0x66 0xA1 0x32 0x02 0x66 0x0B 0xC0 0x0F 0x84 0x2B 0xFE 0x67
0x80 0x78 0x08 0x00 0x0F 0x85 0x22 0xFE 0x67 0x66 0x8D 0x50 0x10 0x67 0x03 0x42
0x04 0x67 0x66 0x0F 0xB6 0x48 0x0C 0x66 0x89 0x0E 0x72 0x02 0x67 0x66 0x8B 0x48
0x08 0x66 0x89 0x0E 0x6E 0x02 0x66 0xA1 0x6E 0x02 0x66 0x0F 0xB7 0x0E 0x0B 0x00
0x66 0x33 0xD2 0x66 0xF7 0xF1 0x66 0xA3 0x76 0x02 0x66 0xA1 0x46 0x02 0x66 0x03
0x06 0x6E 0x02 0x66 0xA3 0x4A 0x02 0x66 0x83 0x3E 0x36 0x02 0x00 0x0F 0x84 0x1D
0x00 0x66 0x83 0x3E 0x3A 0x02 0x00 0x0F 0x84 0xCF 0xFD 0x66 0x8B 0x1E 0x3A 0x02
0x1E 0x07 0x66 0x8B 0x3E 0x4A 0x02 0x66 0xA1 0x2E 0x02 0xE8 0xE0 0x01 0x66 0x0F
0xB7 0x0E 0x00 0x02 0x66 0xB8 0x02 0x02 0x00 0x00 0xE8 0x22 0x08 0x66 0x0B 0xC0
0x0F 0x85 0x16 0x00 0x66 0x0F 0xB7 0x0E 0x5A 0x02 0x66 0xB8 0x5C 0x02 0x00 0x00
0xE8 0x0C 0x08 0x66 0x0B 0xC0 0x0F 0x84 0x42 0x0C 0x67 0x66 0x8B 0x00 0x1E 0x07
0x66 0x8B 0x3E 0x3E 0x02 0xE8 0x3F 0x06 0x66 0xA1 0x3E 0x02 0x66 0xBB 0x20 0x00
0x00 0x00 0x66 0xB9 0x00 0x00 0x00 0x00 0x66 0xBA 0x00 0x00 0x00 0x00 0xE8 0xE4




En línea

.                                 
x64core


Desconectado Desconectado

Mensajes: 1.908


Ver Perfil
Re: no funciona ReadFile y overlapped
« Respuesta #7 en: 4 Febrero 2014, 06:52 am »

Hice esta traducción rapida, nota que use la estructura que creo que es la estabas buscando la vez pasada, de esta manera accedemos
a los campos directamente. pero sino, pues como dije no hay necesidad de hacer conversion a diferencia como en NET. simplemente haces
algo como esto:

variable = *((SizeOfType*)&Pointer[offset]); / SizeOfType = BYTE, WORD, etc

y obtendras el campo

Uso VC++ como compilador por si tenes problemas al compilar con directivas propias ( #pragma pack, tipos, etc ).

Código
  1. #pragma pack(push, 1)
  2. typedef struct _BIOS_PARAMETERS_BLOCK
  3. {
  4.    USHORT    BytesPerSector;
  5.    UCHAR     SectorsPerCluster;
  6.    UCHAR     Unused0[7];
  7.    UCHAR     MediaId;
  8.    UCHAR     Unused1[2];
  9.    USHORT    SectorsPerTrack;
  10.    USHORT    Heads;
  11.    UCHAR     Unused2[4];
  12.    UCHAR     Unused3[4];
  13. } BIOS_PARAMETERS_BLOCK, *PBIOS_PARAMETERS_BLOCK;
  14.  
  15. typedef struct _EXTENDED_BIOS_PARAMETERS_BLOCK
  16. {
  17.    USHORT    Unknown[2];
  18.    ULONGLONG SectorCount;
  19.    ULONGLONG MftLocation;
  20.    ULONGLONG MftMirrLocation;
  21.    CHAR      ClustersPerMftRecord;
  22.    UCHAR     Unused4[3];
  23.    CHAR      ClustersPerIndexRecord;
  24.    UCHAR     Unused5[3];
  25.    ULONGLONG SerialNumber;
  26.    UCHAR     Checksum[4];
  27. } EXTENDED_BIOS_PARAMETERS_BLOCK, *PEXTENDED_BIOS_PARAMETERS_BLOCK;
  28.  
  29. typedef struct _BOOT_SECTOR
  30. {
  31.    UCHAR     Jump[3];
  32.    UCHAR     OEMID[8];
  33.    BIOS_PARAMETERS_BLOCK BPB;
  34.    EXTENDED_BIOS_PARAMETERS_BLOCK EBPB;
  35.    UCHAR     BootStrap[426];
  36.    USHORT    EndSector;
  37. } BOOT_SECTOR, *PBOOT_SECTOR;
  38. #pragma pack(pop)
  39.  
  40. VOID GetFiles(LPSTR SzDrive)
  41. {
  42.    if(!SzDrive)
  43.        return;
  44.  
  45.    CHAR SzSymDrive[40] = "\\\\.\\";
  46.    HANDLE hDrive;
  47.    BYTE DriveContent[1024];
  48.    DWORD BytesRead;
  49.    PBOOT_SECTOR lpBootSector;
  50.    LARGE_INTEGER MFTLcl;
  51.  
  52.    strcat(SzSymDrive,SzDrive);
  53.    hDrive = CreateFileA(SzSymDrive,GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ | FILE_SHARE_WRITE,
  54.                NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL, NULL);
  55.    if(hDrive == INVALID_HANDLE_VALUE)
  56.    {
  57.        return;
  58.    }
  59.  
  60.    if( (!ReadFile(hDrive,DriveContent,sizeof(DriveContent),&BytesRead,NULL)) ||
  61.        (BytesRead != sizeof(DriveContent))
  62.       )
  63.    {
  64.        goto clhandle;
  65.    }
  66.  
  67.    lpBootSector = (PBOOT_SECTOR)DriveContent;
  68.    MFTLcl.QuadPart = lpBootSector->BPB.BytesPerSector * lpBootSector->BPB.SectorsPerCluster * lpBootSector->EBPB.MftLocation;
  69.  
  70.    if(SetFilePointer(hDrive,MFTLcl.LowPart,&MFTLcl.HighPart,FILE_BEGIN) == INVALID_SET_FILE_POINTER)
  71.    {
  72.        goto clhandle;
  73.    }
  74.  
  75.    if( (!ReadFile(hDrive,DriveContent,sizeof(DriveContent),&BytesRead,NULL)) ||
  76.        (BytesRead != sizeof(DriveContent))
  77.        )
  78.    {
  79.        goto clhandle;
  80.    }
  81.  
  82.    // ...
  83.  
  84. clhandle:
  85.    CloseHandle(hDrive);
  86.  
  87. }
  88.  
-
llamar por ejemplo:
GetFiles("C:");
« Última modificación: 4 Febrero 2014, 06:54 am por x64Core » En línea

Belial & Grimoire


Desconectado Desconectado

Mensajes: 559


Tea_Madhatter


Ver Perfil
Re: no funciona ReadFile y overlapped
« Respuesta #8 en: 6 Febrero 2014, 23:43 pm »

hola, perdon por contestar hasta ahora pero se me acabo el tiempo, tengo que regresar a la escuela y con el trabajo ya no creo tener tanto tiempo

pero tienes razon, yo estaba utilizando otra estructura que era NTFS_VOLUME_DATA_BUFFER

typedef struct {
  LARGE_INTEGER VolumeSerialNumber;
  LARGE_INTEGER NumberSectors;
  LARGE_INTEGER TotalClusters;
  LARGE_INTEGER FreeClusters;
  LARGE_INTEGER TotalReserved;
  DWORD         BytesPerSector;
  DWORD         BytesPerCluster;
  DWORD         BytesPerFileRecordSegment;
  DWORD         ClustersPerFileRecordSegment;
  LARGE_INTEGER MftValidDataLength;
  LARGE_INTEGER MftStartLcn;
  LARGE_INTEGER Mft2StartLcn;
  LARGE_INTEGER MftZoneStart;
  LARGE_INTEGER MftZoneEnd;
} NTFS_VOLUME_DATA_BUFFER, *PNTFS_VOLUME_DATA_BUFFER;

pero tuve dos problemas, la primera fue un error mio que no me habia dado cuenta que no estaba leyendo $BOOT sino otro que era Disk_Geometry, fue cuando me di cuenta que debia hacerlo funcionar con C: y no PhysicalDrive0

y la segunda fue que no encontraba SectorsPerCluster

hice un intento de multiplicarlo directamente por 8 con el anterior codigo y me salio el mismo resultado que en el codigo de arriba en este momento

Código
  1.   MFTcl.QuadPart =  ntfsData.MftStartLcn.QuadPart * ntfsData.BytesPerSector * 8;
  2.  

pero ya no me dio tiempo de arreglar SetFilePointer y Readfile, asi que ejecute el programa pero enseguida salto a CloseHandle(hDevice); con el if INVALID_SET_FILE_POINTER

pero bueno, supuestamente con esto ya deberia haber llegado a $MFT, de aqui deberia empezar a leer las entradas MFT, donde ya podria encontrar los archivos junto con sus atributos y se encuentran en cada 1024 bytes

Gracias x64Core, logre avanzar bastante gracias a tu ayuda, seguire un poco lento pero quiero terminar de aprender esto

salu2
« Última modificación: 7 Febrero 2014, 00:50 am por Belial & Grimoire » En línea

.                                 
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
X-oom funciona pero no funciona (sungoku?)
Multimedia
Lordofchaos 4 4,321 Último mensaje 12 Diciembre 2005, 20:44 pm
por Sourraund
Login con md5 , BD funciona pero no funciona « 1 2 »
PHP
securedigital 16 10,192 Último mensaje 25 Mayo 2007, 17:46 pm
por securedigital
Declaración de la API ReadFile
Programación Visual Basic
NekroByte 2 2,127 Último mensaje 7 Agosto 2007, 05:37 am
por NekroByte
Problemas con WriteFile & ReadFile.. « 1 2 »
Programación Visual Basic
illuminat3d 10 4,331 Último mensaje 27 Marzo 2010, 13:39 pm
por illuminat3d
Problema interceptando ReadFile
Programación C/C++
sonnyk88 7 3,809 Último mensaje 30 Julio 2010, 00:09 am
por Eternal Idol
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines