|
21
|
Programación / Java / como obtengo la direccion completa de un archivo?
|
en: 27 Agosto 2013, 03:20 am
|
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 private void doOpen(){ open.setVisible(true); String fname = open. getDirectory(); }
pero no encuentro alguna funcion que haga lo que necesito, espero alguien sepa como obtener el path completo de un archivo salu2
|
|
|
22
|
Programación / ASM / se compila el socket sin errores pero no se conecta, ayuda
|
en: 10 Agosto 2013, 19:38 pm
|
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 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
|
Programación / ASM / no logro invocar a getprocaddress en masm 64 bits
|
en: 6 Agosto 2013, 03:30 am
|
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 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 mov rcx, offset[WStp] mov rdx, [wsaddr] call GetProcAddress mov[wtaddr], rax
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
|
Programación / ASM / problema con masm para 64bits
|
en: 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 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 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
|
Programación / ASM / no entiendo un error debido a la sección data
|
en: 24 Julio 2013, 03:16 am
|
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 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 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 saveWSA: dd '0xFFFFFFFF' soc: db 'socket',0 soadd: dd '0xFFFFFFFF'
ya no funciona 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
|
Programación / Programación C/C++ / porque no funciona send() y recv()?
|
en: 21 Julio 2013, 02:50 am
|
hola estaba haciendo un socket sencillo e windows y se conecta bien pero cuando uso send() y recv() no me aparece nada , 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){ } if(listen(sock, 1) == -1){ } co = sizeof(struct sockaddr); if((accept(sock, (struct sockaddr*)&cl, &co)) == -1){ accept(sock, (struct sockaddr*)&cl, &co); } recv(sock, buff, sizeof(buff), 0); 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){ } cli.sin_family = AF_INET; cli.sin_port = htons(8889); cli.sin_addr = *((struct in_addr*)he->h_addr); connect(fd, (struct sockaddr*)&cli, sizeof(struct sockaddr)); send (fd , buff , strlen(buff ), 0); return 0; }
|
|
|
27
|
Programación / ASM / logre un socket en nasm jeje
|
en: 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 [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
|
Programación / ASM / como usar estructuras en nasm?
|
en: 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
|
Programación / ASM / que error le encuentran a este codigo en nasm?
|
en: 14 Julio 2013, 02:21 am
|
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
|
Programación / ASM / error usando linux 64bits en codigo de nasm
|
en: 14 Julio 2013, 02:10 am
|
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
|
|
|
|
|
|
|