WARNING: Wiki content is an archive, no promise about quality!
Please choose a tutorial page:
- Fundamentals -- Information about C
- Tools
- Registers
- Simple Instructions
- Example 1 -- SC CDKey Initial Verification
- Example 2 -- SC CDKey Shuffle
- Example 2b -- SC CDKey Final Decode
- The Stack
- Functions
- Example 3 -- Storm.dll SStrChr
- Assembly Summary
- Machine Code
- Example 4 -- Smashing the Stack
- Cracking a Game
- Example 5 -- Cracking a game
- Example 6 -- Writing a keygen
- .dll Injection and Patching
- Memory Searching
- Example 7 -- Writing a cheat for Starcraft (1.05)
- Example 7 Step 1 -- Displaying Messages
- Example 7 Step 1b -- Above, w/ func ptrs
- Example 7 Final
- Example 8 -- Getting IX86.dll files
- 16-bit Assembly
- Example 9 -- Keygen for a 16-bit game
- Example 10 -- Writing a loader
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;
}