|
21
|
Programación / Programación C/C++ / Re: es posible concatenar un array byte?
|
en: 31 Enero 2014, 19:55 pm
|
ok, ya entendi y logre hacerlo se que no es necesario la conversion, pero intento hacer lo mismo que la funcion BitConverter para poder continuar, es que intento no hacer un copy - paste de codigos, asi que si quiero aprender bien, no tengo de otra mas que rehacer lo que veo para poder comprender como funcionan las cosas gracias
|
|
|
22
|
Programación / Programación C/C++ / es posible concatenar un array byte?
|
en: 31 Enero 2014, 06:33 am
|
hola
alguien sabe como podria o si es posible concatenar bytes de un mismo array, por ejemplo
BYTE *buffer[2] = {0x00, 0x02}
me gustaria poder concatenarla pero al reves para que quede asi... 0x200, porque necesito cambiar ese valor a decimal, que serian 512 y guardarlo en algun integer
lo intente con strcpy, strcat y memcpy pero no me funcionan porque el buffer es BYTE y aun haciendo cast (char) me tira error
alguien sabe alguna forma de lograr juntar los hexadecimales del array?, porque tambien necesito hacerlo con arrays mas grandes por ejemplo
buff = {0x00, 0x00, 0x02, 0x00, 0x00, 0x00}
y necesito que quede asi 0x20000 para poder convertirlo en decimal
aguna idea o ejemplo que me puedan dar porfavor.
|
|
|
25
|
Programación / Programación C/C++ / como encontrar offsets de MFT para cambiar los bytes en decimales?
|
en: 30 Enero 2014, 09:12 am
|
hola pues ya logre avanzar con un programa que estoy intentando hacer, despues de re-leer, hice un pequeño avance, pero tengo un problema a ver que opinan segun MSDN hay dos maneras de analizar la unidad C, ya sea "\\.\C:", "\\.\C:\" o "\\\\.\\PhysicalDrive0" En visual basic algunos programadores hacen esto "\\.\" & Mid(Drive, 1, 2) donde Drive es "C:\" supuestamente deberia quedar asi... "\\.\C:"... pero al colocarlo de esa forma en el programa ya no funciona, de igual forma en C tampoco funciona en C la unica forma que me funciona es usando "\\\\.\\PhysicalDrive0", pero tengo la duda de si funcionara o no, supuestamente si me esta funcionando, porque recibo datos, pero no se si haya alguna diferencia o porque razon en VB solo funcione si utilizan Mid, por que si hay alguna, entonces el programa falla desde el principio pero no me he dado cuenta, y me gustaria saber que opinan o si podrian compilar mi codigo y decirme si a ustedes le funciona "\\.\C:" o si es normal y solo les funciono PhysicalDrive0, mas abajo colocare mi codigo ahora tengo otro problema, necesito la informacion de los clusters, hay estructuras que puedo usar para saber esto pero no hay para algunas cosas que necesito, pero segun un codigo de VB que analice, se pueden conseguir 3 datos que necesito analizando los datos recibidos con ReadFile Aqui dejo una tabla de los datos que mencionare Offset Size Description 0x0000 3 Jump to the boot loader routine 0x0003 8 System Id: "NTFS " 0x000B 2 Bytes per sector 0x000D 1 Sectors per cluster 0x000E 7 Unused 0x0015 1 Media descriptor (a) 0x0016 2 Unused 0x0018 2 Sectors per track 0x001A 2 Number of heads 0x001C 8 Unused 0x0024 4 Usually 80 00 80 00 (b) 0x0028 8 Number of sectors in the volume 0x0030 8 LCN of VCN 0 of the $MFT 0x0038 8 LCN of VCN 0 of the $MFTMirr 0x0040 4 Clusters per MFT Record (c) 0x0044 4 Clusters per Index Record (c) 0x0048 8 Volume serial number los valores que necesito son el offset 0x0B 0x0D y 0x30 el codigo de VB usa una funcion llamaba bitconverter, que busca un offset y los valores los cambia a decimal el offset Bytepersector lo puedo sacar con una estructura, tambien tengo entendido que en NTFS un cluster tiene 512 bytes, y eso son 8 sectores, y me faltaria encontrar LCN of VCN 0 of the $MFT Supuestamente al leer los datos de la unidad, se puede saber eso unicamente llendo al offset y tomando los valores dependiendo del tamaño, y en la tabla esta el tamaño de cada offset Pero mi problema es que no logro encontrar el offset para tomar el valor hexadecimal y convertirlo en decimal, aqui es donde tambien incluyo el problema anterior, no se si no los encuentro porque CreateFile no abre la unidad C: o es porque no estoy interpretando bien los datos El resultado los compare con un codigo fuente de https://code.google.com/p/datarecover/ y obtengo el mismo resultado al ejecutar el programa, los dos me dan los mismo hexadecimales, aunque yo lo programe diferente En VB me arroja este resultado Bitconverter donde busca los offset y convierte en decimal los bytes 512 8 786432 Pero leyendo los datos que me arroja buffer, no logro encontrar esa informacion Me gustaria saber si alguien aqui podria ayudarme a encontrar la manera de saber donde se encuentran esos offset y como debo buscarlos para despues cambiar de hexadecimal a decimal espero me puedan ayudar salu2 #include <Windows.h> #include <winioctl.h> #include <stdio.h> #include <stdlib.h> #define zwpath L"\\\\.\\PhysicalDrive0" int main(int argc, char *argv[]){ HANDLE hDevice; OVERLAPPED overlapped; BYTE buff[1024] = {0}; DWORD numerobyte = 0; UINT32 ret; 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; } CloseHandle(hDevice); for (int n=0; n<sizeof(buff); ++n) { } }
|
|
|
26
|
Programación / Programación C/C++ / como pasar la funcion BitConverter de VB.NEt a C?
|
en: 28 Enero 2014, 20:25 pm
|
hola
tengo un array byte donde guardo informacion guardada por ReadFile, por ejemplo
BYTE buffer[1024]
ReadFile(HFile, buffer, sizeof(buffer), 0);
en VB.net hay una funcion que te convierte bytes en enteros se llama Bitconverter.ToInt16, lo que supuestamente hace es buscar un offset y lo que haya en ese offset lo convierte en decimal
por ejemplo
offset = &HD
BitConverter.ToInt16(buffer, offset)
alli, hasta donde yo se, es que busca en el array BYTE buffer el offset o hexadecimal que en este caso seria 0x0D, y el contenido alli lo cambia a decimal
por ejemplo
primero busca en el array 0x0D, cuando lo encuentra hay un valor que es 0x08 y lo convierte a decimal que igual seria 8, pero puede cambiar el valor, podria ser 0xAF, 0x13, etc...
Entonces quisiera saber como podria leer el array BYTE para encontrar el offset y hacer la conversion de hexadecimal a decimal de lo que haya en cierto offset pero en codigo C
porque Bitconverter convierte dependiendo la base, por ejemplo Int16 convierte los dos primeros bytes, int32 convierte los 4 primeros bytes y int64 convierte los 8 primeros bytes
entonces si por ejemplo en el offset 0x0B hay un valor 0x0102, como encontraria el offset 0x0B para cambiar el valor 0x0102 de hexadecimal a decimal?
me podrian poner algun ejemplo porfavor
|
|
|
27
|
Foros Generales / Foro Libre / Re: "Obama será recordado como el presidente que resucitó la Guerra Fría"
|
en: 27 Enero 2014, 20:21 pm
|
yo estaria feliz de que desaparezca EEUU, pero si la guerra elimina a ese pais, comenzaria otra guerra por el liderazgo mundial y entre ellos esta China y Rusia, algunos otros paises de Europa y de America
Si se acaba China o Rusia, la guerra por apropiarse de una parte de esos paises comenzara, y asi continuamente
la guerra nunca acabara, lo unico que podemos hacer es desear que no nos toque alguna guerra en nuestro pais
|
|
|
28
|
Programación / Programación C/C++ / necesito ayuda sobre MFT y su analisis en C
|
en: 26 Enero 2014, 06:33 am
|
hola Estoy tratando de crear un codigo para recuperar archivos borrados, vengo leyendo varios documentos y viendo varios codigos, poco a poco estoy comprendiendo como funciona, hasta ahora he logrado comprender en donde se encuentra la informacion de los archivos, sobre NTFS, MFT y clusters, y mas o menos como encontrar los archivos borrados, sobre sus atributos y despues de eso me faltaria saber como restaurar los archivos he practicado y mas abajo pondre un codigo que hice analizando codigos que hay en la red, desafortunadamente para mi, la mayoria en funcionamiento los encuentro para VB, hay otros pero son muy elaborados usando incluso clases, pero a la mayoria he visto lo mismo Ahora... mi problema es el siguiente, ¿de que forma puedo leer los datos de MFT?, ya tengo una forma de acceso pero no logro entender como hacen ese escaneo por los datos del archivo MFT para analizar los archivos que se encuentran en mi computadora, asi como los borrados espero alguien me pueda ayudar diciendo que API, estructura o que operacion tendria que usar ahora para empezar el analisis en MFT, porfavor, porque ya no se por donde seguir o que mas se deba hacer dejo el codigo que mencione, pero despues de aprender esto, que mas sigue?, perdon si estan mal escrito los printf pero los escribi asi de mal porque solo fue para entender de que sirve la estructura por cierto, he visto que algunos utilizan DISK_GEOMETRY pero yo no lo vi necesario tambien hay unas API que vi que utilizan por ejemplo FSCTL_ENUM_USN_DATA, FSCTL_QUERY_USN_JOURNAL Esto es lo que he logrado entender y es parecido a una parte de VB.net #include <Windows.h> #include <winioctl.h> #include <stdio.h> #define FSCTL_GET_NTFS_VOLUME_DATA CTL_CODE(FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) #define zwpath L"\\\\.\\PhysicalDrive0" int main(int argc, char *argv[]){ HANDLE hDevice = INVALID_HANDLE_VALUE; BOOL bresul = FALSE; DWORD junk = 0; hDevice = CreateFileW(zwpath, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hDevice == INVALID_HANDLE_VALUE){ } NTFS_VOLUME_DATA_BUFFER ntfsData; bresul = DeviceIoControl(hDevice,FSCTL_GET_NTFS_VOLUME_DATA, NULL, 0, &ntfsData, sizeof(NTFS_VOLUME_DATA_BUFFER), &junk, (LPOVERLAPPED)NULL ); printf("Numero de serie = %ld\n", ntfsData. VolumeSerialNumber); printf("Numero de sectores = %ld\n", ntfsData. NumberSectors); printf("Total clusters = %ld\n", ntfsData. TotalClusters); printf("Clusters libres = %ld\n", ntfsData. FreeClusters); printf("Total reservados = %ld\n", ntfsData. TotalReserved); printf("Bytes por sector = %ld\n", ntfsData. BytesPerSector); printf("Bytes por cluster = %ld\n", ntfsData. BytesPerCluster); printf("Bytes por segmeto de archivo = %ld\n", ntfsData. BytesPerFileRecordSegment); printf("Cluster por segmento de archivo = %ld\n", ntfsData. ClustersPerFileRecordSegment); printf("Longitud de datos validos MFT = %ld\n", ntfsData. MftValidDataLength); printf("Inicio de LCN = %ld\n", ntfsData. MftStartLcn); printf("Inicio mirror de LCN = %ld\n", ntfsData. Mft2StartLcn); printf("Zona de Inicio MFT= %ld\n", ntfsData. MftZoneStart); printf("Zona final MFT = %ld\n", ntfsData. MftZoneEnd); }
O si alguien tiene conocimientos en VB.NET que me pueda ayudar a traducir el codigo a C tambien me ayudaria bastante Public Sub FindHDFiles (ByVal Drive As String) Try Dim dinfo = My. Computer. FileSystem. GetDriveInfo(Drive & "\") If Not dinfo.IsReady Then MsgBox("Drive not ready.", MsgBoxStyle.Critical, "ERROR") Exit Sub End If If dinfo.DriveFormat <> "NTFS" Then MsgBox("This feature only works on NTFS volumes.", MsgBoxStyle.Critical, "ERROR") Exit Sub End If ARKDDA = New DirectDriveIO (Drive & "\") Catch MsgBox("Could not access drive.", MsgBoxStyle.Critical, "ERROR") Exit Sub End Try Dim diskhandle = CreateFile ("\\?\" & Drive, EFileAccess. GENERIC_READ + EFileAccess. GENERIC_WRITE, EFileShare. FILE_SHARE_READ + EFileShare. FILE_SHARE_WRITE, Nothing, ECreationDisposition. OPEN_EXISTING, 0, Nothing) If diskhandle = 0 Then diskhandle = CreateFile ("\\.\" & Drive, EFileAccess. GENERIC_READ + EFileAccess. GENERIC_WRITE, EFileShare. FILE_SHARE_READ + EFileShare. FILE_SHARE_WRITE, Nothing, ECreationDisposition. OPEN_EXISTING, 0, Nothing) If diskhandle = 0 Then MsgBox("Could not access drive.", MsgBoxStyle.Critical, "ERROR") Exit Sub End If End If Dim FSCTL_GET_NFTS_VOLUME_DATA = CTL_CODE(FILE_DEVICE.FILE_DEVICE_FILE_SYSTEM, 25, METHOD_BUFFERED, FILE_ANY_ACCESS) Dim buffer As NTFS_VOLUME_DATA_BUFFER DeviceIoControlNTFS(diskhandle, FSCTL_GET_NFTS_VOLUME_DATA, 0, 0, buffer, SizeOf(buffer), 0, 0) CloseHandle(diskhandle) Dim MFTAddress As Long = buffer.MftStartLcn * CLng(buffer.BytesPerCluster / buffer.BytesPerSector) Dim MFTEntrySize As Integer = buffer.BytesPerFileRecordSegment / buffer.BytesPerSector Dim NumberOfEntries As Long = buffer.MftValidDataLength / MFTEntrySize Dim Bytes(buffer.BytesPerCluster) As Byte Dim CurrEntryBytes(MFTEntrySize * buffer.BytesPerSector) As Byte Dim CurrEntry As New STANDARD_MFT_ENTRY Dim Type As Byte Dim Name As String Dim BaseAddr As Long Dim Parent As Integer Dim DoEventsCounter As Integer = 0 ListView1.Items.Clear() ListView2.Items.Clear() ProgressBar1.Value = 0 ProgressBar1.Maximum = buffer.MftValidDataLength / buffer.BytesPerFileRecordSegment ToolStripStatusLabel1. Text = "Finding files in " & Drive & "\..." Button1.Enabled = False Button2.Enabled = False ComboBox1.Enabled = False Button3.Enabled = False CheckBox2.Enabled = False If CheckBox2. Checked Then Bitmap = ReadBitmap (Drive) Dim BitmapBase As Long = MFTAddress + (MFTEntrySize * 0) Bytes = ARKDDA.ReadSectors(BitmapBase, MFTEntrySize) BaseAddr = MergeToInt(Bytes, &H14, &H15) 'The offset the the first attribute While Bytes(baseaddr) <> &H80 baseaddr = baseaddr + MergeToInt(Bytes, baseaddr + &H4, baseaddr + &H7) 'Add the length of the attribute to the base address to find the next attribute End While baseaddr = baseaddr + &H40 Dim Length As ULong = 0 Dim LenLen As Byte = 0 Dim Offset As ULong = 0 Dim OffLen As Byte = 0 Dim Path As String = "" Dim BaseAddr2 As ULong = 0 Dim FileSize As ULong = 0 Dim LoopCount As Integer = 0 Dim PartNum As Integer = 0 While Bytes(baseaddr) > 0 LenLen = Bytes(BaseAddr) And &HF OffLen = (Bytes(BaseAddr) And &HF0) / &H10 Length = MergeToInt(Bytes, BaseAddr + 1, BaseAddr + LenLen) Offset = Offset + MergeToInt(Bytes, BaseAddr + 1 + LenLen, BaseAddr + LenLen + OffLen) For Record = 0 To ((Length * buffer.BytesPerCluster) / buffer.BytesPerFileRecordSegment) - 1 DoEventsCounter = DoEventsCounter + 1 If DoEventsCounter >= 100 Then Application.DoEvents() DoEventsCounter = 0 End If Try If (PartNum + 1) >= (CurrEntryBytes.Count / buffer.BytesPerFileRecordSegment) Then CurrEntryBytes = ARKDDA.ReadSectors((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)), MFTEntrySize * 1024) BaseAddr2 = 0 PartNum = 0 Else 'CurrEntryBytes = ByteArrayPart(CurrEntryBytes, buffer.BytesPerFileRecordSegment, UBound(CurrEntryBytes)) 'BaseAddr2 = (((BaseAddr2 \ buffer.BytesPerFileRecordSegment) + 1) * buffer.BytesPerFileRecordSegment) PartNum = PartNum + 1 BaseAddr2 = PartNum * buffer.BytesPerFileRecordSegment End If If CurrEntryBytes(BaseAddr2) <> Asc("F") Then 'If CurrEntryBytes(0) <> Asc("F") Then GoTo dn End If Name = "" Parent = 5 Path = "" FileSize = 0 'Type = CurrEntryBytes(&H16) Type = CurrEntryBytes(&H16 + BaseAddr2) 'If Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedDirectory Or Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedFile Then If Type = MFT_ENTRY_FILE_TYPE_FLAGS.DeletedFile Then 'BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, &H14, &H15) 'The offset the the first attribute BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H14, BaseAddr2 + &H15) 'The offset the the first attribute BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute Try Parent = MergeToInt(CurrEntryBytes, BaseAddr2 + &H18, BaseAddr2 + &H1D) Catch End Try Try If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H48, BaseAddr2 + &H4F) If FileSize > 2 ^ 30 Then FileSize = 0 'If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H40, BaseAddr2 + &H47) Catch End Try Try Name = System.Text.UnicodeEncoding.Unicode.GetString(ByteArrayPart(CurrEntryBytes, BaseAddr2 + &H5A, (BaseAddr2 + &H5A) + ((2 * CurrEntryBytes(BaseAddr2 + &H58)) - 2))) Catch End Try Try If Name.Contains("~") Then BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H48, BaseAddr2 + &H4F) If FileSize > 2 ^ 30 Then FileSize = 0 'If FileSize = 0 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H40, BaseAddr2 + &H47) Name = System.Text.UnicodeEncoding.Unicode.GetString(ByteArrayPart(CurrEntryBytes, BaseAddr2 + &H5A, (BaseAddr2 + &H5A) + ((2 * CurrEntryBytes(BaseAddr2 + &H58)) - 2))) End If Catch End Try If Name.Length >= 75 Then Name = Mid(Name, 1, 74) & Mid(Name, 76, Name.Length - 75) If CheckBox1.Checked Then Try Path = GetFullPath2(Parent, MFTAddress, MFTEntrySize, buffer.BytesPerCluster) & "\" & Name Catch End Try End If If FileSize = 0 Then Try LoopCount = 0 While CurrEntryBytes(BaseAddr2) <> &H80 And LoopCount < 5 LoopCount = LoopCount + 1 BaseAddr2 = BaseAddr2 + MergeToInt(CurrEntryBytes, BaseAddr2 + &H4, BaseAddr2 + &H7) 'Add the length of the attribute to the base address to find the next attribute End While 'FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H28, BaseAddr2 + &H2F) 'If FileSize > 2 ^ 30 Then FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H38, BaseAddr2 + &H3F) If MergeToInt(CurrEntryBytes, BaseAddr2 + &HE, BaseAddr2 + &HF) = 1 Then 'It is recycled (filename at offset 0x30,file size at offset 0x10) FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H10, BaseAddr2 + &H13) 'Path = "" 'BaseAddr2 = BaseAddr2 + &H30 'While CurrEntryBytes(BaseAddr2) > 0 'Path = Path + ChrW(MergeToInt(CurrEntryBytes, BaseAddr2, BaseAddr2 + 1)) 'Path = Path + ChrW(CurrEntryBytes(BaseAddr2)) 'BaseAddr2 = BaseAddr2 + 2 'End While Else 'FileSize = 0 FileSize = MergeToInt(CurrEntryBytes, BaseAddr2 + &H30, BaseAddr2 + &H37) End If If FileSize > 2 ^ 30 Then FileSize = 0 Catch End Try End If If FileSize > 0 Then With ListView1.Items.Add(Name) If Not Path.Contains("SKIPTHISFILE") Then .SubItems.Add(Path) Else .SubItems.Add("") End If .SubItems.Add(FileSize) .SubItems.Add((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector))) If CheckBox2.Checked Then Try .SubItems.Add(GetFileIntegrity((Record * MFTEntrySize) + (Offset * (buffer.BytesPerCluster / buffer.BytesPerSector)), buffer.BytesPerSector, buffer.BytesPerFileRecordSegment)) Catch .SubItems.Add("Unknown") End Try Else .SubItems.Add("") End If ListView2.Items.Add(.Clone) End With End If GoTo dn End If Catch End Try dn: Try ProgressBar1.Value = ProgressBar1.Value + 1 Catch End Try Next Record BaseAddr = BaseAddr + (1 + LenLen + OffLen) End While ProgressBar1.Value = 0 ToolStripStatusLabel1.Text = "" Button1.Enabled = True Button2.Enabled = True ComboBox1.Enabled = True Button3.Enabled = True CheckBox2.Enabled = True End Sub
|
|
|
30
|
Foros Generales / Foro Libre / Re: ¿Por qué los informaticos somos considerados como gordos frikis?
|
en: 25 Enero 2014, 08:13 am
|
jajaja, siempre pasa, soy alguien que me gusta hacer ejercicio y trato de arreglarme, pero siempre me pasa que cuando alguien me conoce, sale la pregunta...¿a que te dedicas? y cuando les digo, soy informatico, jajaja se me quedan viendo bien raro, y cuando les digo.. ¿que?, ¿me imaginabas gordo, friki y con mis playeras de star wars?... y siempre me dicen que si.. algo asi se esperaban...
|
|
|
|
|
|
|