分析midea0978的《一个C#算法分析求解》(三)(完)


六、逆算准备
根据J和K的关系,很容易就可以根据数组个数计算出实际字符个数。
建立相应的字符对象数组,并使用密码表中不存在的字符(这里是空格符)初始化。
为Bts属性指定一个和原数组个数一样的全0数组,用于存放结果,
而Bts2中放置原数组。因此,我们所要做的事情就是,对于这个字符对象数组中的每一个对象,
找到一个合适的N,使得Bts中的数据和Bts2一样。这个时候每个字符对象对应的字符就是密码表中的第N个字符。
ReCalc中建立了一个列表数组lists,用于存放每个字节受哪些字符对象“控制”(由该字符对象参数生成)。

七、开始逆算
准备好上面的工作后,就可以开始逆算了。
对于字节数组中start位置的字节,它的控制列表为list=lists[start],
也就是说,所有影响这个位置的字节码生成的字符对象ID,都存放在这个list中。
我们只需要遍历这个list中每一个字符对象的所有NList可能,就可以计算出所有Bts[start]的可能,
取其中Bts[start]=Bts2[start]的就是了。
因为J的关系,list中最大的元素个数是3,所以,最多只需要3层循环。
此外,还有一个技巧需要说明,最后一个字节的控制列表只有一个字符对象,并且一定是最后的那个,这些从
J和K那里可以得知。

每一次NList的循环之前,都需要先备份K和M处的字节数据,以备下一轮循环前还原。
循环把NList的每一个N可能赋值给这个字符对象的N,然后执行Cal计算字节数据。
循环内部再嵌套控制列表list中的下一个字符对象。
在最里面一层循环里面,对比Bts[start]是否等于Bts2[start],
如果相等,表明该层控制列表各字符对象的N值符合要求(但不是唯一的可能,还可能有别的组合)。
此时,就可以进入start-1层的计算了,该是递归上场的时候了。

且慢,在这之前,还需要做一些准备工作。
这一层已经计算好的字符对象,在下一层的时候可不能重新参与计算,否则就会影响这一层已经计算好的值了。
根据递归原则,我们应该“锁定”这些对象,不允许子递归修改这些对象,
子递归只能通过循环控制列表中的其它对象来“凑”出一个合适的Bts(start)。

八、总结
整个递归算法是深度搜索算法。由于字符与字符之前有相互关系,所以必须是深度搜索,
但又因为这个关系只存在相邻字符之间,所以深度搜索不必每次“到底”。
运算速度还不错,所以就不做性能优化了。

历时24小时左右(20+4,中间小睡了一会)
大石头
QQ:99363590
Email:gxuhy#21cn.com
http://www.nnhy.org
2007-12-02 01:04
C#逆向算法分析

  1分析midea0978的《一个C#算法分析求解》(三)(完)
  2分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)        /**//// <summary>
  3分析midea0978的《一个C#算法分析求解》(三)(完)        /// 搜索
  4分析midea0978的《一个C#算法分析求解》(三)(完)        /// </summary>
  5分析midea0978的《一个C#算法分析求解》(三)(完)        /// <param name="ts"></param>
  6分析midea0978的《一个C#算法分析求解》(三)(完)        /// <param name="lists"></param>
  7分析midea0978的《一个C#算法分析求解》(三)(完)        /// <param name="start"></param>
  8分析midea0978的《一个C#算法分析求解》(三)(完)        /// <returns></returns>

  9分析midea0978的《一个C#算法分析求解》(三)(完)        public static Boolean Find(CharObject[] ts, List<Int32> locks, List<Int32>[] lists, Int32 start)
 10分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)        分析midea0978的《一个C#算法分析求解》(三)(完){
 11分析midea0978的《一个C#算法分析求解》(三)(完)            Console.WriteLine(new String(' '12 - start) + "第{0}层", start.ToString());
 12分析midea0978的《一个C#算法分析求解》(三)(完)
 13分析midea0978的《一个C#算法分析求解》(三)(完)            //结束条件
 14分析midea0978的《一个C#算法分析求解》(三)(完)            if (start < 0)
 15分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)            分析midea0978的《一个C#算法分析求解》(三)(完){
 16分析midea0978的《一个C#算法分析求解》(三)(完)                StringBuilder sb = new StringBuilder();
 17分析midea0978的《一个C#算法分析求解》(三)(完)                for (int i = 0; i < ts.Length; i++)
 18分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)                分析midea0978的《一个C#算法分析求解》(三)(完){
 19分析midea0978的《一个C#算法分析求解》(三)(完)                    if (ts[i] == nullbreak;
 20分析midea0978的《一个C#算法分析求解》(三)(完)                    sb.Append(ts[i].C);
 21分析midea0978的《一个C#算法分析求解》(三)(完)                }

 22分析midea0978的《一个C#算法分析求解》(三)(完)                Console.WriteLine(sb.ToString());
 23分析midea0978的《一个C#算法分析求解》(三)(完)                //如果需要取得所有结果,只需要把下面改成return false;
 24分析midea0978的《一个C#算法分析求解》(三)(完)                //return false;
 25分析midea0978的《一个C#算法分析求解》(三)(完)                return true;
 26分析midea0978的《一个C#算法分析求解》(三)(完)            }

 27分析midea0978的《一个C#算法分析求解》(三)(完)
 28分析midea0978的《一个C#算法分析求解》(三)(完)            //递归过程
 29分析midea0978的《一个C#算法分析求解》(三)(完)            List<Int32> list = new List<int>();
 30分析midea0978的《一个C#算法分析求解》(三)(完)            //排除锁定项
 31分析midea0978的《一个C#算法分析求解》(三)(完)            foreach (Int32 t in lists[start])
 32分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)            分析midea0978的《一个C#算法分析求解》(三)(完){
 33分析midea0978的《一个C#算法分析求解》(三)(完)                if (!locks.Contains(t)) list.Add(t);
 34分析midea0978的《一个C#算法分析求解》(三)(完)            }

 35分析midea0978的《一个C#算法分析求解》(三)(完)            if (list.Count < 1return true;
 36分析midea0978的《一个C#算法分析求解》(三)(完)            list.Sort(IntSort);
 37分析midea0978的《一个C#算法分析求解》(三)(完)
 38分析midea0978的《一个C#算法分析求解》(三)(完)            CharObject A = ts[list[0]];
 39分析midea0978的《一个C#算法分析求解》(三)(完)            Byte[] Bts = A.Bts;
 40分析midea0978的《一个C#算法分析求解》(三)(完)            Byte[] Bts2 = A.Bts2;
 41分析midea0978的《一个C#算法分析求解》(三)(完)
 42分析midea0978的《一个C#算法分析求解》(三)(完)            //处理start以下的字节
 43分析midea0978的《一个C#算法分析求解》(三)(完)            //上层递归最多到达start处,而本层就要用到start-1了,
 44分析midea0978的《一个C#算法分析求解》(三)(完)            //处理一下,以免别的子递归曾经修改过start-1
 45分析midea0978的《一个C#算法分析求解》(三)(完)            if (start > 0) Bts[start - 1= 0;
 46分析midea0978的《一个C#算法分析求解》(三)(完)
 47分析midea0978的《一个C#算法分析求解》(三)(完)            //备份A控制的两个字节,而不一定是Bts[start]和Bts[start-1]
 48分析midea0978的《一个C#算法分析求解》(三)(完)            Byte[] temp_a = new Byte[2];
 49分析midea0978的《一个C#算法分析求解》(三)(完)            temp_a[0= Bts[A.K];
 50分析midea0978的《一个C#算法分析求解》(三)(完)            temp_a[1= Bts[A.M];
 51分析midea0978的《一个C#算法分析求解》(三)(完)            foreach (Int32 a in A.NList)
 52分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)            分析midea0978的《一个C#算法分析求解》(三)(完){
 53分析midea0978的《一个C#算法分析求解》(三)(完)                Bts[A.K] = temp_a[0];
 54分析midea0978的《一个C#算法分析求解》(三)(完)                Bts[A.M] = temp_a[1];
 55分析midea0978的《一个C#算法分析求解》(三)(完)                A.N = a;
 56分析midea0978的《一个C#算法分析求解》(三)(完)                A.Cal();
 57分析midea0978的《一个C#算法分析求解》(三)(完)                if (list.Count < 2)
 58分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)                分析midea0978的《一个C#算法分析求解》(三)(完){
 59分析midea0978的《一个C#算法分析求解》(三)(完)                    if (Bts[start] != Bts2[start]) continue;
 60分析midea0978的《一个C#算法分析求解》(三)(完)                    locks.Add(A.ID);
 61分析midea0978的《一个C#算法分析求解》(三)(完)                    if (Find(ts, locks, lists, start - 1)) return true;
 62分析midea0978的《一个C#算法分析求解》(三)(完)                    locks.Remove(A.ID);
 63分析midea0978的《一个C#算法分析求解》(三)(完)                    continue;
 64分析midea0978的《一个C#算法分析求解》(三)(完)                }

 65分析midea0978的《一个C#算法分析求解》(三)(完)                CharObject B = ts[list[1]];
 66分析midea0978的《一个C#算法分析求解》(三)(完)                Byte[] temp_b = new Byte[2];
 67分析midea0978的《一个C#算法分析求解》(三)(完)                temp_b[0= Bts[B.K];
 68分析midea0978的《一个C#算法分析求解》(三)(完)                temp_b[1= Bts[B.M];
 69分析midea0978的《一个C#算法分析求解》(三)(完)                foreach (Int32 b in B.NList)
 70分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)                分析midea0978的《一个C#算法分析求解》(三)(完){
 71分析midea0978的《一个C#算法分析求解》(三)(完)                    Bts[B.K] = temp_b[0];
 72分析midea0978的《一个C#算法分析求解》(三)(完)                    Bts[B.M] = temp_b[1];
 73分析midea0978的《一个C#算法分析求解》(三)(完)                    B.N = b;
 74分析midea0978的《一个C#算法分析求解》(三)(完)                    B.Cal();
 75分析midea0978的《一个C#算法分析求解》(三)(完)                    if (list.Count < 3)
 76分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)                    分析midea0978的《一个C#算法分析求解》(三)(完){
 77分析midea0978的《一个C#算法分析求解》(三)(完)                        //有限个数控制,马上判断
 78分析midea0978的《一个C#算法分析求解》(三)(完)                        if (Bts[start] != Bts2[start]) continue;
 79分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Add(A.ID);
 80分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Add(B.ID);
 81分析midea0978的《一个C#算法分析求解》(三)(完)                        if (Find(ts, locks, lists, start - 1)) return true;
 82分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Remove(A.ID);
 83分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Remove(B.ID);
 84分析midea0978的《一个C#算法分析求解》(三)(完)                        continue;
 85分析midea0978的《一个C#算法分析求解》(三)(完)                    }

 86分析midea0978的《一个C#算法分析求解》(三)(完)                    CharObject C = ts[list[2]];
 87分析midea0978的《一个C#算法分析求解》(三)(完)                    Byte[] temp_c = new Byte[2];
 88分析midea0978的《一个C#算法分析求解》(三)(完)                    temp_c[0= Bts[C.K];
 89分析midea0978的《一个C#算法分析求解》(三)(完)                    temp_c[1= Bts[C.M];
 90分析midea0978的《一个C#算法分析求解》(三)(完)                    foreach (Int32 c in C.NList)
 91分析midea0978的《一个C#算法分析求解》(三)(完)分析midea0978的《一个C#算法分析求解》(三)(完)                    分析midea0978的《一个C#算法分析求解》(三)(完){
 92分析midea0978的《一个C#算法分析求解》(三)(完)                        Bts[C.K] = temp_c[0];
 93分析midea0978的《一个C#算法分析求解》(三)(完)                        Bts[C.M] = temp_c[1];
 94分析midea0978的《一个C#算法分析求解》(三)(完)                        C.N = c;
 95分析midea0978的《一个C#算法分析求解》(三)(完)                        C.Cal();
 96分析midea0978的《一个C#算法分析求解》(三)(完)                        //有限个数控制,马上判断
 97分析midea0978的《一个C#算法分析求解》(三)(完)                        if (Bts[start] != Bts2[start]) continue;
 98分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Add(A.ID);
 99分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Add(B.ID);
100分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Add(C.ID);
101分析midea0978的《一个C#算法分析求解》(三)(完)                        if (Find(ts, locks, lists, start - 1)) return true;
102分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Remove(A.ID);
103分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Remove(B.ID);
104分析midea0978的《一个C#算法分析求解》(三)(完)                        locks.Remove(C.ID);
105分析midea0978的《一个C#算法分析求解》(三)(完)                    }

106分析midea0978的《一个C#算法分析求解》(三)(完)                    Bts[C.K] = temp_c[0];
107分析midea0978的《一个C#算法分析求解》(三)(完)                    Bts[C.M] = temp_c[1];
108分析midea0978的《一个C#算法分析求解》(三)(完)                }

109分析midea0978的《一个C#算法分析求解》(三)(完)                Bts[B.K] = temp_b[0];
110分析midea0978的《一个C#算法分析求解》(三)(完)                Bts[B.M] = temp_b[1];
111分析midea0978的《一个C#算法分析求解》(三)(完)            }

112分析midea0978的《一个C#算法分析求解》(三)(完)            Bts[A.K] = temp_a[0];
113分析midea0978的《一个C#算法分析求解》(三)(完)            Bts[A.M] = temp_a[1];
114分析midea0978的《一个C#算法分析求解》(三)(完)            return false;
115分析midea0978的《一个C#算法分析求解》(三)(完)        }

116分析midea0978的《一个C#算法分析求解》(三)(完)

 

我不相信神话,我只相信汗水!我不相信命运,我只相信双手!
上一篇:SAP Spartacus table cell如何通过cxOutlet在运行时动态注入组件


下一篇:解决 IllegalArgumentException: Could not resolve placeholder in string value "${XXXXXX}"