写在前面的话:在下完全就是一个新手,现在目前在学16位汇编,偶尔用OD调试看看程序,主要就是为了学习,今天写这个帖子,完全就是笔记用,然后拿出来和大家一起讨论交流。

因为刚开始接触,文章可能一些地方有错误,如果有错误的地方还请指出来,毕竟刚学,确实差的十万八千里。而且这个程序也很简单,主要还是为了做记录。

网上找了个abexcm1,然后进行调试。

我个人的习惯,当首先拿到 程序的时候,我都会按F8直接把程序走一遍,看看大概的流程。

这个程序的功能很简单,匹配C:\驱动器的属性,如果成功,就弹出开OK,如果失败,就弹出来失败。两者均退出程序。

00401000 >/$  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL ;将数据入栈
00401002 |. 68 00204000 push 00402000 ; |Title = "abex' 1st crackme" 将数据入栈
00401007 |. 68 12204000 push 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 调用WIN API
00401013 |. 68 94204000 push 00402094 ; /RootPathName = "c:\" ;将00402094 数据入栈
00401018 |. E8 38000000 call <jmp.&KERNEL32.GetDriveTypeA> ; \GetDriveTypeA ; ; 调用WIN API
0040101D |. 46 inc esi ;esi +1 =1 eax = 03
0040101E |. 48 dec eax exc-1 = 02
0040101F |. EB 00 jmp short 00401021 ;垃圾指令
00401021 |> 46 inc esi esi = 2
00401022 |. 46 inc esi esi = 3
00401023 |. 48 dec eax eax-1 = 01
00401024 |. 3BC6 cmp eax, esi ; 比较值,如果值相等,JE条件跳转,如果不相等,继续走下去
00401026 |. 74 15 je short 0040103D ;值不相等,无法段内段转移,继续走下去
00401028 |. 6A 00 push 0 ; /Style = MB_OK|MB_APPLMODAL
0040102A |. 68 35204000 push 00402035 ; |Title = "Error"
0040102F |. 68 3B204000 push 0040203B ; |Text = "Nah... This is not a CD-ROM Drive!"
00401034 |. 6A 00 push 0 ; |hOwner = NULL
00401036 |. E8 26000000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA ;调用MESSAGEBOX弹出错误
0040103B |. EB 13 jmp short 00401050 ;t跳转
0040103D |> 6A 00 push 0 ; |/Style = MB_OK|MB_APPLMODAL ;调用成功的函数,
0040103F |. 68 5E204000 push 0040205E ; ||Title = "YEAH!"
00401044 |. 68 64204000 push 00402064 ; ||Text = "Ok, I really think that your HD is a CD-ROM! :p"
00401049 |. 6A 00 push 0 ; ||hOwner = NULL
0040104B |. E8 11000000 call <jmp.&USER32.MessageBoxA> ; |\MessageBoxA
00401050 \> E8 06000000 call <jmp.&KERNEL32.ExitProcess> ; \ExitProcess ;程序退出。

 从以上我们可以看出,程序2次弹出来了MESSAGEBOX,那如何来破解呢?、

我们知道,破解中最注意的应该就是跳转之前的比较指令,

0040101D  |.  46            inc     esi
0040101E |. 48 dec eax
0040101F |. EB 00 jmp short 00401021
00401021 |> 46 inc esi
00401022 |. 46 inc esi
00401023 |. 48 dec eax
00401024 |. 3BC6 cmp eax, esi
00401026 |. 74 15 je short 0040103D

以上可以看出,如果比较的值相等,就继续执行,如果不相等,就转到另外一个MESSAGEBOX函数出,直接调用API。

那我们可以直接让他相等就好了,或者直接JMP 无条件跳转到0040103D地址处调用成功的MESSAGEBOX API,就达到了破解的功能。

下面我们来跟踪每一次执行完以后的寄存器的变化。

寄存器相关的值:

EAX= 75E23358 ;一般用来存放临时数据
ECX= 00000000 ;ECX一般用来进行LOOP循环才会用到
EDX= 00401000 ;数据寄存器,
EBX= 7EFDE000 ;基址寄存器,常用来存放访问内在时的基地址
ESP= 0018FF8C ;栈顶指针,指向栈顶地址,在32为寄存器中,碰到PUSH的时候,SP = SP-4,pop的时候,POP = POP + 4
EBP= 0018FF94 ;是基址指针,段地址默认在SS中.可以定位物理地址
ESI= 00000000 ;源变址寄存器,默认段地址和DI一样,在DS中.和DS联用
EDI= 00000000 ;变址寄存器.可以和bx.bp联用
EIP= 00401000 ;EIP指向当前要执行的指令,每次EIP= EIP+执行指令的长度
//标志位没写

00401000 >/$  6A 00         push    0                                ; /Style = MB_OK|MB_APPLMODAL
00401002 |. 68 00204000 push 00402000 ; |Title = "abex' 1st crackme"
00401007 |. 68 12204000 push 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
00401013 |. 68 94204000 push 00402094 ; /RootPathName = "c:\"
00401018 |. E8 38000000 call <jmp.&KERNEL32.GetDriveTypeA> ; \GetDriveTypeA

  

当执行push    00402000,其实就是将 00402000 这个内存地址的数据压入桟。

我们来看00402000的数据

00402000  61 62 65 78 27 20 31 73 74 20 63 72 61 63 6B 6D  abex' 1st crackm

push    00402012 将 00402012 内存地址数据压入桟

00402012  4D 61 6B 65 20 6D 65 20 74 68 69 6E 6B 20 79 6F  Make me think yo
00402022 75 72 20 48 44 20 69 73 20 61 20 43 44 2D 52 6F ur HD is a CD-Ro
00402032 6D 2E

  

push    0

为空

call    <jmp.&USER32.MessageBoxA>  调用MESSAGEBOX API

  

在执行CALL <jmp.&USER32.MessageBoxA>,MessageBoxA 的内存地址在 00401061,直接 调用了API,弹出MESSAGEBOX

CALL API(也可以说是标号)。将执行2步操作:

1:PUSH IP
1:JMP NEAR PTR 标号

  

0040101D  |.  46            inc     esi
0040101E |. 48 dec eax
0040101F |. EB 00 jmp short 00401021 ;垃圾指令
00401021 |> 46 inc esi
00401022 |. 46 inc esi
00401023 |. 48 dec eax
00401024 |. 3BC6 cmp eax

  以上均是数据比较。

然后在进行条件跳转。

这次的分析就到这儿了,因为初学,难免错误,还请多多指点。各位勿喷。谢谢

新手学逆向,调试abexcm1过程的更多相关文章

  1. 新手学python(3):yield与序列化

    1 Yield生成器 Yield是我在其他语言中没有见过的一个属性,算是python的一大特色,用好之后可以使代码更简洁.考虑一个简单的例子,文件的遍历.要遍历一个目录下的所有文件需要递归的操作.如果 ...

  2. [ZZ]新手学 appium-合集第一季度

    原文地址: https://testerhome.com/topics/2599 新手学appium-合集第一季度地址如下: 1.新手学 appium-GUI 端搞起来:http://testerho ...

  3. 疑问:VS在调试的过程中,总是会提示正在加载picface.dll的符号,然后卡死在那

    环境: 硬件环境: PC 软件环境: Windows7 VS2012 MFC程序调试 现象: 调试的过程中,提示“正在从以下目录加载picface.dll的符号:C:\windows\dll”,然后就 ...

  4. 使用Android Studio调试UiAutomator过程中遇到的问题

    声明: 这里纪录了个人学习和使用Android Studio调试UiAutomator过程中遇到遇到的问题,不定时进行更新,欢迎一起交流学习 1.Excution faild for task ‘:a ...

  5. 新手学Java,有哪些入门知识点?

    很多小伙伴们在刚接触Java的时候,会有些迷茫,不知道该从哪里入手,不管是做前端还是后端,程序员都会用到JAVA,那该掌握哪些必要的基础知识呢.今天就跟大家分享新手学Java,有哪些入门知识点? 下面 ...

  6. 新手学cocos2dx,centos7下的安装过程

    背景 打算学写游戏,新手向,当然从cocos2d-x开始. 看了cocos的文档,安装是针对ubuntu的,这里记录下centos7上安装.编译.运行测试的过程. 如果你已经有ubuntu,不推荐看此 ...

  7. 跟羽夏学 Ghidra ——调试

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章 ...

  8. 开始学nodejs —— 调试篇

    新学习一种技术,肯定会遇到很多坑,我们需要找到这些坑,弄清楚这些坑出现的原因和其中的原理.这种操作就叫做调试. 程序调试的方法和工具多种多样,在这里我总结一下我在学习nodejs的过程中,学到的和用到 ...

  9. 新手学Android

    Eclipse平台下的新手Android学习记录. 1.打开一个本地的项目 在Project Explorer右键->Import->Existing Projects into Work ...

随机推荐

  1. cocos2d-x设计模式发掘之三:管理者模式

      作者 firedragonpzy    地址:http://www.firedragonpzy.com.cn/index.php/archives/2103 想必读者一看这个题目又要纳闷了,神马又 ...

  2. TFS二次开发-基线文件管理器(5)-源码文件的读取

      在上一节中,我们在保存标签之前,已经将勾选的文件路径保存到了Listbox中,这里只需要将保存的数据输出去为txt文档就可以做版本控制了.   版本文件比较复杂的是如何读取,也就是如何通过文件路径 ...

  3. C语言结构体数组内带字符数组初始化和赋值

    1.首先定义结构体数组: typedef struct BleAndTspRmtCmd{ char terminal[3]; char note[3]; char rmtCmd[10]; char c ...

  4. 运行scrapy保存图片,报错ValueError: Missing scheme in request url: h

    查阅相关资料,了解到使用ImagesPipeline传入的url地址必须是一个list,而我写的是一个字符串,所以报错,所以需要修改一下传入的url格式就行了 def parse_detail(sel ...

  5. 曾经跳过的坑----jQuery mouseover与mouseenter,mouseout与mouseleave的区别

    mouseover与mouseenter 不论鼠标指针穿过被选元素或其子元素,都会触发 mouseover 事件. 只有在鼠标指针穿过被选元素时,才会触发 mouseenter 事件. mouseou ...

  6. 分布式计算开源框架Hadoop入门实践(三)

    Hadoop基本流程 一个图片太大了,只好分割成为两部分.根据流程图来说一下具体一个任务执行的情况. 在分布式环境中客户端创建任务并提交. InputFormat做Map前的预处理,主要负责以下工作: ...

  7. LDAP注入

    理解LDAP与LDAP注入 0x01 LDAP简介 查阅了一些网上的资料,读了好久还是觉得理解起来很困难,感觉还是不够干,之后看到的一个博客http://www.chinaunix.net/old_j ...

  8. asp.net 下载图片

    public class DownLoad : IHttpHandler { public void ProcessRequest(HttpContext context) { context.Res ...

  9. openGL学习进程(1)OpenGL的简介

        通过本节,我们来简要了解一下openGL.     (1)OpenGL概述: openGL(Open Graphics Library)是个专业的图形程序接口,定义了一个跨编程语言.跨平台的编 ...

  10. JAVA中的Token 基于Token的身份验证

    最近在做项目开始,涉及到服务器与安卓之间的接口开发,在此开发过程中发现了安卓与一般浏览器不同,安卓在每次发送请求的时候并不会带上上一次请求的SessionId,导致服务器每次接收安卓发送的请求访问时都 ...