|
11
|
Programación / Programación C/C++ / Obtener direccion de funcion
|
en: 6 Mayo 2015, 02:33 am
|
Hola!
Capaz que es una pregunta estupida, pero no encuentro como solucionar esto:
Necesito obtener la direccion a una funcion...
Podria usar un puntero a funcion, pero esa no seria la direccion "real", sino que me devuelve la direccion a un JMP "direccion que quiero"
Gracias! Saludos!
|
|
|
12
|
Programación / Programación C/C++ / Ayuda con SeAssignSecurity
|
en: 31 Marzo 2015, 02:51 am
|
Hola! Estoy tratando de cargar un driver en win7, pero el "loader" me devuelve el codigo de error 0xC0000061 - STATUS_PRIVILEGE_NOT_HELD El driver es un simple driver de prueba.. solo tiene estas rutinas: NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath); NTSTATUS DriverCreate (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS DriverClose (IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp); NTSTATUS DriverUnload (IN PDRIVER_OBJECT DriverObject);
Por lo que lei, deberia usar SeAssignSecurity, pero no estoy seguro en donde ni para que.. La sintaxis es esta: NTSTATUS SeAssignSecurity( _In_opt_ PSECURITY_DESCRIPTOR ParentDescriptor, _In_opt_ PSECURITY_DESCRIPTOR ExplicitDescriptor, _Out_ PSECURITY_DESCRIPTOR *NewDescriptor, _In_ BOOLEAN IsDirectoryObject, _In_ PSECURITY_SUBJECT_CONTEXT SubjectContext, _In_ PGENERIC_MAPPING GenericMapping, _In_ POOL_TYPE PoolType );
Donde deberia implementar dicha funcion? DriverEntry quizas? Y que consigo? Elevar los permisos de dicho objeto? Bueno, eso es lo que me preocupa.. Gracias! Saludos!
|
|
|
13
|
Programación / Programación C/C++ / Como probar una conexion UDP
|
en: 3 Marzo 2015, 00:43 am
|
Hola, estoy haciendo unas pruebas con conexiones UDP, en realidad estoy en Blitz3D pero cualquier ayuda me va a venir bien, si no corresponde el tema en este sub foro, perdon..
Tengo algo asi como una aplicacion de consola, un cliente y un server, la idea es establecer una conexion UDP y poder testear la velocidad de la conexion,,
La pregunta seria: ¿como? Como hago para saber el tiempo exacto que demoro en llegar un dato de un pc al otro?
Algo asi como un comando Ping
bueno, cualquier cosa sirve,, idea o codigo ejemplo, ya sea en C o C++, yo lo adapto a Blitz
Gracias!! Saludos!!
|
|
|
15
|
Programación / ASM / Consulta sobre VESA y directiva: "virtual" (pasar de FASM a NASM)
|
en: 12 Febrero 2015, 19:55 pm
|
Hola! Hace tiempo no pasaba por estos lados.. Estoy revisando el código de KolibriOS, mas específicamente la parte de video, y me encuentro con esto: struc VBE_VGAInfo { .VESASignature dd ? ; char .VESAVersion dw ? ; short .OemStringPtr dd ? ; char * .Capabilities dd ? ; ulong .VideoModePtr dd ? ; ulong .TotalMemory dw ? ; short ; VBE 2.0+ .OemSoftwareRev db ? ; short .OemVendorNamePtr dw ? ; char * .OemProductNamePtr dw ? ; char * .OemProductRevPtr dw ? ; char * .reserved rb 222 ; char .OemData rb 256 ; char } struc VBE_ModeInfo { .ModeAttributes dw ? ; short .WinAAttributes db ? ; char .WinBAttributes db ? ; char .WinGranularity dw ? ; short ... ; MUCHOS CAMPOS MAS, LOS RECORTO PARA AHORRAR ESPACIO .LinRsvdFieldPosition db ? ; char .MaxPixelClock dd ? ; ulong .res2 rb 190 ; char } virtual at $A000 vi VBE_VGAInfo mi VBE_ModeInfo modes_table: end virtual
El problema es que kolibri esta ensamblado en FASM (donde existe esa directiva virtual at XXXX), ya vi como funciona "virtual", pero no me doy cuenta como pasarlo a NASM, yo uso la estructura asi: ; =========================== NASM VESA INFORMATION BLOCK =========================== VESA_Info: .Signature db 4 ; VBE Signature .Version dw 1 ; VBE Version .OEMStringPtr dd 1 ; VbeFarPtr to OEM String .capabilities db 4 ; Capabilities of graphics controller .VideoModePtr dd 1 ; VbeFarPtr to VideoModeList .TotalMemory dw 1 ; Number of 64kb memory blocks .OEMSoftwareRev dw 1 ; VBE implementation Software revision .OEMVendorNamePtr dd 1 ; VbeFarPtr to Vendor Name String .OEMProductNamePtr dd 1 ; VbeFarPtr to Product Name String .OEMProductRevPtr dd 1 ; VbeFarPtr to Product Revision String .Reserved db 222 ; Reserved for VBE implementation scratch area .OEMData db 255 ; Data Area for OEM Strings ; .OEMData db 256 ; Data Area for OEM Strings ; ============================== VESA MODE INFORMATION ============================== Mode_Info: .ModeAttributes dw 1 ; mode attributes .WinAAttributes db 1 ; window A attributes .WinBAttributes db 1 ; window B attributes .WinGranularity dw 1 ; window granularity ... ; CAMPOS OCULTOS .LinRsvdFieldPos db 1 ; bit position of lsb of reserved mask (linear modes) .MaxPixelClock dd 1 ; maximum pixel clock (in Hz) for graphics mode .Reserved db 190 ; remainder of ModeInfoBlock ; ******************************************************************************************
Bueno, y quiero acceder asi: ; ================================================= ; Display Vesa version ; ================================================= VESAVER: mov ax, 0x4f00 ; VESA BIOS function (get BIOS info, if function available) mov di, VESA_Info ; mov di, 0xA000 int 0x10 cmp ax, 0x004f ; OK? je vesa jmp novesaver vesa: mov ax, [es:di+4] ; AH = major, AL = minor version ; mov dx, ax ; ??? add ax, 48*256+48 ; convert to ASCII mov [vervesa+19], ah ; replace x.x in string with numbers mov [vervesa+21], al ; update offsets if string is modified mov si, vervesa ; Print Vesa version call print16 ret novesaver: mov si, novesa call print16 ret ; ************* END VESAVER *************
Eso funciona, pero hasta ahi.. no puedo mostrar ningun campo mas,, queria mostrar por ejemplo (codigo de Kolibri): mov si,word[es:vi.OemStringPtr] mov di,si push ds mov ds,word[es:vi.OemStringPtr+2] call printplain pop ds
NOTA: printplain es casi igual a mi print16, es la funcion 0eh - int 10h NOTA2: Notese que usa "vi" y eso lo declara en virtual, en NASM no tengo eso..Bueno, espero no haber enredado mucho el asunto y que se entienda.. Gracias por leer y de antemano por la ayuda! Saludos!
|
|
|
16
|
Programación / Programación C/C++ / Prototipo "Lanzador Exploit"
|
en: 16 Diciembre 2014, 04:24 am
|
Hola, estoy con este programa y quería (ademas de compartirlo) tener una opinión extra, puede que no este super prolijo, y que algunas cosas se puedan optimizar,, (y probablemente lo haga), pero me gustaría tener una opinión fresca,, que tal el código, el método usado, etc.. El programa abre un archivo que yo guardo como por ej: "Exploit.bin", y puedo elegir enviarlo por un puerto X, a una direccion X por protocolo TCP o UDP (O sea, lanzar un exploit, no?), por otro lado, se puede abrir un programa y pasarle como parametro el exploit,, Bueno, sin mas.. ahi el code: #define WIN32_LEAN_AND_MEAN #include <Windows.h> #include <iostream> #include <fstream> #include "Sockets.h" #include "Strings.h" using namespace std; int OpenExploit(char * path); int OpenAndSend(char * LOCAL, char * Exploit); void ShowHelp(char * Me); char * DstBuf; int main(int argc, char *argv[]) { cout << endl; if (argc < 2) { ShowHelp(argv[0]); return EXIT_FAILURE; } char PROTO[5] = "\0", IP[16] = "\0", PORT[5] = "\0", LOCAL[MAX_PATH] = "\0", EXPIT[MAX_PATH] = "\0"; char ptrOpt[MAX_PATH] = "\0"; for (int i = 1; i < argc; i++) { strcpy_s(ptrOpt, MAX_PATH, argv[i]); if (strncmp(ptrOpt, "-", 1) == 0 || strncmp(ptrOpt, "/", 1) == 0) { // ------------------------------------------------- // if (strstr(ptrOpt, "R") || strstr(ptrOpt, "r")) { // REMOTE EXPLOIT char * STmp = strtok(argv[i + 1], ":"); if (STmp != NULL) strcpy_s(IP, 15, STmp); // IP else { ShowHelp(argv[0]); return EXIT_FAILURE; } STmp = strtok(NULL, ":"); if (STmp != NULL) strcpy_s(PORT, 5, STmp); // PORT else { ShowHelp(argv[0]); return EXIT_FAILURE; }} // ------------------------------------------------- // if (strstr(ptrOpt, "P") || strstr(ptrOpt, "p")) // PROTOCOL strcpy_s(PROTO, 5, argv[i + 1]); if (strstr(ptrOpt, "L") || strstr(ptrOpt, "l")) // LOCAL EXPLOIT strcpy_s(LOCAL, MAX_PATH - 1, argv[i + 1]); if (strstr(ptrOpt, "X") || strstr(ptrOpt, "x")) // EXPLOIT strcpy_s(EXPIT, MAX_PATH - 1, argv[i + 1]); if (strstr(ptrOpt, "H") || strstr(ptrOpt, "h")) // HELP! { ShowHelp(argv[0]); return EXIT_SUCCESS; } } } // ============================================================================================================================================= // ********************************* // * REMOTE EXPLOIT PARAMETERS * // ********************************* if (strcmp(LOCAL, "\0") == 0 && strcmp(IP, "\0") != 0 && strcmp(PORT, "\0") != 0 && strcmp(PROTO, "\0") != 0 && strcmp(EXPIT, "\0") != 0) { if (strcmp(PROTO, "tcp") == 0 || strcmp(PROTO, "TCP") == 0) { cout << "\tConnect : TCP" << endl; } else if (strcmp(PROTO, "udp") == 0 || strcmp(PROTO, "UDP") == 0) { cout << "\tConnect : UDP" << endl; } else { ShowHelp(argv[0]); return EXIT_FAILURE; } cout << "\tIP : " << IP << endl; cout << "\tPort : " << PORT << endl; cout << "\tExploit : " << EXPIT << endl; if (OpenExploit(EXPIT) == EXIT_SUCCESS) { if (ConectAndSend(IP, strtoul(PORT, NULL, 0), PROTO, DstBuf) == EXIT_SUCCESS) { cout << endl << "\tExploit Send!" << endl; delete[] DstBuf; } } // ********************************* // * LOCAL EXPLOIT PARAMETERS * // ********************************* } else if (strcmp(LOCAL, "\0") != 0 && strcmp(IP, "\0") == 0 && strcmp(PORT, "\0") == 0 && strcmp(PROTO, "\0") == 0 && strcmp(EXPIT, "\0") != 0) { cout << "\tLocal : " << LOCAL << endl; cout << "\tExploit : " << EXPIT << endl; if (OpenExploit(EXPIT) == EXIT_SUCCESS) { if (OpenAndSend(LOCAL, DstBuf) == EXIT_SUCCESS) { cout << endl << "\tExploit Send" << endl; delete[] DstBuf; } } // ************* // * ERROR * // ************* } else { ShowHelp(argv[0]); return EXIT_FAILURE; } return EXIT_SUCCESS; } int OpenExploit(char *path) { ifstream Exploit; Exploit.open(path, ios::in | ios::binary | ios::ate); if (Exploit.is_open()) { streampos size = Exploit.tellg(); DstBuf = new char[size]; Exploit.seekg(0, ios::beg); Exploit.read(DstBuf, size); cout << endl << "\tExploit Ready! Size: " << size << endl; if (Exploit.is_open()) Exploit.close(); return EXIT_SUCCESS; } else { cout << endl << "\tError Opening Exploit" << endl; return EXIT_FAILURE; } } int ConectAndSend(char *IP, DWORD PUERTO, char *PROTO, char *Exploit) { int rtn = 0; WSADATA WSA; //--> ESTRUCTURA WSADATA; SOCKET Socket; //--> VARIABLE DE TIPO SOCKET SOCKADDR_IN Server; //--> ESTRUCTURA SOCKADDR_IN cout << endl; if ((rtn = WSAStartup(MAKEWORD(2, 2), &WSA)) != 0) { cout << "\tError WSAStartup: " << rtn << endl; return EXIT_FAILURE; } // TCP! if (strcmp(PROTO, "tcp") == 0 || strcmp(PROTO, "TCP") == 0) { if ((Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == SOCKET_ERROR) { cout << "\tError en socket: " << WSAGetLastError() << endl; WSACleanup(); return EXIT_FAILURE; } Server.sin_family = AF_INET; Server.sin_addr.S_un.S_addr = inet_addr(IP); Server.sin_port = htons(PUERTO); if ((rtn = connect(Socket, (struct sockaddr*) &Server, sizeof(Server))) == SOCKET_ERROR) { cout << "\tError en connect: " << WSAGetLastError() << endl; closesocket(Socket); WSACleanup(); return EXIT_FAILURE; } if (send(Socket, Exploit, strlen(Exploit), 0) < 0) { cout << "\tError en Send" << endl; closesocket(Socket); WSACleanup(); return EXIT_FAILURE; } // UDP! } else if (strcmp(PROTO, "UDP") == 0 || strcmp(PROTO, "udp") == 0) { int slen = sizeof(Server); if ((Socket = socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP)) == SOCKET_ERROR) { cout << "\tError en socket: " << WSAGetLastError() << endl; WSACleanup(); return EXIT_FAILURE; } Server.sin_family = AF_INET; Server.sin_addr.S_un.S_addr = inet_addr(IP); Server.sin_port = htons(PUERTO); if (sendto(Socket, Exploit, strlen(Exploit), 0, (struct sockaddr *) &Server, slen) == SOCKET_ERROR) { cout << "\tError en Sendto" << endl; closesocket(Socket); WSACleanup(); return EXIT_FAILURE; } } closesocket(Socket); WSACleanup(); return EXIT_SUCCESS; } int OpenAndSend(char *LOCAL, char *Exploit) { cout << endl << "\t"; STARTUPINFO lpStartupInfo; PROCESS_INFORMATION lpProcessInformation; ZeroMemory(&lpStartupInfo, sizeof(lpStartupInfo)); lpStartupInfo.cb = sizeof(lpStartupInfo); ZeroMemory(&lpProcessInformation, sizeof(lpProcessInformation)); if (!CreateProcess(LOCAL, Exploit, NULL, NULL, FALSE, 0, NULL, NULL, &lpStartupInfo, &lpProcessInformation)) { cout << endl << "\tError CreateProcess: " << GetLastError() << endl; return EXIT_FAILURE; } WaitForSingleObject(lpProcessInformation.hProcess, INFINITE); CloseHandle(lpProcessInformation.hProcess); CloseHandle(lpProcessInformation.hThread); return EXIT_SUCCESS; } void ShowHelp(char * Me) { cout << " USAGE: " << Me << endl << Help << Me << EXAMPLE << endl; }
Saludos!
|
|
|
17
|
Programación / PHP / Seguridad Login-Registro PHP/MySql
|
en: 3 Diciembre 2014, 22:57 pm
|
Hola! Estoy realizando una web del estilo compra/venta y aunque me manejo relativamente bien en la programación web, no tengo tanta experiencia formada.. Me gustaría leer de otros usuarios mas experientes, cuales son los mejores métodos para tener un registro y un login seguro en PHP y MySQL.. Estoy viendo de usar algo asi: <?php include_once("functions.php"); $mysqli = connect(); $stmt = $mysqli->prepare("SELECT email, pass FROM users WHERE email = ? AND pass = ?"); $stmt->bind_param('ss', $email, $pass); $stmt->execute(); $stmt->bind_result($Umail, $Upass); if($stmt->fetch() == 'true') { echo "Login!!"; } else{ echo "Logout!!"; } $stmt->close(); ?>
functions.phpfunction connect() { include_once("db.php"); $mysqli = new mysqli($host, $user, $pass, $db); if ($mysqli->connect_errno) echo "Fallo al contenctar a MySQL: " . $mysqli->connect_error; return $mysqli; }
Ya se que el tema es super extenso, que hay muchas formas de protegerse y lo mejor es combinarlas, se que no solo es cuestión de código, sino de seguridad en el servidor también.. no pretendo una explicación detallada, pero al menos lo fundamental, que no puede faltar!! Voy a numerar las que yo conozco, y si falta algo me ayudan comentando abajo.. - Usuarios restringidos MySql
- Cifrado de contraseña
- Permisos restringidos de las carpetas y archivos PHP
- Contador de intentos de login
- Escapar caracteres "malos"
Aclaro.. hablo de lo fundamental, que no debería faltar nunca para un registro/login seguro.. Y por ultimo, no existe algún "proyecto" que facilite todas las funciones de seguridad? O sea,, algún código ya armado y testeado? Aunque sea de pago, vale la pena por la seguridad del sitio.. Saludos! Perdon si es muy largo el post
|
|
|
18
|
Programación / ASM / Puerto y Memoria Grafica?
|
en: 1 Noviembre 2014, 22:42 pm
|
Buenas! Estaba revisando este codigo.. Lo que hace es modificar la paleta de colores y escribir pixeles de colores (en forma de franjas) en la pantalla... al presionar una tecla, modifica la paleta y otra vez lo mismo.. mov ax, 0013h ; Modo Grafico (ah = 00h / al = 13h) int 10h ; Esta interrupción controla los servicios de pantalla del PC mov ax, 0A000h ; Direccion de video (grafica) mov ds, ax ; DS = A000h (memoria de graficos). DS esta concatenado con DI ; ========== Cambiar paleta de colores ========== mov dx, 3c8h ; Empezamos a modificar la paleta de colores mov al, 0 ; Desde la entrada 0 out dx, al inc dx ; DX = 3C9h. mov cx, 10 ; Se van a modificar 10 entradas ( cx se ve afectado con loop ) SigEntrada: ; Modificar 10 entradas de la paleta ; Rojo. mov al, 0 mul cl out dx, al ; Verde mov al, 0 mul cl out dx, al ; Azul mov al, 6 mul cl out dx, al loop SigEntrada ; ************************************** xor dx, dx L1: ; Cuando vuelve a esta etiqueta no limpia dx, util para cambiar los colores mov cx, 64000 xor bx, bx xor di, di NuevaLinea: mov [di], dx inc di inc bx cmp bx, 6400 jne SigPixel xor bx, bx inc dx SigPixel: loop NuevaLinea ; Esperar tecla mov ah, 10h int 16h inc dx ; Otra entrada en la paleta de colores y volver a cargar jmp L1
Ese codigo es 16-Bits y lo corro en Modo real.. Ahora la pregunta: Si lograse pasar a modo protegido y quisiese dibujar algo avanzado (digamos, una ventana moderna, con muchos colores y bien ubicados, como un SO moderno) deberia de tener a nivel de nucleo, "algo" que modifique la paleta y haga el respectivo "out", como en ese codigo, verdad? O es de otra forma? Y de ser así, seria como un driver,, y como podría ser la forma mas "optima" de implementar esa rutina? O algún material de referencia.. Parece trabajo difícil, de mucha matemática Saludos! Gracias!
|
|
|
20
|
Programación / Programación C/C++ / Problema al modificar sección .text
|
en: 7 Octubre 2014, 19:39 pm
|
Hola! Estoy armando un programa que modifica la sección .text de un ejecutable.. Uso las estructuras: PIMAGE_DOS_HEADER PIMAGE_NT_HEADERS PIMAGE_OPTIONAL_HEADER PIMAGE_SECTION_HEADER
Por lo que entiendo si hago esto: // Ajusto el punto de inicio a lo que necesito... //IOH->AddressOfEntryPoint += 16; IOH->AddressOfEntryPoint = IOH->BaseOfCode + 16;
Cualquiera de esas dos variantes deberían hacer lo mismo, verdad? Bueno, el problema es que en mi programa de pruebas funciona bien, pero en otros no funciona,, el entrypoint no cambia, y si cambia, lo hace mal.. La pregunta: ¿Puede verse afectado esto por algo asi como un relloc, o hay algo que no tengo en cuanta? Gracias! Saludos!
|
|
|
|
|
|
|