At start, the window procedure compares its uMsg parameter to 1
(WM_CREATE).. We emulate Windows in our minds now, so we follow the
WM_CREATE code. We see the crackme uses an API, RegisterWindowMessage,
to create a new message, and stores it in virtual address 0x403014,
then continues with the regular WndProc stuff.
Wandering around the crackme, we arrive an interesting code section. In
this section, the crackme processes the new message it created (Virtual
address 0x40116C). We see it calls GlobalGetAtomName, with parameters
of wParam and a buffer, and a maximum length of 16 bytes. Then it compares
the buffer to the string "I Am Registered", notice this comparison is
case insensitive. If the string matches, we are registered, and solved this
crackme.
Now we need to write some kind of programme that will:
a) Initialize a global atom called "I Am Registered"
b) Get the special message value from the crackme's memory
c) Send this message to the crackme, with wParam set to the atom value
From here it's trivial to write such a programme.
P.S. : For you guys who wonder what those APIs mean, read about them
in MSDN.