逆向工程核心原理——学习笔记_abex' crackme#1
0x1:
调试前运行此程序
单击确定
单击确定
程序退出
0x2:
开始调试,使用OD载入该程序
EP代码非常短,这是因为abex'crackme程序是使用汇编语言编写出来的可执行文件。
使用VC++ VC Delphi等开发工具编写程序时,除了自己编写的代码外,还有一部分启动函数是由编译器添加的,经过反编译后,代码看上去就变得非常复杂。但是如果直接使用汇编语言编写程序,汇编代码会直接变为反汇编代码。观察图中的代码可以看到,main()直接出先在EP中。
0x3:
分析代码
调用GetDriveType()函数
返回值(EAX)是3
https://msdn.microsoft.com/en-us/library/windows/desktop/aa364939(v=vs.85).aspx
(0040101f 处的jmp指令 为无意义跳转 )
cmp eax,esi
je short 0040103D
比较eax和es1
如果两值相等,则跳转到40103D
如果两值不相等,则从401028继续执行
在40103D地址为消息框输出代码
跳转(到40103D)失败
执行00401028 处的 MessageBoxA()函数
终止进程 CALL ExitProcess
0x4:
破解:将00401026地址处的代码修改为 JMP 0040103D
选中右键复制到可执行文件,把修改后的代码保存为文件
ps:
栈的结构是先进后出,所以把参数压入栈时,只有按照逆序的方式压入,函数才能以正确的顺序接收到这些函数
若有在C语言中调用一个函数: fun( a , b ,c)
则有 push c
push b
push a
call fun
从右向左将参数压入栈,然后调用函数。