Stack Example

From SkullSecurity
Revision as of 18:34, 13 March 2007 by 207.34.103.194 (talk)
Jump to navigation Jump to search

This code should compile and run in Visual Studio (I've tested it):

#include <stdio.h>

void __declspec(naked) swap(int *a, int *b)
{
	__asm
	{
		push ebp      ; Preserve ebp.
		mov ebp, esp  ; Set up the frame pointer.
		sub esp, 8    ; Make room for two local variables.
		push esi      ; Preserve esi on the stack.
		push edi      ; Preserve edi on the stack.

		mov ecx, [ebp+8]   ; Put the first parameter (a pointer) into ecx.
		mov edx, [ebp+12]  ; Put the second parameter (a pointer) into edx.

		mov esi, [ecx] ; Dereference the pointer to get the first parameter.
		mov edi, [edx] ; Dereference the pointer to get the second parameter.

		mov [ebp-4], esi ; Store the first as a local variable
		mov [ebp-8], edi ; Store the second as a local variable
		
		mov esi, [ebp-8] ; Retrieve them in reverse
		mov edi, [ebp-4]

		mov [ecx], esi ; Put the second value into the first address.
		mov [edx], edi ; Put the first value into the second address.
		
		pop edi        ; Restore the edi register
		pop esi        ; Restore the esi register
		add esp, 8     ; Remove the local variables from the stack
		pop ebp        ; Restore ebp
		ret            ; Return (eax isn't set, so there's no return value)
	}
}

int main(int argc, char* argv[])
{
	int a = 3; 
	int b = 4;

	printf("a = %d, b = %d\n", a, b);
	swap(&a, &b);
	printf("a = %d, b = %d\n", a, b);

	while(1)
		;

	return 0;
}