逆向工程核心原理——学习笔记_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

从右向左将参数压入栈,然后调用函数。 

    

posted @ 2017-11-09 16:35  ha2  阅读(670)  评论(0编辑  收藏  举报