首页
社区
课程
招聘
[求助]逆向一个题目,其中部份代码无法分出来?
发表于: 2008-7-31 22:26 4313

[求助]逆向一个题目,其中部份代码无法分出来?

2008-7-31 22:26
4313
int myfunction(int a[3][3],int b[3][3],int c[3][3])
{
   for(int i=0;i<3;i++)
   {
      for(int j=0;j<3;j++)
      {
         c[i][j] = a[i][0]*b[0][j]+a[i][1]*b[1][j]+a[i][2]*b[2][j];
      }
   }
}
00401000  mov         eax,dword ptr [esp+4]  ;a
00401004  mov         edx,dword ptr [esp+0Ch] ;c
00401008  mov         ecx,dword ptr [esp+8]  ;b
0040100C  push        ebx   
0040100D  push        esi   
0040100E  add         eax,4 ;不明白这里为什么要给A+4     
00401011  push        edi      
00401012  add         edx,8    ;不明白这里为什么要给C+8  
00401015  mov         esi,3     
0040101A  lea         ebx,[ebx]     
00401020  mov         ebx,dword ptr [eax]    ;EBX=a[i][0]
00401022  imul        ebx,dword ptr [ecx+0Ch]   ;EBX=a[i][0]*b[0][j]
00401026  mov         edi,dword ptr [ecx+18h]   ;edi=a[i][1]
00401029  imul        edi,dword ptr [eax+4]  ;edi=a[i][1]*b[1][j]
0040102D  add         edi,ebx                 ;edi=edi+ebx
0040102F  mov         ebx,dword ptr [eax-4]  ;不明白这里为什么要减4
00401032  imul        ebx,dword ptr [ecx]  
00401035  add         edi,ebx  
00401037  mov         dword ptr [edx-8],edi  
0040103A  mov         ebx,dword ptr [eax]  
0040103C  imul        ebx,dword ptr [ecx+10h]  
00401040  mov         edi,dword ptr [ecx+1Ch]  
00401043  imul        edi,dword ptr [eax+4]  
00401047  add         edi,ebx  
00401049  mov         ebx,dword ptr [eax-4]  
0040104C  imul        ebx,dword ptr [ecx+4]  
00401050  add         edi,ebx  
00401052  mov         dword ptr [edx-4],edi  
00401055  mov         ebx,dword ptr [eax+4]  
00401058  imul        ebx,dword ptr [ecx+20h]  
0040105C  mov         edi,dword ptr [ecx+14h]  
0040105F  imul        edi,dword ptr [eax]  
00401062  add         edi,ebx  
00401064  mov         ebx,dword ptr [eax-4]  
00401067  imul        ebx,dword ptr [ecx+8]  
0040106B  add         edi,ebx  
0040106D  mov         dword ptr [edx],edi  
0040106F  add         eax,0Ch  
00401072  add         edx,0Ch  
00401075  dec         esi         
00401076  jne         myfunction+20h (401020h)  
00401078  pop         edi   
00401079  pop         esi   
0040107A  xor         eax,eax  
0040107C  pop         ebx   
}
也不知道这样逆向是不是正确的
上面不明白的地方,请高手指出下,想了好久了,不明白

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 218
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
2
没人帮个忙吗
2008-7-31 23:06
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
3
(1) 0040100E  add         eax,4 ;不明白这里为什么要给A+4     
(2) 00401012  add         edx,8    ;不明白这里为什么要给C+8  
(3) 0040102F  mov         ebx,dword ptr [eax-4]  ;不明白这里为什么要减4


你可以看到 (1) 中加了4,在 (3) 中就会减去4,这样就得到了a[0]的值,在 (2)中 edx加了8,后面同样会看到有 edx-8的指令,这些都是一样的,编译器在处理数据结构偏移时也会经常这样处理。

这只是编译器为了方便取值,经过优化后生成的指令。你只要明白每条指令的源操作数和目标操作数,就不用去在意为何要这样加加减减。
2008-8-1 10:15
0
雪    币: 218
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
4
还是不太明白,那么按你这样说
00401020  mov         ebx,dword ptr [eax]    ;EBX=a[i][0]
00401022  imul        ebx,dword ptr [ecx+0Ch]   ;EBX=a[i][0]*b[0][j]
分析就不对了,mov         ebx,dword ptr [eax]    ;EBX=a[1][0]这里就应该是这样的了
2008-8-1 14:42
0
雪    币: 2056
活跃值: (13)
能力值: ( LV13,RANK:250 )
在线值:
发帖
回帖
粉丝
5
从偏移量里可以看出,指令并不是按照C代码的顺序来相加的。应该是这样:

00401020  mov         ebx,dword ptr [eax]          ;ebx = a[i][1]
00401022  imul        ebx,dword ptr [ecx+0Ch]   ;ebx = a[i][1] * b[1][j]

00401026  mov         edi,dword ptr [ecx+18h]   ;edi = b[2][j]
00401029  imul        edi,dword ptr [eax+4]       ;edi = a[i][2] * b[2][j]

0040102D  add         edi,ebx                 ;edi = edi + ebx

0040102F  mov         ebx,dword ptr [eax-4]  ; ebx = a[i][0]
00401032  imul        ebx,dword ptr [ecx]       ;ebx = a[i][0] * b[0][j]  
2008-8-1 18:05
0
雪    币: 218
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
6
哦,明白了,非常感谢谢vxasm
2008-8-1 20:02
0
雪    币: 0
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
7
学习学习..看看高手
2008-8-2 03:04
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
学习学习..看看高手
2008-8-7 17:04
0
游客
登录 | 注册 方可回帖
返回
//