总结
软件使用方面
这些天主要就是跟着书本上的案例,使用OllyDbg对程序进行逆向分析。
跟着书上做,总体过程还是比较顺利,但是对于大段的汇编代码,阅读起来实在是费劲。这还是在有注释的情况下进行分析。如果连课本的引导和注释都没有的话,想必难度会成指数增长。如果有机会真的想了解那些做外挂的是怎么弄的。
思考
为什么32位计算机或者64位计算机可以兼容以前16位版本的程序
从汇编的角度上来看的话,16位、32位、64位 AX BX AL AH
等寄存器的含义都是一样的。唯一不同的地方体现在EAX
是32位的。RAX
是64位的。
LEA(Load Effective Address )指令和MOV指令的区别
参考链接:https://www.jianshu.com/p/3e89d834df85
LEA 指令要求原操作数必须是存储单元,而且目的操作数必须是一个除段寄存器之外的16位或32位寄存器。当目的操作数是16位通用寄存器时,那么只装入有效地址的低16位。使用时要注意它与MOV指令的区别,MOV指令传送的一般是源操作数中的内容而不是地址。
假设 SI=1000H, DS=5000H, (51000H)=1234H
执行指令LEA BX, [SI]
后 BX=1000H
执行指令MOV BX,[SI]
后 BX=1234HLEA BX,XXX
可以用MOV BX,OFFSET XXX
来替代
但有些时候,必须要用LEA指令来完成某些功能,不能用MOV指令来实现,必须用LEA指令。
如 LEA BX,6[DI]
解释: 某数组含20个元素,每个元素占一个字节,序号为0~19。设DI指向数组开头处,如果把序号为6的元素的偏移地址送到BX中。就必须使用LEA指令。因为OFFSET 运算符只能返回数据标号的偏移量,然而并不是所有的内存单元都有数据标号。