|
Mostrar Temas
|
Páginas: [1] 2
|
2
|
Programación / Programación C/C++ / Sobrecarga operador +
|
en: 5 Febrero 2015, 15:43 pm
|
Hola, estoy practicando el tema de sobrecarga y me tope con 2 problemas. class Foo { public: //Foo& operator+(const Foo& f); tampoco funciona //Si funciona (Foo& f) Foo& operator+(Foo const& f){ bar_ += f.getBar(); return *this; } int getBar(){ return bar_; } private: int bar_; };
Por alguna razon, cuando sobrecargo el operador +, Visual Studio 2010 me exigue que el parametro sea una referencia simple "Foo& f" y no const. Si coloco const, salta error que no puede convertir de const & a & desde el metodo Foo::getBar(). No tengo visual studio a mano como pasar el error exacto. (passing `const Foo' as `this' argument of `int Foo::getBar()' discards qualifiers ) Otra cosa, en http://www.parashift.com/c++-faq/overview-op-ov.htmlColoca este ejemplo Fred operator+ (Fred const& x, Fred const& y); Pero vc++ y blodshed dev c++ tambien se quejan de que solo se puede pasar un argumento a un operador unario. Será que tiene solamente parcial soporte de c++11? Saludos y Gracias
|
|
|
3
|
Programación / Programación C/C++ / Puntero a funcion como argumento
|
en: 9 Enero 2015, 22:10 pm
|
Holas estimados , estaba jugando un poco con c++ para crear una clase que manejara menus de consola. Hasta ahora tengo algo funcionando como esto: void proc1(void){ std::cout << "proc1" << std::endl; } void proc1a(void){ std::cout << "proc1a" << std::endl; } void proc1b(void){ std::cout << "proc1b" << std::endl; } void proc2(void){ std::cout << "proc 2" << std::endl; } void proc3a(void){ std::cout << "proc 3a" << std::endl; } void proc3b(void){ std::cout << "proc 3b" << std::endl; } void proc3c(void){ std::cout << "proc 3c" << std::endl; } int main(int argc, char* argv[]){ CMenu menu; menu.AddMenu("OPCION 1", proc1); menu.AddSubMenu("OPCION1A", proc1a, 1); //submenu de la opcion 1 menu.AddSubMenu("OPCION1B", proc1b, 1); menu.AddMenu("OPCION 2", proc2); menu.AddMenu("OPCION 3", NULL); //opcion 3 separador, no tendria funcion menu.AddSubMenu("OPCION3A", proc3a, 3); //submenu de la opcion 3 menu.AddSubMenu("OPCION3B", proc3b, 3); menu.AddSubMenu("OPCION3C", proc3c, 3); menu.PrintMenu(); menu.DoMenu(); return 0; }
El resultado es algo asi: 1: OPCION 1 11: OPCION1A 12: OPCION1B 2: OPCION 2 3: OPCION 3 31: OPCION3A 32: OPCION3B 33: OPCION3C 0: SALIR Eliga una Opcion:
Por ejemplo si se elige la opcion 11, se llamará a proc1a(), y esto se repite hasta que se elija salir. El problema es, el puntero a funcion como parametro lo tengo defenido asi: typedef void(*callback_proc_)(void); inline void CMenu::AddMenu(const char* cap, callback_proc_ proc){
Con esta estructura, estoy forzando que el procedimiento que esta asociado al item del menu es "void name(void)" Como se podría hacer para poder pasar como parametro a AddMenu() una funcion con numero y tipo de parametros desconocido? Saludos Y gracias
|
|
|
5
|
Programación / ASM / IDE EasyCode MASM
|
en: 24 Diciembre 2011, 15:08 pm
|
Hola. navegando por ahí me tope de pura casualidad con esta IDE: Tiene version en español e inglés. http://www.easycode.cat/Spanish/index.htmtrae: Editor de recursos Code Snipets/Tooltips/Completition Crea una lista de Variables y Funciones. Y el entorno es mucho mas amistoso que radAsm. No requiere ninguna configuracion extra, solamente tener el paquete de masm instalado en algun lugar. Saludos.
|
|
|
7
|
Programación / ASM / [Codigo] Pequeño Servidor HTTP
|
en: 3 Diciembre 2011, 22:29 pm
|
;modificar szRoot para indicar la ubicacion del servidor, default C:\Server ;msvcrt no viene en el paquete de fasm, la crean con la utilidad dll2inc ;o hacen los include a mano^^ format PE Console entry start include '%fasminc%/win32a.inc' include '%fasminc%/macro/if.inc' MAX_QUEUE equ 100 ;max namber of pending connections BUFFER_SIZE equ 2048 ;max size of the header sent by the client MAX_URL_SIZE equ 1024 ;max size of url in the header send SHOW_DETAILED_MSG equ TRUE ;set TRUE if want to see the full client message section '.data' data readable writeable wsa WSADATA port dd 80 szPause db "PAUSE",0 h404 db "HTTP/1.1 404 Not Found",13,10,"Server: EnkoHttpServer 1.0.0.0 ",13,10,13,10,"<HTML><BODY>404 Not Found</BODY></HTML>",13,10 .size = $ - h404 h200 db "HTTP/1.1 200 OK",13,10,"Server: EnkoHttpServer 1.0.0.0 ",13,10,"Allow: GET",13,10,13,10 .size = $ - h200 szRoot db "C:\Server",0 szSlashes db '/\',0 szSlash db '\',0 szTockens db " ",13,10,0 szError db "ERROR: %i",13,10,0 szDot db ".",0 szFileNotExists db "File Not Exists",13,10,0 szInt db "%i",0 szFile db "FILE: %s",13,10,0 szClient db "Client IP: %s",13,10,0 szRequest db "REQUEST: %s",13,10,0 szStatus db "STATUS: %s",13,10,0 szString db "%s",0 szEndLine db 13,10,0 .size = $ - szEndLine szBr db "<br>",0 szIndex db "index.html",0 szFileSent db "File Sent ok",13,10,0 .size = $ - szBr wSocketVersion dd 0x0101 transmiteBuffer dd h200,h200.size,NULL,NULL thread dd ? peer dd ? peerAddr sockaddr_in sizePeerAddr dd sizeof.sockaddr_in sock dd ? sock_addr sockaddr_in szBuffer db 32 dup ? szIp db 16 dup ? section '.code' code readable executable start: ;inicializacion socket invoke WSAStartup, [wSocketVersion], wsa invoke socket,AF_INET,SOCK_STREAM,NULL mov [sock],eax mov [sock_addr.sin_family], AF_INET invoke htons,[port] mov [sock_addr.sin_port],ax mov [sock_addr.sin_addr],NULL invoke bind, [sock], sock_addr,sizeof.sockaddr_in .if eax <> 0 invoke WSAGetLastError cinvoke printf, szError, eax .endif invoke listen, [sock],MAX_QUEUE ;activamos la escucha del socket accepted: invoke accept, [sock],peerAddr,sizePeerAddr mov [peer],eax stdcall ipToString,[peerAddr.sin_addr],szIp cinvoke printf, szClient,szIp ;nuevo hilo para cada conexion invoke CreateThread, NULL,NULL, resolveConnection,[peer],NULL,NULL ;o mejor la funcion de abajo, ayudaria a la estabilidad y contra ataques DOS ;invoke QueueUserWorkItem, resolveConnection, [peer], NULL ;WT_EXECUTEDEFAUL jmp accepted invoke ExitProcess,0 ;hilo que resuelve las peticiones proc resolveConnection, lpParam local lpeer: DWORD, lbuffer: DWORD, lurl: DWORD, lfile: DWORD mov eax, [lpParam] Dermatoesqueleto mov [lpeer],eax cinvoke malloc, BUFFER_SIZE mov [lbuffer],eax invoke recv, [lpeer],[lbuffer],BUFFER_SIZE,0 ;vemos si hay un mensaje en el buffer y continuamos .if eax <> 0 mov ebx,[lbuffer] mov byte [ebx+eax],0 .if SHOW_DETAILED_MSG cinvoke printf,szRequest, [lbuffer] .endif cinvoke strtok, [lbuffer], szTockens .if eax <> 0 ;solamente respondemos al mensaje GET .if dword[eax] = "GET" ;url sring allocation ;buscamos la url en la peticion GET ;solamente las peticiones que terminan con alguna extensión cinvoke malloc, MAX_URL_SIZE mov [lurl],eax cinvoke strcpy, [lurl],szRoot cinvoke strtok, NULL, szTockens cinvoke strcat,[lurl],eax mov ebx,eax cinvoke strlen, eax mov edx,eax dec edx .repeat dec eax cmp byte[ebx+eax],"/" .if ZERO? mov byte[ebx+eax],"\" .endif .until eax = 0 .if byte[ebx+edx] = "\" cinvoke strcat,[lurl],szIndex .endif cinvoke printf, szFile, [lurl] ;ya tenemos el nombre del archivo, ahora lo abrimos desde el disco invoke CreateFile,[lurl],GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,0 ;si el archivo existe, lo enviamos .if eax <> INVALID_HANDLE_VALUE mov [lfile],eax invoke GetFileSize, [lfile],NULL invoke TransmitFile, [lpeer],[lfile],eax,NULL,NULL,transmiteBuffer,NULL .if eax ;escribimos en la consola el detalle cinvoke printf, szStatus, szFileSent .endif invoke CloseHandle, [lfile] .else ;no existe el archivo, error 404 cinvoke printf, szStatus, szFileNotExists invoke send, [lpeer], h404, h404.size, 0 .endif cinvoke free, [lurl] .endif .endif .endif .exit: cinvoke free, [lbuffer] invoke CloseHandle, [lpeer] invoke ExitThread ret endp ;convertimos DWORD ip a una cadena proc ipToString, ip, string local buffer: DWORD mov ebx, [ip] mov esi,4 mov eax,[string] mov byte [eax],0 .repeat xor eax,eax mov al,bl cinvoke sprintf,[buffer],szInt,eax cinvoke strcat,[string],[buffer] cinvoke strcat,[string],szDot shr ebx,8 dec esi .until esi=0 cinvoke strlen, [string] mov ebx, [string] mov byte[ebx+eax-1],0 mov byte[buffer],0 ret endp section '.idata' import data readable writeable library kernel32,'KERNEL32.DLL',\ user32,'USER32.DLL',\ msvcrt,'msvcrt.dll',\ wsock32, 'WSOCK32.DLL' include '%fasminc%\api\kernel32.inc' include '%fasminc%\api\user32.inc' include '%fasminc%\api\msvcrt.inc' include '%fasminc%\api\wsock32.inc'
El codigo funciona bastante bien. Si la url es complicada es probable que no la pueda resolver. En canto a saturacion o DDOS, sumamente susceptible. Screenshot http://i41.tinypic.com/5lxyfk.pnghay una duda que tengo: Si se usa CreateThreade es necesario usar ExitThread... hasta ahi bien. Ahora, si se usa QueueUserWorkItem, ¿Hace falta? en la msdn no especifica, hice la prueba y aparentemente no. Ya que si se usa, en una prueba rapida se nota que deja de funcionar la segunda vez que se llama. Saludos.
|
|
|
8
|
Programación / ASM / masm, msvcrt.
|
en: 1 Diciembre 2011, 16:53 pm
|
Hola, pense que era mi compu que tenia algun conflicto con visual studio o algo, pero no. Instalacion nueva del paquete de http://www.masm32.com/.386 .model flat, stdcall option casemap :none ; case sensitive include C:\masm32\include\windows.inc include C:\masm32\include\kernel32.inc include C:\masm32\include\user32.inc include C:\masm32\include\msvcrt.inc includelib C:\masm32\lib\kernel32.lib includelib C:\masm32\lib\msvcrt.lib includelib C:\masm32\lib\user32.lib .code szPause db 'pause',0 szFmt db '%s',0 charsWritten dd 0 start: invoke AllocConsole invoke GetStdHandle, STD_OUTPUT_HANDLE invoke WriteConsole, eax, offset szPause, 5, offset charsWritten,NULL invoke crt_printf,offset szFmt, offset szPause invoke crt_system, offset szPause invoke ExitProcess, 0 ret end start
El resultado deberia de ser "pausepausePresione una tecla para continuar..." Sin embargo, crt_printf no imprime la cadena, si devuelve 5 que son los caracteres que escribio. Es decir esta "imprimiendo el texto" pero no se imprime en la pantalla. 1) Alguna idea de porque no imprime con printf? Con o sin AllocConsole el resultado es el mismo. aunque printf se tendria que encargar solo de alojar una consola si no esta creada. Saludos.
|
|
|
9
|
Programación / Ingeniería Inversa / Crackme 05 consola obfuscado
|
en: 23 Octubre 2011, 12:29 pm
|
Para aquellos que les guste nopear saltos A ver quien encuentra el salto correcto!!! Objetivo: Hacer un parche para ver mensaje de "buen chico" o bien, encontrar clave valida. (no vale invertir cadenas de los mensajes) Detalle: *)El crackme no esta empaquetada *)El crackme esta sumamente obfuscado *)La validacion es sumamente sencilla *)Esta en modo consola, al arrancar ingresen el serial, boton enter y rezar ^^ Dificultad: Ni idea, depende en lo que se tarde en resolver, ya me lo comentaran. Vale tanto parche como encontrar el serial valido. http://www.mediafire.com/?x0m3r29wv99xx5jhttp://www.megaupload.com/?d=WPS6NGIN
|
|
|
10
|
Programación / Ingeniería Inversa / keygenme4 console
|
en: 20 Octubre 2011, 20:43 pm
|
Hola, como vi que se han quedado sin apps para resolver, hice uno mas. Objetivo: realizar un keygen pueden postear aqui user y serial valido. Bonus: la contraseña del codigo fuente es la suma de serials de estos usuarios: ABCD, EFGH, IJKL (sin las comas, simplemente los 3 serials juntos) Parche: no vale patch, en realidad, si abren la ejecutable en olly, esta señalado donde hacer el patch, asi que no presenta gran desafio. Dificultad: no tan facil,l no tan dificil. Yo he tardado una hora en generar la rutina que me diera serials validos. (y eso que yo hice la rutina para comprobar la validez) Formato: user son 4 caracteres ascii cualquiera. serial son 8 caracteres hexadecimales, un numero de 32bit rempresentado en ascii. La generacion tiene dos trucos, analicen el codigo bien ^^ Cualquier duda es bienvenida le dejo los links y mirrors http://www.mediafire.com/?2cl5c7vplrkvwvzhttp://www.megaupload.com/?d=1CIXGZCR
|
|
|
|
|
|
|