本帖最后由 wholesome 于 2020-3-1 19:57 编辑
OllyDbg简单使用 今天学到一句话,很有道理: “对基础知识的深刻理解是非常重要的,所以请不要倦于实践操作,对待本文同样如此。” 那么,开门见山: OllyDbg可以更改寄存器的值,例如修改EAX上的值: 我们可以看到选中的将显示高亮,然后右键点击它选择Modify: 此时我们就可以修改EAX的值: 点击OK: 这个方法适用于其他寄存器,但EIP是唯一一个例外的,它指向下一条将要执行的指令,要改变它的值,需要如下操作,选择你要EIP跳转的位置: 然后右击0040101A,选择New origin here(汉化版翻译为:此处为新的EIP),EIP就会改变为0040101A,这样,程序就将会从这条指令执行: 我们回转到刚刚的EAX: 这里可以使用“?EAX”搜索EAX等寄存器的值,(注意,问号是英文问号,不然会报错,最开始我自己试了很久,还以为我的OlluDbg坏了)不过,接下来讲的是我之前一直混淆的,我们知道,EAX是32位寄存器,在OllyDbg中,它们的内容以十六进制显示。例如,EAX的最小值为00000000,最大值为FFFFFFFF,用二进制表示将是: 11111111111111111111111111111111 有时候汇编会看到AX,又或者AL、AH,由于我是初学者,不太明白这个到底怎么划分,所以趁此机会形象记忆,AX是EAX中的一部分,AX是16位寄存器: 此时EAX的值为12345678,随后查看AX的值: 我们可以看到AX的值为5678,AX又可以继续分为AL、AH,它们是AX的低八位和高八位: --------------------------------------------- 也就是说: 所以,几乎所有其它寄存器都可以如此分割!
此处就到此结束,开启另一段: 之前接触过NOP(无操作),实际中没有经常用到(估计是我技术不达标,还没用到这个) 那么我就学着样学习一下怎么在OllyDbg里使用: 我们可以看到,第一条指令push 0,占两个字节,此时我将把它改为nop,右击这条指令,选择Assemble: 改为nop之后: 我们可以看见由于push 0占两个字节,此时OllyDbg就会使用两条nop指令进行替换。那么我们怎么恢复呢? 选中这两条nop指令右击: 点击之后就可以恢复了! 现在就是看push 0了,虽说之前一直有了解堆栈,但是在OllyDbg里面该怎么更加清楚地看呢? 最开始的这个程序没有运行: 此时我们运行第一步: 可以看见“push 0”指令将把0存入到了堆栈的顶部,还有值得注意一点的就是:运行前的分配的堆栈地址在每台机器上可能是不一样的,即我的电脑此时的堆栈地址是0019FF74,同样的,其对应的初始内容也是不一样的,(我这里是74AA0419) “push 0”后,我们可以看见堆栈顶部加入“0”,其他地方的值并没有发生变化,即新压入的数据总是在堆栈的顶部,并不会改变下面的数据。 同时我们也可以看见ESP的值发生了变化: 总之push指令可以压入数值,压入寄存器EAX(里面的值),压入一个地址(里面的值)。 对应push操作的是pop,意思为出栈,它会取出堆栈顶部的第一个字母或者第一个值,然后存放到指定的目标地址内存单元中。下面我们直观看看在OllyDbg里面它是怎么操作的? 在第一句使用快捷键“空格”也可以调出Assemble,然后输入pop eax的值: 此时没有点击运行,再看: ESP的值为堆栈顶部地址0019FF74,EAX的值0019FFCC是机器初始化的值(每台机器上不一样),执行pop指令: 我们可以看见堆栈中地址为0019FF74被pop出去了,现在顶部ESP指向0019FF78,再看EAX的值,就是之前0019FF74地址的值。 此外,可以使用一条指令就可以把全部寄存器进行压栈与出栈。 pushad: 此时我们可以看见几乎各寄存器已经被压入栈,与之相对应的还有popad,这里就不再上图了! 至此,基本上我们已经了解主要界面该怎么看了!
|