首页
社区
课程
招聘
[求助]寻实现算法
发表于: 2018-5-3 22:57 4894

[求助]寻实现算法

2018-5-3 22:57
4894
请教实现这个算法
小尾CPU
int in[2],out[2];

0x79D9BED4 ----------------->in[2]
0x0000EB52

---------------->循环>>4,反汇编的意思:out[0] = ((in[i] << i) & 0x3fffffff) | (in[i] >> (32 - i)); i+=4;

0x197952EB ----------------->out[2]
0x000352FB

[注意]APP应用上架合规检测服务,协助应用顺利上架!

收藏
免费 0
支持
分享
最新回复 (5)
雪    币: 920
活跃值: (3632)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
2
你没有讲清楚。
首先你out[0]  =  ((in[i]  <<  i)  &  0x3fffffff)  |  (in[i]  >>  (32  -  i));  i+=4;已经写出来了,那么你最终目的是要得到什么?
其次你说了小尾,那么in的0x79D9BED4,0x0000EB52以及out的0x197952EB,0x000352FB在内存里是怎么排布的?
是79  d9  be  d4  00  00  eb  52还是52  eb  00  00  d4  be  d9  79?
最后,前面声明了in[2],而后面i+4,那么in[i]会溢出,不清楚你的意思
2018-5-4 10:21
0
雪    币: 9
活跃值: (439)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
@yeyeshun 
对的,这个算法要的就是“那么in[i]会溢出”,才能得到和反汇编一样的out结果,小弟重新排版下数据
下面都是小尾CPU数组的数据
原始反汇编数据是按照char  *  来的,但是它移位又是把char  *  转为int  来运算的
unsigned  char  in  [0x0008]  =        {        0xeb,  0x52,  0x79,  0x19,  0xfb,  0x52,  0x03,  0x00};
unsigned  char  out  [0x0008]  =        {        0xd4,  0xbe,  0xd9,  0x79,  0x52,  0xeb,  0x00,  0x00};
//out[0]  =  ((in[i]  <<  i)  &  0x3fffffff)  |  (in[i]  >>  (32  -  i));  i+=4;
2018-5-4 13:50
0
雪    币: 9
活跃值: (439)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
下面的代码得到一半的正确结果,后办部分实在搞不来了。。。。

                   int  mac_out_int[2]  =  {};
                       int  m[2]  =  {  0  };
                       int  max[2]  =  {  0  };

                       int  *largest_right_cyclic_shift(int  *n)  {
                               memcpy(m,  n,  8);
                               memcpy(max,  n,  8);
                               for  (size_t  p  =  0;  p  <  1;  p++)
                               {
                                       for  (int  i  =  0;  i  <  17;  i  +=  4)  {
                                               m[0]  =  ((n[p]  <<  i)  &  0x3fffffff)  |  (max[p]  >>  (32  -  i));
                                               //if  (i==8)
                                               //{
                                               //        max[0]  =  m[2];
                                               //        mac_out_int[1]  =  m[0]<<  4  &  0x3FFFFFFF;
                                               //        mac_out_int[1]  =  mac_out_int[1]  >>  26  &  0x3FFFFFFF;
                                               //}
                                               if  (m[p]  <=  max[p])  {
                                                       max[p]  =  m[p+1];
                                               //        mac_out_int[1]  =  m[0];//  ((max[0]  <<  i)  &  0x3fffffff)  |  (n[1]  >>  (32  -  i));
                                               }
                                       }
                               }
                               return  m;
                               //0x197952eb    ok,循环到这里,这个正确得到
                               //0x000352fb    这里就不会搞了
                       }
               
                        void  tlx_mac()  {         
                               unsigned  int  out_mac_int[2]  =  {  0  };
                               kGe::cpu_work_model::Pchar_2_int(local_mac,  out_mac_int);  //local_mac  :char  *  in
                               auto  out  =  largest_right_cyclic_shift((int  *)out_mac_int);//out_mac_int:char  *in转大端数据传参进入上面的循环
                               }
2018-5-4 13:55
0
雪    币: 920
活跃值: (3632)
能力值: ( LV7,RANK:140 )
在线值:
发帖
回帖
粉丝
5
恕我直言,你描述的这些东西以及你贴的代码,不如直接贴原始算法的汇编码
2018-5-4 14:47
0
雪    币: 9
活跃值: (439)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
那私信吧,国软,方便留下qq嘛
2018-5-4 15:26
0
游客
登录 | 注册 方可回帖
返回
// // 统计代码