posts - 15, comments - 8, trackbacks - 0, articles - 2

在逆向过程中感觉条件判断是比较烦人的,一步判错就结果相反,改变原来的程序流程。这里帖一段汇编代码举个例子。
.text:0041FC96 19C                 cmp     dx, di
.text:0041FC99 19C                 jz      short loc_41FCA6
.text:0041FC9B 19C                 cmp     dx, 3Fh
.text:0041FC9F 19C                 jnz     short loc_41FCB1
.text:0041FCA1 19C                 test    di, di
.text:0041FCA4 19C                 jz      short loc_41FCB1
.text:0041FCA6
.text:0041FCA6     loc_41FCA6:                             ; CODE XREF: sub_41FC64+35j
.text:0041FCA6 19C                 inc     esi
.text:0041FCA7 19C                 inc     esi
.text:0041FCA8 19C                 inc     eax
.text:0041FCA9 19C                 inc     eax
.text:0041FCAA 19C                 jmp     short loc_41FC85
.text:0041FCAC     ; ---------------------------------------------------------------------------
.text:0041FCAC
.text:0041FCAC     loc_41FCAC:                             ; CODE XREF: sub_41FC64+30j
.text:0041FCAC 19C                 test    di, di
.text:0041FCAF 19C                 jz      short loc_41FCEA
.text:0041FCB1
.text:0041FCB1     loc_41FCB1:
           

  可以看到,在41FC99处的那个判断语句是if (dx == di) then loc_41FCA6而41FC99后面的代码则又跟着两个条件跳转,并且随后的两个条件语句的后续正好是41FC99的跳转实现处,这就说明,这三个条件语句应是一体的,进一步看,0041FC9F 0041FCA4处的代码都是跳转到同一位置,可见这两处条件判断应是相与的关系,并且第一个条件语句41FC99处的和后面两个的结果应是相或关系。可以将这段判断语句写成如果C代码:
if (dx ==di || dx == 0x3F && di != NULL)   .

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理