调试学习【3】

在这里插入图片描述

关于寄存器

  • 寄存器就好比是CPU身上的口袋,方便CPU随时从里边拿出需要的东西来使用。现在这个程序中我们涉及到九个寄存器:
  • EAX:扩展累加寄存器
  • EBX:扩展基址寄存器
  • ECX:扩展计数寄存器
  • EDX:扩展数据寄存器
  • ESI:扩展来源寄存器
  • EDI:扩展目标寄存器
  • EBP:扩展基址指针寄存器
  • ESP:扩展堆栈指针寄存器
  • EIP:扩展指令指针寄存器
  • 这些寄存器的大小是32位(4个字节),他们可以容纳数据从0-FFFFFFFF(无符号数),除了以下三个寄存器,其他我们都可以随意使用:
  • EBP:主要是用于栈和堆栈
  • ESP:指向当前进程的栈空间地址

关于栈

  • 栈是在内存中的一部分,它有两个特殊的性质:
  • FILO(Fisrt In Last Out,先进后出)
  • 地址反向增长(栈底为大地址,栈顶为小地址)
    在这里插入图片描述

关于CALL指令

CALL XXX;等于 PUSH EIP;然后 JMP XXX;
call有以下几种方式:

  • call 40400h;直接跳到函数或过程的地址
  • call eax ;函数或过程地址存放在eax
  • call dword ptr [eax]
    在这里插入图片描述
  • call dword ptr [eax+5]

在这里插入图片描述

  • call dword ptr [<&API>];执行一个系统API

关于系统API

  • Windows应用程序运行在Ring3级别(包括OllyDBG)
    在这里插入图片描述
  • 但有时候需要Ring0级别才能进行操作
  • 我们可以通过系统为我们搭建的桥梁:API函数,我们也称之为系统提供给我们的接口。
  • 因为系统只信任自己提供的函数,所以我们要通过API才能实现内核的操作。
  • 假如我有一辆法拉利跑车,那么我需要通过踩油门来加速,要通过打方向盘来转弯…而油门,方向盘就是所谓的接口,对于法拉利来说,他们就是API函数。

关于mov指令

  • 这是一个很容易理解的指令,mov指令将src的内容拷贝到dest,mov指令总共有以下几种扩展:
  • 1、movs/movsb/movsw/movsd edi,esi:这些变体按串/字节/字/双字为单位将esi寄存器指向的数据复制到edi寄存器指向的空间。
  • 2、movsx符号位扩展,byte -> word, word -> dword(扩展后高位全用符号位填充),然后实现mov。
  • 3、movzx零扩展,byte -> word,word -> dword(扩展后高位全用.填充),然后实现mov。

关于cmp指令

  • cmp指令格式:cmp dest,src
  • cmp指令比较dest和src两个操作数,并通过比较结果设置C/O/Z标志位。
  • cmp指令大概有以下几种格式:
  • 1、cmp eax,ebx;如果相等,Z标志位置1,否则0
  • 2、cmp eax,[404000];将eax和404000地址处的dword型数据相比较并同上置位。

标志位

  • 事实上所以的标志位归并与一个32位寄存器,也就是说32个不同的标志位。
  • 每一个标志位有两个属性:置1或置0
  • 在逆向中,真正需要关系的标志位只有三个,也就是cmp指令能修改的那三个:Z/O/C。
    (1)Z标志位(0标志),这个标志位是最常用的,运算结果为0时候,Z标志位置1,否则置0。
    (2)O标志位(溢出标志),在运行过程中,如操作数超出了机器能表示的范围则称为溢出,此时OF位置1,否则置0。
    (3)C标志位(进位标志),记录运算时从最高有效位产生的进位值。列如执行加法指令时,最高有效位有进位时置1,否则置0。

逻辑运算

在这里插入图片描述
打开文件一路F8,到消息框
在这里插入图片描述
程序结束了,Ctrl+F2重来,到cmp指令
在这里插入图片描述
比较eax和-1,相等时z标志位置0
在这里插入图片描述
现在时1,我们改为0让他跳转
F8到test

关于test指令

  • test指令格式:test dest,src
  • 这个指令和and指令一样,对两个操作数进行按位的‘与运算,唯一不同之处是不将‘与’的结果保存到dest。
  • 即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位。
  • 然而百分之99是: test eax,eax(如果eax的值为0,则Z标志位置1)
  • 条件跳转指令,就是根据各种不同的标志位的条件判断是否成立,条件成立则跳转。
  • No picture you say a j8 :
    在这里插入图片描述
    在这里插入图片描述
    test eax,eax Z标志位取了1,说明eax为0,jnz不跳转
    ,继续F8
    在这里插入图片描述
    走到这里显然我们错误了
    在这里插入图片描述
    那我们回到之前的位置,让Z标志位为0,jnz跳转
    在这里插入图片描述
    继续F8
    在这里插入图片描述
    在这里插入图片描述
    走到这里,如果跳转则直接GG,所以肯定不能让它跳转的
    jl的判断条件:SF!=OF,所以让SF和OF标志位相等jl才不跳转
    在这里插入图片描述
    继续F8
    在这里插入图片描述
    在这里插入图片描述

来到这里先让他跳,看看会有什么后果
在这里插入图片描述
显然不可以让它跳转,改掉S位
在这里插入图片描述
我们成功了
在这里插入图片描述
现在要改掉相关的跳转汇编指令,然后将其保存为新的程序
该跳转的改为jmp强制跳转,不该跳转的用nop填充
复制为可执行文件→备份为文件
在这里插入图片描述

patch

  • patch也就是我们平时所说的补丁。
  • 所谓给程序打补丁就是我们对程序破解所进行的修改,就是说我们衣服破了,如果没有打补丁,就会走光的意思。
  • OllyDBG的“/”可以查看所有打过的补丁。
    比如刚刚破解的程序:
    在这里插入图片描述
    这还是暴力破解。

那么现在重新来真正的逆向它的算法

重新载入,然后F8
在这里插入图片描述
到这是算法的判定了:
在这里插入图片描述
判断[0x402173]这个地址上的值是否等于0x10
那我们看这个地址
在这里插入图片描述
在这里插入图片描述
打开一个文件在这个文件中读取多少个字节
,那这个判断就是说:文件中字节数至少要有0x10个
在这里插入图片描述
小于0x10个则跳转
在这里插入图片描述
首先把[eax+0x40211A]的值给al,然后判断al是否为0,如果为0则ZF置1指令跳转到这里
在这里插入图片描述

判断esi是否等于8,若等于8则跳转,然后就无了
在这里插入图片描述

因为esi初始值为0,所以je直接跳转,esi是不可能为8的
下一步:
在这里插入图片描述

在这里插入图片描述
al的字节数据,0x10个字节与47比
那么我们创建一个密匙文件来尝试一下
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
然而并不对,47应该为对应ASCLL码的“G”
在这里插入图片描述
在这里插入图片描述
这样就成功了

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值