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ú

Mensajes - fary

#871
Programación Visual Basic / Re: [RETO] Sudoku
24 Septiembre 2011, 13:02 PM

Matrix inicial.
0  0  0 | 0  0  5 | 2  0  0 |
0  6  5 | 0  3  0 | 0  0  0 |
9  3  0 | 0  0  1 | 0  0  0 |
--------------------------------
0  9  0 | 4  6  3 | 0  0  0 |
0  0  0 | 0  0  0 | 0  0  8 |
0  7  0 | 8  0  0 | 6  0  0 |
--------------------------------
0  8  0 | 1  0  0 | 0  3  2 |
0  0  0 | 0  8  0 | 0  0  4 |
5  0  0 | 0  9  0 | 0  0  0 |
--------------------------------
Sudoku Resuelto
1  4  8 | 6  7  5 | 2  9  3 |
2  6  5 | 9  3  8 | 4  1  7 |
9  3  7 | 2  4  1 | 8  5  6 |
--------------------------------
8  9  2 | 4  6  3 | 1  7  5 |
4  5  6 | 7  1  9 | 3  2  8 |
3  7  1 | 8  5  2 | 6  4  9 |
--------------------------------
6  8  9 | 1  2  7 | 5  3  2 |
7  1  3 | 5  8  4 | 9  6  4 |
5  2  4 | 3  9  6 | 7  8  1 |
--------------------------------


saludos.
#872
Cita de: lucasluks1004 en 18 Septiembre 2011, 18:54 PM...

pffff... es qeu mi problema creo que esta en cosa de punteros o algo así  :-\ y no lo logro encontrar.

saludos.
#873
Cita de: peib0l en 18 Septiembre 2011, 15:27 PM
a la velocidad no permitida XD

jajajaja si, si nuna te pasas nunca salta XD

#874
Ya estoi aqui de nuevo, esta vez e intentado agregar una nueva sección a un ejecutable, sin exito  :xD

este es el código que tengo:

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

int main()
{
IMAGE_DOS_HEADER dh;
IMAGE_NT_HEADERS nth;

IMAGE_SECTION_HEADER * sección;
IMAGE_SECTION_HEADER nSeccion;
   // char * stub_dos -> Datos del STUB_DOS
   // char * dSecciones -> Datos de las secciones

FILE * archivo = fopen("c:\\windows\\system32\\calc.exe","r+b");
   if (archivo == NULL)
   {
       printf("Error al leer el archivo\n");
       system("PAUSE");

       return 1;
   }

fread(&dh,sizeof(dh),1,archivo); // Rellenamos IMAGE_DOS_HEADER

   char * stub_dos = (char*)malloc(dh.e_lfanew-0x40);

   fread(stub_dos,1,dh.e_lfanew-0x40,archivo); // Leemos el Stub DOS
   fread(&nth,sizeof(nth),1,archivo); // leemos nt headers

   sección = (IMAGE_SECTION_HEADER*)malloc(sizeof(IMAGE_SECTION_HEADER)*nth.FileHeader.NumberOfSections);

   fread(sección,sizeof(IMAGE_SECTION_HEADER),nth.FileHeader.NumberOfSections,archivo);

   char * dSecciones = (char*)malloc(nth.OptionalHeader.SizeOfImage);
   fread(dSecciones,nth.OptionalHeader.SizeOfImage,1,archivo); //leo todos los datos de las secciones.

   fclose(archivo); // terminamos de leer

   ZeroMemory(&nSeccion,sizeof(IMAGE_SECTION_HEADER));

   int A = sección[nth.FileHeader.NumberOfSections-1].VirtualAddress;
   int B = sección[nth.FileHeader.NumberOfSections-1].Misc.VirtualSize;
   int C = nth.OptionalHeader.SectionAlignment;

   strcpy((char*)nSeccion.Name,".fary"); // nombre de la nueva sección: .fary
   nSeccion.VirtualAddress = ((A+B)/C)*C+C;// direccion Virtual
   nSeccion.SizeOfRawData = 0x64; // tamaño de la sección: 100
   nSeccion.PointerToRawData = sección[nth.FileHeader.NumberOfSections-1].PointerToRawData + 0x64;  // direccion fisica
   nSeccion.Characteristics = 0x10000020;
   nSeccion.Misc.VirtualSize = 0x64;
   //nSeccion.VirtulSize

   nth.FileHeader.NumberOfSections += 1; // sumamos la nueva sección
   nth.OptionalHeader.SizeOfImage += 0x64;

   FILE * nuevo = fopen("NuevaCalc.exe","wb+");

   fwrite(&dh,sizeof(dh),1,nuevo);
   fwrite(stub_dos,dh.e_lfanew-0x40,1,nuevo);
   fwrite(&nth,sizeof(nth),1,nuevo);
   fwrite(sección,sizeof(IMAGE_SECTION_HEADER)*nth.FileHeader.NumberOfSections,1,nuevo);
   fwrite(&nSeccion,sizeof(IMAGE_SECTION_HEADER),1,nuevo);
   fwrite(dSecciones,nth.OptionalHeader.SizeOfImage,1,nuevo);

   char * DatosSeccion = (char*)malloc(0x64);
   ZeroMemory(DatosSeccion,0x64);

   fwrite(DatosSeccion,0x64,1,nuevo);

   fclose(nuevo);
system("PAUSE");
return 0;
}


Genera bien el nuevo archivo pero no pone bien los datos de la sección y ni que decir de ejecutarse (peta) XD. Así es como salen los datos de mi sección desde el lordPE:




haber si aguien sabe que ago mal...

saludos.
#875
Cita de: Queta en  5 Septiembre 2011, 13:40 PM
Puedes programar la entrada y salida de ficheros, y básicamente todo el código, con las funciones de la API, así te ahorras la C Runtime Library y reduces el peso del ejecutable.

Cierto pero bueno yo ya lo hice asi ;)
#876
Ya lo e conseguido, muchas gracias a todos...
El código arreglado es el siguiente:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main()
{
IMAGE_DOS_HEADER idh;
IMAGE_FILE_HEADER ifh;
IMAGE_OPTIONAL_HEADER ioh;
IMAGE_SECTION_HEADER ish;

char ruta[] = "C:\\MS-DOC.exe";

FILE * archivo = fopen(ruta,"r+b");
if (archivo == NULL)
{ // si no podemos abrri el archivo.
printf("Error al abrir el archivo\n");
system("PAUSE");

return 1;
}

fread(&idh,0x40,1,archivo); // rellenamos IMAGE_DOS_HEADER
if (idh.e_magic != IMAGE_DOS_SIGNATURE)
{ // comprovamos el e_magic para saber si es un EXE
printf("No es un archivo EXE\n");
system("PAUSE");

return 1;
}

fseek(archivo,idh.e_lfanew + 4,SEEK_SET);
fread(&ifh,0x14,1,archivo); // rellenamos IMAGE_FILE_HEADER
fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh), SEEK_SET);
fread(&ioh,ifh.SizeOfOptionalHeader,1,archivo); // Leemos IMAGE_OPTIONAL_HEADER

for (int i=0;i<ifh.NumberOfSections;i++)
{
fread(&ish, sizeof(ish),1,archivo);
printf("%x\n",ish.Misc.PhysicalAddress);
}

fclose(archivo);

system("PAUSE");

return 0;
}


saludos.
#877
Si se llega a hacer un torneo me apuntooooo!!
#878
Buenas, bueno al fin he decidido meterme de lleno a aprender el formato PE y tenia pensado agrandar  la sección de código par aintroducir un pequeño opcode con un msgbox y tal una chorradilla pero para ensayar no me parece mal  >:D.
El problema viene cuando no puedo detectar el ISH bien de todas las secciones, solo lo detecta bien de la primera, el código que he creado es este:

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

int main()
{
IMAGE_DOS_HEADER idh;
IMAGE_FILE_HEADER ifh;
IMAGE_OPTIONAL_HEADER ioh;
IMAGE_SECTION_HEADER ish;

char ruta[] = "C:\\MS-DOC.exe";

FILE * archivo = fopen(ruta,"r+b");
if (archivo == NULL)
{ // si no podemos abrri el archivo.
printf("Error al abrir el archivo\n");
system("PAUSE");

return 1;
}

fread(&idh,0x40,1,archivo); // rellenamos IMAGE_DOS_HEADER
if (idh.e_magic != IMAGE_DOS_SIGNATURE)
{ // comprovamos el e_magic para saber si es un EXE
printf("No es un archivo EXE\n");
system("PAUSE");

return 1;
}

fseek(archivo,idh.e_lfanew + 4,SEEK_SET);
fread(&ifh,0x14,1,archivo); // rellenamos IMAGE_FILE_HEADER
fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh), SEEK_SET);
fread(&ioh,ifh.SizeOfOptionalHeader,1,archivo); // Leemos IMAGE_OPTIONAL_HEADER

int suma = 0;

for (int i=0;i<ifh.NumberOfSections;i++)
{
fseek(archivo, idh.e_lfanew + 4 + sizeof(ifh) + ifh.SizeOfOptionalHeader + (sizeof(ish)*(ifh.NumberOfSections-1)) + suma ,SEEK_SET);
fread(&ish, sizeof(ish),1,archivo); // rellenamos IMAGE_SECTION_HEADER

printf("%x\n",(&ish)[i].Misc.PhysicalAddress);

suma += 0x28; // sumo 0x28 que es lo que ocupa ish para pasar a los datos de la siguiente sección.
}

fclose(archivo);

system("PAUSE");

return 0;
}


Nose que andará mal por ahi si me peuden hechar una mano sería de gran ayuda >:(

un saludo.
#879
Son diferentes formas de hacerlo... de la forma que yo púse tambien se puede hacer pero si tienes muchos parametros es mas lio obviamente :P

PD: tambien sirve con stdcall y etc.

saludos.
#880
Cita de: MCKSys Argentina en 31 Agosto 2011, 18:28 PM
Hasta donde se, en ASM los params se PUSHean al reves de como los declaras.


int AgregarRegistro(int param1, int param2)
{
      void* ptrreg;
      void* ptrreg2;
__asm eax, dword ptr [esp+4] //recupera param2
       __asm mov ptrreg, eax
__asm eax, dword ptr [esp+8] //recupera param1
       __asm mov ptrreg2, eax
}


Si no es asi, debe ser al reves...  ;D

Saludos!

no sería asi exactamente, fijate:

Código (asm) [Seleccionar]
include 'win32ax.inc'

.data
       cadena1 db 'primero',0
       cadena2 db 'segundo',0

.code
start:
       push cadena2
       push cadena1

       call Msgbox

       invoke MessageBoxA,0,"Sali del proceso",0,0

       ret

       Msgbox:
            pop eax ; dirección de retorno

            pop ecx ;primer parametro
            pop edx ;segundo parametro

            push eax
            invoke MessageBoxA,0,edx,ecx,0
            pop eax


            jmp eax ; retornamos
.end start        



Aunque con las macros de las funciones y tal creo qeu variaria un poco.

saludos.