算法逆向解析,逆向匹配算法

  算法逆向解析,逆向匹配算法

  题目:KanxueSign函数的算法分析。恢复的代码在附件里,编译:gmain.cppbase64.c。

  1.解析:纯C算法的反向有很多ollvm,完成这个问题后可以更熟悉处理ollvm的程序。

  2.答:经过初步分析,算法的输入是MainActivity类的四个成员变量:firststalltime、packagecodpath、randomlong和starttime,与MainActivity.randomLong无关

  固定输入和良好的分析:

  老方法,用frida固定这四个变量的输入,方便记录分析。这里我的四个变量的值是:

  cls . start time . value=0x 17d 472 e 9806;

  cls . first install time . value=0x 17d 41d 64983;

  cls . random long . value=0x 49536 c 10125 AC 000;

  cls . package code path . value=/data/app/com . kanxue . oll VM _ ndk _ 11-7s jsh-MLUIRVBOWzGqFjjw==/base . apk ;算法的输出是36 b 0d 7 a 02 b 934 a 38 ffffd 51 f 0 be 37 c 661 FD 6896 e 81d 82 c 4 de 65 FB 194268 e9 CD 00 c 30110281011 c 0281007100 c 3028100b d 0190023 e 014 a 01a 0a 30281022 a 00。e 014 a 01900156015602 e 2023 e 010 b 022 a 011101 a 3010 b 02 c 702 c 7012 c 012d 01 c 10208019 c 0147012 c 0294023 a 01d 100 a 900 a 70249008601 ca 007202 b 60135009 e 02d 601 e 01 e 001 e 01 e 002 a 202028 b 02 8 b 00 c 3。

  三段结果:结果分为三段,分别用不同的算法处理,用sprintf组装。具体逻辑在sub_12AE4。

  1.第一段的结果是:36 b 0 D7 a 02 b 934 a 38 ffffd 51 f 0 be 37 c 661 FD 6896 e 81d 82 c 4 de 65 FB 194268 e9 CD,64字节。

  2、第二段的结果是00c 30110281011 c 028100 c 30281007100 c 300 BD 0190023 e014 a 01A 30281022 a 00A 8020400 be 014 a 01900156015602 e 2023 e 010 b 022 a 01101 a 3010 b 02 208019 c 0147012 c 0294023 a

  3.第三段的结果是ahryb 3 qmnhysa 3ml bqeoakqb 3 ysak==,可以看做是疑似base64的结果。

  第一种算法:sha256的常数是0x6a09e667,0xbb67ae85,实现函数是sub_1B1E8,但这个实现是sha256的变种,输入字符串有时是64字节的字符串,没有填充。通过nop,丢弃ollvm的控制块,修复真实块之间的关系,恢复ollvm指令的替换,得到sub _ 1b1e。

  v231=* v594

  v232=* v588

  v233=* v590

  v234=(无符号int)* v 591;

  v235=* v592

  v 587=a2 _ arg 1;

  v 654=a2 _ arg 1;

  v 236=a2 _ arg[1]24;

  v 237=(* v 654 ^0x ff 00 ffff)* v 654;

  v 238=((* v 654 8)^0x ff 00 ff 00)(* v 654 8);

  v 657=hi byte(a2 _ arg[1]);

  v658=v237

  v 659=v 657 (v 658 8);

  v660=v238

  v239=v659 v236

  v656=v239 v660

  v655=v656

  v581=v656

  sub_26300(v231,v661,v232,v589,v233,v234,v235,v593,v 656 1899447441);//2

  v240=* v593

  v241=* v594

  v242=* v589

  v243=* v590

  v244=(无符号int)* v 591;

  v 654=a2 _ arg 2;

  v 245=a2 _ arg[2]24;

  v 246=a2 _ arg[2]0x ff 0000;

  v 247=(a2 _ arg[2]8)0x ff 0000;

  v 657=hi byte(a2 _ arg[2]);

  v658=v246

  v 659=v 657 (v 658 8);

  v660=v247

  v 656=v 659 v 245 v 660;

  v655=v656

  v582=v656

  sub_26300(v240,v241,v661,v588,v242,v243,v244,v592,v 656-1245643825);//3

  v248=* v592

  v249=* v593

  v250=* v594

  v251=* v588

  v252=* v589

  v253=* v590

  v 587=a2 _ arg 3;

  v 654=a2 _ arg 3;

  v 254=a2 _ arg[3]24;

  v 255=a2 _ arg[3]0x ff 0000;

  v 256=(a2 _ arg[3]8)0x ff 0000;

  v 657=hi byte(a2 _ arg[3]);

  v658=v255

  v 659=v 657 (v 658 8);

  v660=v256

  v257=v659 v254

  v656=v257 v660

  v655=v656

  v578=v656

  sub_26300(v248,v249,v250,v661,v251,v252,v253,v591,v 656-373957723);//4这样的代码有64个,和sha256的处理一致。

  Sub_26300我用trace还原到这里。代码片段如下:

  .

  w15=0x 324 f 4353;

  w16=0x a 7 ea 7 AC 2;

  w13=w40xB

  w14=w40x15

  w19=w15(~ w13);

  w21=w13(~ w15);

  w22=w15(~ w14);

  w14=w14(~ w15);

  w19=w19 w21

  w15=w16(~ w6);

  w21=w22 w14

  w22=w16(~ w5);

  w5=w5(~ w16);

  w14=w6(~ w16);

  w23=w15 w14

  w5=w22 w5

  w17=w40x 19 w4(32-0x 19);

  w19=w19 ^ w21;

  w5=w23 ^(~ w5);

  w20=* w7 _ ptr

  w21=w19(~ w17);

  w19=w17(~ w19);

  -我.其实里边的指令是指令替换,一大堆的操作最后可能就是做了一个异或,只不过当时没看注意。

  第一段算法的运算流程如下:1启动时间和首次安装时间组合成字符串17d472e980617d41d64983 ,经过运算填充成64个字节的值为:

  2 ._将这个值送入第二季第8集中运算并保存下来,然后这个填充成64字节的数组每个元素再,再送入第二季第8集中运算。

  { 1 }接下来用沙256的填充(p)来处理packageCodePath(软件包代码路径),不过和标准的沙256的填充(p)区别在于最后的长度会多0x200,在维基百科中查到的填充(p)算法:

  填充(p)算法还原如下:

  请参见填充()

  {

  size _ t str _ len=apk _ path。长度();

  size=this-上舍入64(str _ len i18);

  数据=新的未签名char[size];

  memcpy(日期、APK _路径. c _字符串()、字符串长度);

  S7-1200可编程控制器:

  S7-1200可编程控制器:

  size _ t padding _ len=str _ len * 80x 200:

  S7-1200可编程控制器:

  S7-1200可编程控制器:

  S7-1200可编程控制器:

  S7-1200可编程控制器:

  S7-1200可编程控制器:

  S7-1200可编程控制器:

  数据[size-7]=padding _ len 48;

  S7-1200可编程控制器:

  }4填充完了以后的字符串会送入第二季第8集运算。

  5上一步的结果再填充为沙256的64个字节,送入第二季第8集运算得到最终结果。

  第二段算法的运算流程如下:第二段算法的还原代码为:

  请参见第二部分()

  {

  for(int I=0);I apk _ path。长度();(一)

  {

  无符号(同Internationalorganizations)国际组织索引=(无符号int)(random _ long % 5)(apk _ path。c _ str()[I]);

  未签名int v=dword _ 5c 008[索引];

  printf(%)。4x,v);

  }

  }其中S7-1200可编程控制器为642个内部的长度的数组,元素列表为:

  未签名的int dword _ 5c 008[]=>

  0x16a,0x 151.0 xd 7.0 x 134.0 x 196.0 x 229.0 x 67.0 xfa,

  0x 269.0 x 272.0 x 226.0 x 122.0 exec .0x 2b 5.0 x 216.0 x 214,

  0x 179.0 x9f,0x 277.0 x194.0 xf4.0 x2 ad,0x 0.0 xa 210,

  0x26d,0x 1 B1 b 9.0 x 257.0 x 2 c 9.0 x 9.0 x 9.0 x 1.0 x 16 c .0x 15 f,

  0x 99.0 x2 e 1.0 xbf,0x 1 c6.0 XB 4.0 x2d,0x16d,

  0x 4.0x 8 b .0x 25d .0x 108.0 x 11 b .0x 12 c .0x 14 a .0x xc3,

  0x 195.0 x 2c 7.0 xca . 0 x 207.0 x 206.0 x 1b 8.0 x 1至0.0 x 12d,

  0x 93.0 x2 df、0x 205.0 xaa、0x8b、0x9b、0x1df、

  0x 288.0 x 200.0 x 86.0 x 169.0 x 211.0 x 297.0 x 2d 6.0 x 135,

  0 x 223.0 xa 9.0 x 208.0 x 1至2.0 x 23 a.0 x 294.0 x 1 ad.0 x 1 AC

  0x1和2.0x 102.0 xa 7.0x 19 c .0x 2 b 1.0 x 1d 1.0 x 249.0 x 72,

  0 xd 4.0 x1 DD . 0 x 173.0 XB 5.0 x 17a . 0 xe 1.0 xa 5.0 x 10b,

  0x 9.0 x 281.0 x 12b.0 xbd .0x 111.0 xbe .0x 1至9.0x 105,

  0 x 147.0 x 82.0 x 1和0.0 x 1至3.0 x 156.0 x 23 e.0 x 22 a.0 x 190

  0x 71.0 x 9 e .0x 16 b .0x 1.0 x 11 c .0x 204.0 x 2 e 2.0 x 2 a2,

  B2 6.0 x 9.0 x 239.0 x 116.0 x 2至7.0 xd 1,

  0x 273.0 x 6c . 0 x 21c . 0 x 2.0 xeb .0x 2d 0.0 x 1 db .0x 6b,

  0x 232.0 xef,0x 85.0x 13 f,0x 5.0x 9d,0x 8.0x 267,

  0x 1 f 2.0 x 75.0 x 246.0 x 1d 8.0 x 13 b .0x 2d 7.0 x 2 AC .0x xd 5,

  0 x 187.0 x 29 c . 0 x 176.0 x 131.0 x 28d . 0 x 91.0 x 6.0 x 114,

  0x 8.0 x 275.0 x 11a .0x 26 c .0x 110.0 x 2 aa .0x 1 c 3.0 x 19 f,

  0x1到8.0x 279.0 x2de .0x 15d .0x 2db .0x 6a .0x 230.0 x68,

  0 x 178.0 x 2 BD,0 x 217.0 x 146.0 x 186.0 x 1和6.0 x 1 b1.0 x 143,

  0x2和3.0x 2 af、0x8e、0x 1 D1 0.0x 1 de、0x 260.0x 81,

  0x 193.0 x 266.0 x 231.0 x D1 x d 2.0 xba . 0 x 240.0 x 18e . 0 x 7e,

  0x 1.0x 1 f1、0x1fe、0x 2 a 3.0x 250.0x 13 a、0x24a、0x64,

  0x29a,0x24b,0x2ca,0x 188.0 xfd,0x 103.0 x 100.0 x 1d 9,

  0x9a,0x1f3,0x182,0x7d,0x xd,0x11f,0x27e,

  0x 1 B1 x 4.0 x 215.0 x 8 f.0 x 263.0 x 192.0 x 150.0 x 17 d.0 x 2 a4,

  0x 154.0 x2b,0x14f,0x12f,0x29f,0x2ba,0x 237.0 x2 BC,

  0x 126.0 x1 FD .0x 168.0 x2 c5.0x 254.0 x2和0.0x 1 C1 c9.0x 201,

  0x 172.0 x 140.0 x 138.0 x 0.0 x 1.0 x B0 x 2 DD . 0 x 19 e,

  0x1和7.0x 160.0 x 13 e .0x 7a .0x 1cb .0x 28 c .0x 7f .0x 9,

  0x14e,0x 2 b8.0x 101.0x 1 ea,0x 1 d7.0x 1 f7.0x 276.0x 1 C2,

  0x8a,0x2cf,0x238,0x2ae,0x94,0x157,0x175,

  0x21f、0x2c2、0x2、0x130、0x104、0x24d、0x222、

  0x 221.0 x 18 c .0x 1 fa .0x 1 fc .0x 1 b 5.0 x 87.0 x 2 be .0x 1 af,

  0x 1b 7.0 x 2.0 x 22 b .0x 10 a .0x 19 b .0x 121.0 x 198.0 x 148,

  0x 1f 16.0 x 280.0 x 132.0 x 17 b .0x 1bb .0x xcd .0x 20 e .0x 2bb,

  0个XB 7.0 x1 cc、0个x4.0个x2到6.0个264.0个x1ef、0个x1个251.0个x76个,

  0x 171.0 x2 DC,0x 236.0 x25f,0x 159.0 x1 a4.0x 1 f4.0x 118,

  0x17e,0x 106.0 x 115.0 x 262.0 x 1至6.0 x 185.0 x 1 f5.0 x 29 b,

  0x29e,0x13d,0x9c,0x 224.0 xc 5.0x 219.0x 25 c,0x149,

  0x 88.0 x 137.0 x 2至9.0 XB 2.0 x 139.0 x 24 e.0 x 183.0 x 235,

  0x1fb、0x15b、0x 7、0x1c5、0x 9、0x26b、0x7b、0x1和4x,

  0x 7.0x 2 c 6.0x 22 f .0x 16 f .0x 2.0x c .0x 177.0 x 1 CD,

  0x 241.0 x2 ce .0x 1 be .0x 1 BC .0x 7c .0x 1 e 3.0 x 258.0 x 2 B0,

  0 x 125.0 xa 6.0 x 2d 1.0 x 1b 6.0 xcf 0 x 278.0 x 18d,

  0x 155.0 x1 ab,0x 1 f 8.0 x 270.0 x 1d 5.0 x 2 c 1.0 x 1 b 1.0 x 27 f,

  0x 74.0 x1 AE,0x 7.0 x2到5x 5.0 xd 0.0 x 98.0 x 141.0 x 289,

  0x 1f 10.0 x 1aa .0x 1bf .0x 2cd .0x 1c 8.0 x 2b 7.0 x 296.0 x 299,

  0x6f,0x17c,0x 8.0x 77.0x 124.0x 8.0x 18 f,0x26e,

  0x2bf、0x1dc、0x21a、0x 209.0x 20 a、0x18a、0x 274.0x 1 AC、

  0x 28 a .0x 109.0 x 1 ee .0x 73.0 x 2 b 3.0 x 136.0 x 234.0 x1 da,

  0x10d,0x27a,0x2d4,0x22e,0x2c4,0x83,0x261,0x18b,

  0x20f,0x 167.0 x1 e 5.0x 1 f 9.0 x 252.0 x1 e 8.0 x89.0 x25e,

  0x23c,0x129,0x 3.0 xbc,0x 284.0x 112.0x 11d,0x22d,

  0x 3.0x 15 c .0x 10 f .0x 2.0x 15 e .0x 298.0 x 28 e,

  0x2cc,0xea,0x 120.0 x 145.0 xf 3.0 x 202.0 x 197.0 x 181,

  0x 2 c3.0x 170.0x 1至7.0x 78.0x 6.0x 0.0x 1.0x 1 ff,

  0x 295.0 x 213.0 xc 8.0 x 164.0 x 22c.0 x 10c.0 x D1 d 4.0 xcb,

  0x 165.0 x1 EC、0x 282.0 x1 BD、0x 0.0x 24 f、0x80、

  0x29d,0x 5.0x 14d,0x 4.0x 16 e,0x 158.0x 152,

  0x 6.0x 6d,0x 3.0x 212.0 x 184.0 x 153.0 x 180.0 x 66,

  0 x 228.0 x 220.0 x 259.0 x 2 ab、0 x 70.0 x 27d、0 x 2 b 9.0 x 291、

  0xed,0xaf,0x 127.0 x 255.0 x 123.0 x 90.0 x 293.0 xf0,

  0x 271.0 x 247.0 x 162.0 x 27c.0 x 203.0 x 119.0 x 218.0 xfe,

  0x 1 C1 c 0.0x 1 c 4.0x 163.0 x 243.0 x 14 c .0x 1d 6.0 x 1 E1和1.0x 65,

  0x12a,0x2da,0x292,0x 6.0x 11 e,0x20d,0x25b,0x144,

  0x 5.0 xa 3.0 x 8c.0 x 283.0 x1 cf0x 96.0 x 191.0 x 2 A0,

  0x 225.0 x 199.0 x 242.0 x 92.0 x 107.0 x 21e.0 x 166.0 x 8d,

  0x 290.0 x24 c、0x 285.0 x 287.0 x 113.0 x 133.0 x 13c.0 x 10e,

  0x17f,0x1eb,0x 3.0x 233.0x 26 f,0x 265.0x 26 a,0x xd 6,

  0x19d、0x15a、0x256、0x1a1至1个1.0x 23 f、0x6e、0x1至5x 5,

  0x 245.0 x2 c 8.0 x1 ed .0x 20c . 0 xdd .0x 2 b 4.0 x 21b .0x 1 C7,

  0 xa 4.0 x 97.0 x 1 B1 b 3.0 x 2 CB . 0 x 174.0 x 1 b 2.0 x 27 b . 0 x 189,

  0x20b,0x23d,0x142,0x28f,0x69,0x79,0x2b2,

  0x1ce、0x12e、0x 2 a 8.0x 268.0x 95.0x 25 a、0x 227.0x 8,

  0x 253.0 xee,0 XB 9.0x 19 a,0x1ba,0x 161.0 x1 d3.0x 2 c0,

  0x 128.0 x2 a1.0x ff.0x 117.0x 1和9.0x 84.0x 286.0x 248,

  0x 0.0x 0 };当时看到这么大的数组,就怀疑是不是哪个算法的常量,我没看出来,但可以确定的是确实是个常量数组。

  第三段算法:是一个改了字典表的64号基地,字典表如下:

  也就是0123456789-_ abcdefghijklmnoprt qrstwzy abcdefghijmnoprstuwyz=

  还原代码如下:

  请参见第三部分()

  {

  S7-1200可编程控制器:

  base 64 _ encode((常量字节*)start time _首次安装时间。c _ str()、buf、startime _ first安装时间。长度()、1);

  printf("% s ",buf);

  }来自51吨重博客作者小二上酒8的原创作品,

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: