x64dbg是一个调试器,可全功能调试 dll 和 exe 文件。

下载地址:https://github.com/x64dbg/x64dbg/releases

解压后运行release\x96dbg.exe,根据程序的类型选择对应的dbg。哪怕不知道该选哪个也没关系,你可以随便选一个,然后用它去打开你想要逆向的程序,如果不是对应的程序,会在程序的下方给出提示。

基本功能:

1、控制软件运行

调试器的最基本功能就是将一个飞速运行的程序中断下来,并且使其按照用户的意愿执行。调试器是靠迫使目标程序触发一个精心构造的异常来完成这些工作的。

2、查看软件运行中信息

查看软件的当前信息,这些信息包含但不限于当前线程的寄存器信息,堆栈信息、内存信息、当前 EIP 附近的反汇编信息等。

3、修改软件执行流程

修改内存信息、反汇编信息、堆栈信息、寄存器信息等等。

组成:

该调试器由三大部分组成:

  • DBG
  • GUI(这款调试器的图形界面是基于Qt的)
  • Bridge

 简介:

这个软件与 OD 一样是开源软件,熟悉 OD 的一定会发现,这款软件的界面与 OD 的界面极其的相似,当然也有着与 OD 相同的功能。鉴于 OD 已经好几年没有更新,是时候试试这款可以反汇编64位文件的软件了(ps:软件本身就有中文版哦)。

它有着更加清晰的颜色区分,并且背后的团队还在不断的更新中哦(越来越多的插件)

直接把要调试的文件拖进来!它的操作几乎与 OD 相同,再加上中文的界面,还是十分友好的。

基本操作:

  • 下断点

F2 或者右键而且在 x64dbg 里你还可以直接点左边的小灰点

  • 搜索字符串

  • 修改完成后就保存吧

本人对反编译以及汇编这个方面并不擅长,因此选择把自己写的小程序拿来分析,将汇编指令跟源代码进行比对。以下是测试的结果。

程序的初始化会占用大量的汇编指令,而这部分是我们平时写程序时看不到的。

初始化完成后的启动位置会被注释为 EntryPoint 。

之后开始脚本正文。

前两句是初始化数组 array[] 与计数变量 n , i 等,这里略过。

之后会运行如下代码:

<while(scanf("%d",&n)!=EOF)

{
      ……………………
}>

是的,这是一道 ACM 的题,因为很简单所以拿来分析也方便一点……

对于这个结构,汇编代码给出的解释如下:

箭头指向的地方就是 while() 里的判定,让我们跟过去。

大家都看见了左边有个指向上方的灰色箭头,不用说也知道是指向回刚刚的判断条件之后的内容。实际上在这里汇编代码的逻辑是很清晰的,一层层调用起来,一层层返回,与函数有异曲同工之妙。例如这里会调用 scanf 函数,在你输入了之后又会经过重重代码,最后到达的指令就是 scanf 指令的下一条指令。

将输入的整型数据处理完毕并进行判断以后,寄存器回到 while 循环区,并开始执行循环内的第一条代码。

< printf("ceshiing.....");>

x64dbg 显示有两条命令处理这个函数,第一个是获取显示内容,第二个是执行显示,第二个还会调用大量的汇编指令,这里不多加赘述。

接下来是两个 for 循环与 if 判断语句:

< for(i=0;i<n;i++){scanf("%lf",array+i);}

                 for(i=0;i<n;i++)

                 {if(array[i]>nmax)nmax=array[i];

                  if(array[i]<nmin)nmin=array[i];

                  sum+=array[i];                       

                 }>

汇编指令中将这个过程非常直观地表示了出来。

第一个循环用于输入每个评委给的分数。 jmp 无条件指令跳转, jl 按找参数的正负符号跳转, jl 的前一条 cmp 将两个值相减,用来给 jl 是否跳转提供依据。

第二个循环用于寻找最大值与最小值。可以从结构看出, if 语句中满足条件的话就 不会发生跳转。

最后执行以下代码,完成一次大循环:

< sum-=nmax,sum-=nmin;

                 sum=sum/(n-2);

                 printf("%.2lf\n",sum);

                 //初始化数据

                 nmax=0,nmin=100,sum=0;>

是不是很熟悉?又回到了最开始判定的地方。初始化完成后,就是判定,判定是的话又会返回 while 循环区的第一条代码……直到循环完成。再后面的汇编代码都是一些定义了,之前有许多 call 指令的目标便在这里被定义。包括 printf , scanf 都被封装在下面。

那么本次延展的主要内容就到这里结束了。汇编指令相较高级语言来说要晦涩许多,哪怕是以底层著称的C语言译转为汇编指令以后依旧会变得如此复杂。尽管这样,汇编指令也富有逻辑性。Call指令使程序变得模块化,使得C语言中连续的内容不会被分散。简洁的跳转指令构成了完善清晰的循环结构。我们可以看出,程序的代码部分会集中在一个小区域,也就是 EntryPoint 之后的一部分内容,这位我们解析代码提供了便利。对程序的逆向或破解有兴趣的同学可以去看看网上更多的与此相关的内容哦,这篇文章仅供简介这个程序的解析过程的入门。

最后是我们可爱的开发人员们:

mrexodia

Sigma

tr4ceflow

Dreg

Nukem

Herz3h

Torusrxxx

 

以及贡献者们:

blaquee

wk-952

RaMMicHaeL

lovrolu

fileoffset

SmilingWolf

ApertureSecurity

mrgreywater

Dither

zerosum0x0

RadicalRaccoon

fetzerms

muratsu

ForNeVeR

wynick27

Atvaark

Avin

mrfearless

Storm Shadow

shamanas

joesavage

justanotheranonymoususer

gushromp

Forsari0