Autor
		 | 
		
			Tema: Como usar la pila.  (Leído 6,872 veces)
		 | 
	 
 
	
		
			
				
					
						
							TheEnmanuelRmrz
							
								
								  Desconectado
								Mensajes: 28
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Saludos. Hace poco me llamo la atención el assembler, hace tiempo que vengo programando pero lenguajes de alto nivel y orientados a objetos. Cuando comencé a programar en este lenguaje, chocaron muchos conceptos que tenía. Pero aún así comprendí la mayoría. Aprendí a programar con MASM32 lo que me llevo a utilizar múltiples macros y otras emulaciones que tiene de alto nivel como los .if .else o declarar los procedimientos y utilizar los parámetros directamente. Ejemplo: FuncNada proc param1:DWORD, param2:DWORD     mov eax,param2     add eax,param1     ret FuncNada endp   
 
 Me pareció excelente en el momento, pero luego de tomar un poco más de experiencia me di cuenta que no sabía que código se estaba generando y que así era una pérdida de tiempo aprender ese lenguaje. Me propuse estudiarlo a fondo a bajo nivel de verdad, entendí muchos conceptos, pero lo que aun no he terminado de entender es el manejo de la pila, si ustedes pudieran resolver mis dudas me ayudarían. Y también sobre el direccionamiento indirecto, se como se direcciona pero siempre que trato de hacerlo el programa crashea. Necesito un ejemplo práctico porque siempre ponen:  mov eax,byte ptr [ebp+ebx*2+4] ;ejemplo si entiendo lo de byte ptr pero si luego trato de acceder a esa posición de memoria no puedo, y yo creí que a partir del 386 se podían direccionar 4gb de memoria. Y sobre la pila me gustaría ver como se obtienen las variables, como se reserva espacio y como se manejan estructuras(sin identificador) osea no: lea eax,structura push eax sino acceder a posiciones de memoria en donde se encuentre cada elemento. Cualquier ayuda se los agradecería de antemano. Y Sobretodo agradecería con ejemplos prácticos. Gracias. Disculpen soy nuevo y publique el tema donde no era, si alguien me ayudara a moverlo de sitio se los agradecería.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Última modificación: 18 Octubre 2014, 09:08 am por theenmanuelrmrz »
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							xv0
							
								       
								
								  Desconectado
								Mensajes: 1.032
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
Y también sobre el direccionamiento indirecto, se como se direcciona pero siempre que trato de hacerlo el programa crashea. Necesito un ejemplo práctico porque siempre ponen:  mov eax,byte ptr [ebp+ebx*2+4] ;ejemplo si entiendo lo de byte ptr
  pero si luego trato de acceder a esa posición de memoria no puedo, y yo creí que a partir del 386 se podían direccionar 4gb de memoria.
  Vale, estas calculando una direccion compleja, podrias decir los valores de  ebp,  ebx, simplemente es para saber donde esta apuntando el offset que generas. Que tengas 4GB de memoria, no significa que puedas acceder por completo a esta, algunas direcciones estan protegidas contra escritura y lectura, depende del modo en el que estes  CPL, Ring 0-3 no se si te sonara esto, pues depende de los privilegios que tengas no podras acceder a determinado offset.  Si quieres tener el control de todo, por asi decirlo tendrias que estas en Ring 0, pero como estas empezando con esto, olvidate de momento. Tambien ayudaria mucho que dijeras que clase de error que esta dando. Y sobre la pila me gustaría ver como se obtienen las variables, como se reserva espacio y como se manejan estructuras(sin identificador) osea no: lea eax,structura push eax
  sino acceder a posiciones de memoria en donde se encuentre cada elemento. ASM en un lenjuage de programacion "libre", me refiero a que puedes hacer muchas cosas de diferentes maneras, no hay una forma establecida. Algunas de las iintrucciones que van ligadas con el stack son estas: enter, leave, push, pop... Pero tambien puedes usar add o sub para reservar o privar la pila, y puedes hacerlo de mil formas mas por asi decirlo. Sobre las variables te invito que busques informacion, eso ya esta mas que hablado, pero yo usaria fastcall, lo de cargar los parametros en el stack esta algo pasado, pero ojo fastcall tiene un numero limitado de parametros si quieres pasar mas tendras que usar la pila. Y sobre las estructuras, supongo que quieres saber como se crea una a mano durante la ejecucion del code no? Si quieres dime alguna estructura y te dejo el ejemplo. Y sobre acceder a sus elemento todo depende de que posicion este. Un saludo.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Última modificación: 19 Octubre 2014, 03:16 am por cpu2 »
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							TheEnmanuelRmrz
							
								
								  Desconectado
								Mensajes: 28
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Saludos gracias por contestar. Lo del ring 0-3 si lo entiendo. Mira te pondré un ejemplo y sería de mucha ayuda si me lo explicaras pondré las dudas al lado de lo que entiendo. El ejemplo lo saque del paquete de MASM32 y se puede ensamblar tanto en POASM como en MASM también. Todo lo que hace lo se hacer con variables y eso, pero me gustaría mucho comprender este por completo. Ha no le hagas caso a la declaración de los datos en un solo segmento es solo un ejemplo de como gastar 1kb   ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««   comment * -------------------------------------------------------------     This example is written in pure Intel mnemonics to demonstrate that     Pelle's Macro Assembler can build code at the lowest level possible            Build this example from the PROJECT menu with MAKEIT.BAT       ----------------------------------------------------------------- *       .486     .model flat, stdcall      ; 32 bit memory model     option casemap :none      ; case sensitive       include poasm1k.inc       ; local includes for this file     .code     szClassName db "POASM 1k", 0     start:   ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««       push ebp                                ; Entiendo que mete ebp en la pila, pero si te fijas al final nunca lo saca 											;a menos que leave lo haga , pero no lo se     mov ebp, esp							       sub esp, 96                             ; Aqui no entiendo porque reserva 96 bytes, sume la estructura 											;mas los 4 argumentos DWORD de WndProc y da son 76       xor edi, edi     mov esi, 400000h                        ; use constant for the hInstance 											;No entiendo porque usa una constante y no obtiene el manipulador 											;de instancia. Tampoco pense que funcionara así(Ya eso es de la api, esta fuera de tema).       mov ebx, OFFSET szClassName				;Quien no entende esto :D       push IDC_ARROW     push edi     call LoadCursor							;Entiendo las rutinas de llamada     ; -----------------------------------   ; manually coded WNDCLASSEX structure     ;No es hermosa esta parte del código   ; -----------------------------------		;casi poesía *.* xD     ;Esta parte mas o menos la entiendo     mov DWORD PTR [ebp-96], 48				;Le asigna a esa pos de memoria el tamaño de la estructura     mov DWORD PTR [ebp-92], CS_VREDRAW or CS_HREDRAW ;De aqui hacia abajo va llenando la estructura     mov DWORD PTR [ebp-88], OFFSET MyWndProc     mov DWORD PTR [ebp-84], edi     mov DWORD PTR [ebp-80], edi     mov DWORD PTR [ebp-76], esi     mov DWORD PTR [ebp-72], edi     mov DWORD PTR [ebp-68], eax     mov DWORD PTR [ebp-64], COLOR_BTNFACE+1     mov DWORD PTR [ebp-60], edi     mov DWORD PTR [ebp-56], ebx     mov DWORD PTR [ebp-52], edi       lea eax, [ebp-96]	;Mueve a eax la dirección de la estructura     push eax     call RegisterClassEx                    ; register the window class       mov ecx, CW_USEDEFAULT       push edi     push esi     push edi     push edi     push edi     push ecx     push edi     push ecx     push WS_OVERLAPPEDWINDOW     push ebx     push ebx     push edi     call CreateWindowEx                     ; create the main window       push SW_SHOWNORMAL     push eax     call ShowWindow                         ; display it       lea ebx, [ebp-48]                       ; Carga en ebx la dirección de inicio 											;de la estructura MSG       jmp jmpin     StartLoop:     push ebx     call DispatchMessage   jmpin:     push edi     push edi     push edi     push ebx     call GetMessage                         ; process messages until                                             ; GetMessage returns zero     test al, al     jnz StartLoop       leave                                   ; exit the stack frame     retn                                    ; make a NEAR return   ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««   MyWndProc:       push ebp                                ; Otra vez lo mismo con ebp desde el principio     mov ebp, esp							; No entiendo como esp apunta a la dirección de las variables pasadas al WndProc       cmp DWORD PTR [ebp+12], WM_DESTROY     jne @F       push NULL       call PostQuitMessage     @@:       push DWORD PTR [ebp+20]     push DWORD PTR [ebp+16]     push DWORD PTR [ebp+12]     push DWORD PTR [ebp+8]					;Aqui no entiendo porque hWnd apunta deste 8, que hay de primero entonces 											;No debería apuntar desde el byte 0 											;Ha y no entiendo porque aqui es ebp+direccion y arriba es ebp-direccion     call DefWindowProc       leave                                   ; exit the stack frame     ret 16                                  ; balance stack on exit   ; «««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««««   end start   
 
 Eso más que todo es las partes que no entiendo agradezco tu ayuda.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						| 
							MCKSys Argentina
							
						 | 
						
							
							 
							
Hola! Probaste compilar el ejecutable y mirarlo con un debugger? Así te auto-responderías muchas cosas...    Saludos!  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							MCKSys Argentina "Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando." 
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							xv0
							
								       
								
								  Desconectado
								Mensajes: 1.032
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
Ya veo que se trata de Win y la sintaxis de Intel, yo soy todo lo contrario Unix y AT&T sintaxis. push ebp mov ebp, esp sub esp, 96  
 
 Si lo extrae al final, como dijiste esa es la funcion de  leave, restaurar esp y ebp. Bien se decremeta el stack en 4 se guarda el valor de ebp, luego se el offset de esp a ebp y se substrae esp en 96 bytes. Si te das cuenta se deja ebp (arriba "base"), y esp apuntando abajo donde sigue este.  Bien sobre lo de reservar 96 bytes, yo tampoco le veo, en la funcion  start solamente se usan 72 bytes lo de las estructuras  WNDCLASSEX y  MSG nada mas, ya que en su ejecucion no llama a  MyWndProc y al finalizar restaura el stack. push DWORD PTR [ebp+20] push DWORD PTR [ebp+16] push DWORD PTR [ebp+12] push DWORD PTR [ebp+8]                     ;Aqui no entiendo porque hWnd apunta deste 8, que hay de primero  entonces                                            ;No deberia apuntar desde el byte 0                                            ;Ha y no entiendo porque aqui es ebp+direccion y arriba es ebp-direccion call DefWindowProc 
 
 Mejor que leas esto: http://www.unixwiz.net/techtips/win32-callconv-asm.html Mirate los diagramas. Pero una cosa cuando se llama a  MyWndProc? No sera una funcion aparte? Un saludo.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							TheEnmanuelRmrz
							
								
								  Desconectado
								Mensajes: 28
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Ya lo leere gracias. Ha y en cuanto a MyWndProc jamas se invoca asi lo pases como proc o como etiqueta de eso se encarga la api de windows. Ves aqui se le pasa a la estructura WNDCLASSEX   mov DWORD PTR [ebp-96], 48     mov DWORD PTR [ebp-92], CS_VREDRAW or CS_HREDRAW     mov DWORD PTR [ebp-88], OFFSET MyWndProc    ;Justo aqui se le pasa la dirección     mov DWORD PTR [ebp-84], edi     mov DWORD PTR [ebp-80], edi     mov DWORD PTR [ebp-76], esi     mov DWORD PTR [ebp-72], edi     mov DWORD PTR [ebp-68], eax     mov DWORD PTR [ebp-64], COLOR_BTNFACE+1     mov DWORD PTR [ebp-60], edi     mov DWORD PTR [ebp-56], ebx     mov DWORD PTR [ebp-52], edi 
 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							xv0
							
								       
								
								  Desconectado
								Mensajes: 1.032
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
No la vi...
  Se supone que MyWndProc es llamada cuando se ejecuta RegisterClassEx?
  Un saludo.
  P.D: Increible la API de Windows, cada vez me gusta menos... 
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							TheEnmanuelRmrz
							
								
								  Desconectado
								Mensajes: 28
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Lol Gracias por el link. Ahora si lo entendí a la perfección. Y ya se porque hWnd esta a partir del byte 8. Es porque del 4 al 8 esta el valor antiguo de  ebp y del 0 al 4 esta el valor de retorno que fue empujado por call. Gracias de veras.           Ha y si, no se quien cojones llama a MyWndProc. Lo que se es que una le pasa la dirección a RegisterClassEx, y cuando uno registra la ventana pasa el nombre de la clase que registro. Y windows se encarga de que cada vez que pasa un evento el llama a la función y le pasa los parámetros. Y si así es, ni con ASM puedes tener mucho control sobre la interfaz de windows. Solo te limitas a lo que te proveen las funciones.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Última modificación: 19 Octubre 2014, 11:32 am por theenmanuelrmrz »
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							xv0
							
								       
								
								  Desconectado
								Mensajes: 1.032
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
De nada hombre, sabia que ese link te ayudaria mejor que mis propias palabras. Y sobre la API desde mi punto de vista sin comentarios... No estoy acostumbrado a esa clase de programacion. Y como dijiste control ninguno. Yo estoy acostumbrado a ASM como este: http://foro.elhacker.net/criptografia/aes_128_bits_encrypt_asm_bit_slice-t414536.0.html Es uno de mis codes. Un saludo.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							TheEnmanuelRmrz
							
								
								  Desconectado
								Mensajes: 28
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
Guao esta bueno el code. Jamas había visto un algoritmo de cifrado en asm. Antes le daba a eso pero cuando programaba en VB6. jejeje si de ahí saque la idea de que podía direccionar la memoria que quisiera, ese lenguaje mata el alma y al envenena   Y ganas más puntos porque esta en AT&T xD No me gusta esa sintaxis, solo la uso cuando meto asm inline en C++ como utilizo el compilador de GNU. Saludos.  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	 |  
 
	 
	
 
			 
			
				
					
						| Mensajes similares | 
					 
					
						 | 
						Asunto | 
						Iniciado por | 
						Respuestas | 
						Vistas | 
						Último mensaje | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							duda de cómo se introducen cadenas en la pila (manualmente).
							« 1 2 3 » 
							Análisis y Diseño de Malware
						 | 
						
							black_flowers
						 | 
						
							25
						 | 
						
							15,009
						 | 
						
							 
							
								 4 Abril 2011, 10:39 am 
								por black_flowers
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Como se representa un array en la pila
							 
							ASM
						 | 
						
							leucocito
						 | 
						
							5
						 | 
						
							6,898
						 | 
						
							 
							
								22 Mayo 2011, 13:21 pm 
								por leucocito
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							saben como usar usar el windows live messenger 2009 en win 8
							 
							Mensajería
						 | 
						
							dannyphantom
						 | 
						
							1
						 | 
						
							3,861
						 | 
						
							 
							
								25 Diciembre 2012, 22:07 pm 
								por Songoku
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Re: Como usar la pila.
							 
							Análisis y Diseño de Malware
						 | 
						
							TheEnmanuelRmrz
						 | 
						
							0
						 | 
						
							2,462
						 | 
						
							 
							
								19 Octubre 2014, 06:08 am 
								por TheEnmanuelRmrz
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							¿Cómo funciona la pila con respecto a las funciones?
							 
							ASM
						 | 
						
							GGZ
						 | 
						
							5
						 | 
						
							5,398
						 | 
						
							 
							
								31 Octubre 2016, 01:59 am 
								por GGZ
							
						 | 
					 
				 
			    |