[调试逆向] [求助]反汇编二叉树请教

狗儿的朋友 2018-4-15 22:00 334

0041F220  /$  55            push ebp                                 ;  二叉对比

0041F221  |.  8BEC          mov ebp,esp

0041F223  |.  51            push ecx

0041F224  |.  8B51 04       mov edx,dword ptr ds:[ecx+0x4]           ;  ds:[7FF80784]=7FEB2050

0041F227  |.  8B42 04       mov eax,dword ptr ds:[edx+0x4]           ;  ds:[7FEB2054]=5B97F4C0

0041F22A  |.  53            push ebx                                 ;  ebx=7F8B0040

0041F22B  |.  8A58 15       mov bl,byte ptr ds:[eax+0x15]

0041F22E  |.  84DB          test bl,bl

0041F230  |.  56            push esi                                 ;  esi=7FF80740

0041F231  |.  57            push edi                                 ;  edi=61597124

0041F232  |.  8B7D 0C       mov edi,[arg.2]                          ;  堆栈 ss:[0012F840]=0012F854

0041F235  |.  75 1E         jnz short Game.0041F255

0041F237  |.  8B37          mov esi,dword ptr ds:[edi]               ;  堆栈 ds:[0012F854]=000000EA

0041F239  |.  8DA424 000000>lea esp,dword ptr ss:[esp]               ;  堆栈地址=0012F824

0041F240  |>  3970 0C       /cmp dword ptr ds:[eax+0xC],esi          ;  eax+0xc=0x84 esi=000000EA

0041F243  |.  7D 05         |jge short Game.0041F24A

0041F245  |.  8B40 08       |mov eax,dword ptr ds:[eax+0x8]          ;  eax=5B367330 ds:[5B367338]=600ADFC0

0041F248  |.  EB 04         |jmp short Game.0041F24E

0041F24A  |>  8BD0          |mov edx,eax                             ;  eax=5914A240

0041F24C  |.  8B00          |mov eax,dword ptr ds:[eax]

0041F24E  |>  8A58 15       |mov bl,byte ptr ds:[eax+0x15]           ;  bl=00  ds:[5B367345]=00

0041F251  |.  84DB          |test bl,bl

0041F253  |.^ 74 EB         \je short Game.0041F240

0041F255  |>  8B41 04       mov eax,dword ptr ds:[ecx+0x4]           ;  eax=eax=5914A240  ds:[7FF80784]=7FEB2050

0041F258  |.  3BD0          cmp edx,eax

0041F25A  |.  8955 0C       mov [arg.2],edx                          ;  edx=5914A240

0041F25D  |.  74 1A         je short Game.0041F279

0041F25F  |.  8B0F          mov ecx,dword ptr ds:[edi]               ;  堆栈 ds:[0012F854]=000000EA

0041F261  |.  3B4A 0C       cmp ecx,dword ptr ds:[edx+0xC]

0041F264  |.  7C 13         jl short Game.0041F279

0041F266  |.  8D45 0C       lea eax,[arg.2]

0041F269  |.  8B10          mov edx,dword ptr ds:[eax]

0041F26B  |.  8B45 08       mov eax,[arg.1]

0041F26E  |.  5F            pop edi                                  ;  ntdll.7C92DF2C

0041F26F  |.  5E            pop esi                                  ;  ntdll.7C92DF2C

0041F270  |.  8910          mov dword ptr ds:[eax],edx

0041F272  |.  5B            pop ebx                                  ;  ntdll.7C92DF2C

0041F273  |.  8BE5          mov esp,ebp

0041F275  |.  5D            pop ebp                                  ;  ntdll.7C92DF2C

0041F276  |.  C2 0800       retn 0x8

0041F279  |>  8945 FC       mov [local.1],eax                        ;  eax=7FEB2050

0041F27C  |.  8D45 FC       lea eax,[local.1]                        ;  堆栈地址=0012F830

0041F27F  |.  8B10          mov edx,dword ptr ds:[eax]               ;  堆栈 ds:[0012F830]=7FEB2050

0041F281  |.  8B45 08       mov eax,[arg.1]                          ;  堆栈 ss:[0012F83C]=0012F848

0041F284  |.  5F            pop edi                                  ;  ntdll.7C92DF2C

0041F285  |.  5E            pop esi                                  ;  ntdll.7C92DF2C

0041F286  |.  8910          mov dword ptr ds:[eax],edx               ;  edx=7FEB2050

0041F288  |.  5B            pop ebx                                  ;  堆栈 [0012F82C]=7F8B0040 (7F8B0040)

0041F289  |.  8BE5          mov esp,ebp

0041F28B  |.  5D            pop ebp                                  ;  ntdll.7C92DF2C

0041F28C  \.  C2 0800       retn 0x8


如上的一段代码 ,如果我估计的不错应该是二叉树吧。

我看一个教程里面是这样写的!我尝试过反汇编一个二叉树 和链接。

上面的代码,根据加粗的部分,看起来更像是在遍历链表。

请教各位大神小神,怎样判断(看懂)类似这样是在遍历链表还是二叉树呢。如何提升分析链表二叉树这方面的能力。

最后于 2018-4-15 22:05 被狗儿的朋友编辑 ,原因:
最新回复 (8)
qiantang 2018-4-15 22:05
2
看节点的连接情况,二叉树的每个节点都有一个父节点,两个子节点,有的二叉树的节点还挂着链表或者哈希表,估计lz没有类似的开发经验,建议lZ自己去实现一个二叉树就知道了。
狗儿的朋友 2018-4-15 22:46
3
qiantang 看节点的连接情况,二叉树的每个节点都有一个父节点,两个子节点,有的二叉树的节点还挂着链表或者哈希表,估计lz没有类似的开发经验,建议lZ自己去实现一个二叉树就知道了。[em_1]
我比较笨,那请问下。 这个是二叉树遍历吗
 我刚刚想到一个  双向链接反汇编的话 不是也会和二叉树树一个有左右节点 类似 edx+4前 edx+8后 然后mov取出值cmp 比较等
还是说一般双向链表遍历时只会往一个方向遍历,二叉树一般都遍历左右两个子节点。通过这样区分遍历二叉树还是链表
最后于 2018-4-15 22:56 被狗儿的朋友编辑 ,原因:
qiantang 2018-4-15 23:30
4
狗儿的朋友 qiantang 看节点的连接情况,二叉树的每个节点都有一个父节点,两个子节点,有的二叉树的节点还挂着链表或者哈希表,估计lz没有类似的开发经验,建议lZ自己 ...
我来说一下我们判断这段代码是否是二叉树的操作代码的方法差异,你是想根据代码本身的逻辑判断这段代码是否是二叉树相关操作代码,我是直接看内存,内存看节点有几个前驱,几个后继。在双向链表中,内存中的节点只有一个前驱一个后继,而二叉树有一个前驱,两个后继。是线性关系还是非线性关系很清楚。
rongkao 2018-4-16 11:47
5

    void  递归(int  eax)
    {
    if(*(r_b(eax+0x15)))
    {
           
           xxx  =  r_d(eax  +  xxx)
          
           //读下一个树
            递归(r_d(eax))
           递归(r_d(eax  +  8))
    }
    }
   
狗儿的朋友 2018-4-16 12:02
6
qiantang 我来说一下我们判断这段代码是否是二叉树的操作代码的方法差异,你是想根据代码本身的逻辑判断这段代码是否是二叉树相关操作代码,我是直接看内存,内存看节点有几个前驱,几个后继。在双向链表中,内存中的节点只有 ...
哦,C++二叉树实现没问题。反汇编我也看了。不是很懂!
你说的,通过内存观察,我看不出来区别,是不是难度更大。
请问下这类的书籍有吗,如何一步一步的提升。  感觉一下子难度大的无法逾越了
qiantang 2018-4-16 12:29
7
狗儿的朋友 哦,C++二叉树实现没问题。反汇编我也看了。不是很懂! 你说的,通过内存观察,我看不出来区别,是不是难度更大。 请问下这类的书籍有吗,如何一步一步的提升。 感觉一下子难度大的无法逾越了
首先,我觉得你这个不是能力的问题,是思路的问题。其次内存肯定是有差别的啊,你看,双向链节点有两个指针,你如果通过节点1的指针A找到节点2,但是你会看到节点2中一个指针肯定又指向了1;再来看二叉树,你通过二叉树的节点1的指针A找到节点2,但是节点2的两个指针肯定又指向别的节点,而不是像双向链表那样2里面有指针指向1。我说的看内存并不是独立地看某个节点的内存,而是看内存中节点与节点之间的关系。
狗儿的朋友 2018-4-16 20:41
8
rongkao void 递归(int eax) { if(*(r_b(eax+0x15))) { xxx = r_d(eax + xxx) //读 ...
刚刚看到,我遍历的方法不是这样  类似
void  traversal(struct  node*  pNode)



       
       int  i;
       if  (pNode->pLeft!=NULL)
       {
               traversal(pNode->pLeft);
       }
       for  (i=1;i<=pNode->count;i++)
       {
               printf("%d,",pNode->data);
       }
       if  (pNode->pRight!=NULL)
       {
                       traversal(pNode->pRight);
       }

}
谢谢回帖
狗儿的朋友 2018-4-16 20:51
9
qiantang 首先,我觉得你这个不是能力的问题,是思路的问题。其次内存肯定是有差别的啊,你看,双向链节点有两个指针,你如果通过节点1的指针A找到节点2,但是你会看到节点2中一个指针肯定又指向了1;再来看二叉树,你通 ...
经过您的指点,我又去认真看了下。在OD的数据窗口,发现链表的中间节点的数据值,有指向  当前节点前  和当前节点后的。而二叉树的当前节点的数据值,只有指向当前节点后的。
是不是这个就是区别
返回