《逆向分析实战》——随笔笔记

OD主界面

  • OD调试主窗口中的工作区大致可以分为6个部分,按照从左往右、从上往下,这6部分分别是反汇编窗口、信息提示窗口、数据窗口、寄存器窗口、栈窗口和命令窗口。
    下面分别介绍各个窗口的用法。
    反汇编窗口:该窗口用于显示反汇编代码,调试分析程序主要在这个窗口中进行,这也是进行调试分析的主要工作窗口。
    信息提示窗口:该窗口用于显示与反汇编窗口中上下文环境相关的内存、寄存器或跳转来源、调用来源等信息。
    数据窗口:该窗口用于以多种格式显示内存中的内容,可使用的格式有Hex、文本、短型、长型、浮点、地址和反汇编等。
    寄存器窗口:该窗口用于显示各个寄存器的内容,包括前面介绍的通用寄存器、段寄存器、标志寄存器、浮点寄存器。另外,还可以在寄存器窗口中的右键菜单选择显示MMX寄存器、3DNow!寄存器和调试寄存器等。
    栈窗口:该窗口用于显示栈内容、栈帧,即 ESP或 EBP寄存器指向的地址部分。
    命令窗口:该窗口用于输入命令来简化调试分析的工作,该窗口并非基本窗口,而是由OD的插件提供的功能,由于几乎所有的OD使用者都会使用该插件,因此有必要把它也列入主窗口中。
    在这里插入图片描述
    注意:在汇编代码中定义变量,db表示字节类型, dw表示字类型,dd表示双字类型。而在表示数值的时候,以h结尾的表示十六进制数,以b结尾的表示2进制数,结尾处没有修饰符的默认为十进制数。

常用的字节序涉及的函数:
前两个是将主机字节序转换成网络字节序
u _short htons (u_short hostshort);
u_long htonl (u_long hostlong ) ;
后两个是将网络字节序转换为主机字节序
u _short ntohs (u_short netshort);
u _long ntohl(u_long netlong) ;
主机字节序是小端,网络字节序是大端

  • 编程判断主机字节序

1.取值比较法

#include <windows.h>
#include <stdio.h>
int main (int argc, char *argv[ ])
{
	DWORD dwSmallNum = 0x01020304;
	if( *(BYTE *) &dwSmallNum == 0x04 )
	{
		printf ( "Small sequence. \r \n" ) ;
	}
	else
	{
		printf ( "Big sequence. \r \n" );
	}
	return 0;
}

以上代码中,定义了0x01020304这个十六进制数,其在小尾方式内存中的存储顺序为04 03 02 01。取*(BYTE*)&dwSmallNum内存中的低地址位的值,如果是小尾方式的话,那么低地址存储的值为0x04;如果是大尾方式的话,则低地址存储的值为0x01。
注意:这段代码的关键就是*(BYTE*)&dwSmallNum取出来的值。

2.直接转换比较法

#include <stdio.h>
#include <winsock2.h>
#pragma comment ( lib, "ws2_32")
int main (int argc, char *argv [ ])
{
	DWORD dwSmallNum = 0x01020304;
	if ( dwSmallNum == htonl(dwSmallNum))
	{
		printf( "Small sequence. \r \n" );
	}
	else
	{
		printf ("Big sequence. \r \n" ) ;
	}
	return 0;
}

利用字节序转换函数将所定义的值进行转换,然后用转换后的值与原值进行比较。
如果原值转换后的结果与原值相同,就说明该主机是大尾方式存储,反之则是小尾方式。

  • 这里没有理解,如果原值转换后的结果与原值相同,说明该主机是大尾方式存储,为什么代码
    if ( dwSmallNum == htonl(dwSmallNum))
    {
    printf( “Small sequence. \r \n” ); //这里的代码不是如果相等则是小尾存储的意思吗?
    }

通用寄存器
① EAX:累加器,在乘法和除法指令中被自动使用;在 Win32中,一般用在函数的返回值中。
② EBX:基址寄存器,DS段中的数据指针。
③ ECX:计数器,CPU自动使用ECX作为循环计数器,在字符串和循环操作中常用,在循环指令(LOOP)或串操作中,ECX用来进行循环计数,每执行一次循环,ECX都会被CPU自动减一。
④EDX:数据寄存器。
以上4个寄存器主要用在算数运算与逻辑运算指令中,常用来保存各种需要计算的值

⑤EBP:扩展基址指针寄存器,SS段中堆栈内数据指针。EBP由高级语言用来引用参数和局部变量,通常称为堆栈基址指针寄存器。
⑥ESP:堆栈指针寄存器,SS段中堆栈指针。ESP用来寻址堆栈上的数据,ESP寄存器一般不参与算数运算,通常称为堆栈指针寄存器。
⑦ ESI:源变址寄存器,字符串操作源指针。⑧ EDI:目的变址寄存器,字符串操作目标指针。
以上4个寄存器主要用作保存内存地址的指针

串操作指令

指令用法
movs拷贝一块内存
stos设置一块内存的初始值
lods不断的从内存中读取数据
cmps比较两块内存是否一致

条件标志寄存器
① OF(OverFlow Flag):溢出标志位,用来反映有符号数加减法运算所得结果是否溢出。如果运算超过当前运算位数所能表示的范围,则称为溢出,该标志位被置为1,否则为0。
② SF (Sign Flag):符号标志位,用来反映运算结果的符号位。运算结果为负时为1,否则为0。
③ ZF (Zero Flag):零标志位,用来反映运算结果是否为0。运算结果为0时该标志位被置为1,否则为0。
④ AF (Auxiliary carry Flag):辅助进位标志位。在字操作时,发生低字节向高字节进位或借位时该标志位被置为1,否则为0(注意:在字节操作时,发生低4位向高4为进位或借位时该标志位被置为1,否则为0)。
⑤ PF (Parity Flag):奇偶标志位,用于反映结果中“1”的个数的奇偶性。如果“1”的个数为偶数,该标志位被置为1,否则为0。
⑥ CF (Carry Flag):进位标志位。运算结果的最高位产生了一个进位或借位,则该标志位被置为1,否则为0。

控制标志寄存器
① DF (Direction Flag):方向标志位,用于串操作指令中,控制地址的变化方向。当DF为0时,存储器地址自动增加;当DF为1时,存储器地址自动减少。操作 DF标志寄存器可以使用指令CLD和STD进行复位和置位。
② IF (Interrupt Flag):中断标志位,用于控制外部可屏蔽中断是否可以被处理器响应。当IF为1时,允许中断;当F为0时,则不允许中断。操作F标志寄存器可以使用CLI和STI进行复位和置位。
③ TF (Trap Flag):陷阱标志位,用于控制处理器是否进入单步操作方式。当TF为0时,处理器在正常模式下运行;当TF为1时,处理器单步执行指令,调试器可以逐条指令进行执行就是使用了该标志位。

逻辑运算指令
常用的逻辑运算有and(与)、or(或)、xor(异或)和 not(非)。
① and指令可用于复位某些位(复位就是将该位设置为0)而不影响其他位。例如,将AL的低4位清零,and al,0f0h。
② and指令可用于保留某位的值不变,其他位清零。例如,将AL的最高位保留,其他位清零,and al,10h。
③ or 指令可用于置位某些位(置位就是将该位设置为1)而不影响其他位。例如,将AL的低4位置1,or al, Ofh。
④ xor指令可用于对某个寄存器进行清零,例如xor eax, eax。
⑤ xor指令可用于简单的加密与解密,例子可参考xor指令的练习指令。

JCC指令
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值