本次学习所用案例为abexcm1.exe,如果有需要可以在社区搜索即可。具体叙述学习过程。
abexcm1.exe是用汇编写出的程序,所以汇编代码非常简洁,开头就能见到函数功能。
观察以下代码:
00401000 >/$ 6A 00 | PUSH 0 | ; /Style = MB_OK|MB_APPLMODAL
00401002 |. 68 00204000| PUSH abexcm1.00402000 | ; |Title = "abex' 1st crackme"
00401007 |. 68 12204000 | PUSH abexcm1.00402012 | ; |Text = "Make me think your HD is a CD-Rom."
0040100C |. 6A 00 |PUSH 0 |; |hOwner = NULL
0040100E |. E8 4E000000| CALL <JMP.&USER32.MessageBoxA> |; \MessageBoxA
为阅读方便。代码块中用“|”进行分割,以表示三列。前一二列混在一起,表示地址块和16进制块。
类似PUSH块表示的是汇编代码块,最后一列表示注释块。分析如下:将0,402000地址,402012地址压入栈中,后调用messagebox函数,转换成C语言就写成以下形式:
MessageBox(NULL,"Make me think your HD is a CD-Rom","'abex'1stcrackme",MB_OK|MB_APPLMODAL);
可知,函数调用参数的顺序和参数入栈的顺序相反。