加密与解密(OD使用笔记&简单实践_②)

来源:互联网 发布:剑灵龙男捏脸数据 编辑:程序博客网 时间:2024/06/13 19:48
    无论是对待一种技术还是一样工具,都要始终拥有探究、掌握其原理的欲望与热情,只用一样东西不知晓它的道理不可谓高明。只知其然不知其所以然,此非为王道也。格物穷理,道友共勉。
    
    推荐视频教程:鱼C工作室_加密与解密系列_OD使用教程
    本文章只是作为本人的笔记,会偷挖一些大神大牛们文章里的知识点,请见谅~
 
    #####################################华丽丽的栅栏分割
#####################################
    一些理论知识点的累积

    
关于寄存器:
    寄存器就好比是CPU身上的口袋,方便CPU随时从里边拿出需要的东西来使用。
    图片
    学过8086汇编的基本上都能看得懂,因为8086汇编中寄存器是16位寄存器,Win32下都是32位寄存器,虽然多了16位但是寄存器的功能基本上没有改变,只是扩展了16位。
    
    关于标志寄存器的各标志位:
     图片
    所有的标志位归置于一个标志寄存器,其值要么是0要么是1;
    主要看ZF零标志位、OF溢出标志位、CF进位标志位。
    
Z标志位(0标志),这个标志位是最常用的,运算结果为0时候,Z标志位置1,否则置0。
    O标志位(溢出标志),在运行过程中,如操作数超出了机器能表示的范围则称为溢出,此时OF位置1,否则置0。
    C标志位(进位标志),记录运算时从最高有效位产生的进位值。例如执行加法指令时,最高有效位有进位时置1,否则置0。
     
    关于栈:
    关于栈来说,只要记住FILO(即Fisrt In Last Out的性质)以及其存储方式为地址逆向增长,栈底为大地址,栈顶为小地址;
    图片
    
    关于CALL指令:
    一般调用其他函数都是用CALL指令,CALL是一个高级的汇编指令,背后由push和jmp两条指令组合成;
    先push eip再Call xxx;
    先将当前的地址保存,然后跳转到函数或过程的地址;
    call有以下几种方式:
    call 404000h ;直接跳到函数或过程的地址
    call eax ;函数或过程地址存放在eax
    call dword ptr [eax] ;取该寄存器的值作为地址进行跳转
    call dword ptr [eax+5] ;取该寄存器的值作为地址加上5之后进行跳转
    call dword ptr [<&API>] ;执行一个系统API

    
关于系统API:
    实际上就是系统给程序员提供的一些函数接口。
    图片
    
Windows应用程序运行在Ring 3级别,Ring 0为最高级别,而Ring 3最最低级别,操作系统不允许我们直接对内存进行操作,我们只有利用Ring 0级才行。这个时候我们利用API间接的进行内核操作,因为系统只信任自己提供的函数,所以我们要通过API才能实现对内核的操作。
    
    关于move指令:
    搬移指令,mov ax,bx 将bx的内容赋值给ax;
    
movs/movsb/movsw/movsd edi,esi:这些变体按串/字节/字/双字为单位将esi寄存器指向的数据复制到edi寄存器指向的空间。
    movsx符号位扩展,byte->word,word->dword (扩展后高位全用符号位填充),然后实现mov。
    movzx零扩展,byte->word,word->dword(扩展后高位全用0填充),然后实现mov。 

    关于cmp指令:
    
cmp指令格式:cmp dest, src
    cmp指令比较dest和src两个操作数,并通过比较结果设置C/?O/Z标志位;
    cmp eax, ebx ;如果相等,Z标志位置1,否则0;
    cmp eax, [404000] ;将eax和404000地址处的dword型数据相比较并同上置位;
    cmp [404000], eax ;同上; 
    
    关于逻辑运算:
    图片
    逻辑与、逻辑或、异或、逻辑非,很基础的内容不谈了。

    关于Test指令:
    
test指令格式:test dest, src
    这个指令和and指令一样,对两个操作数进行按位的‘与’运算,唯一不同之处是不将‘与’的结果保存到dest;
    即本指令对两个操作数的内容均不进行修改,仅是在逻辑与操作后,对标志位重新置位;
    大多数出现这个指令都是test eax,eax(因为eax大多数时候都是作为返回值存储的地方),如果eax的值为0,则Z标志位置1;

    关于条件跳转指令:
    
0 0
原创粉丝点击