国产精品久av福利在线观看_亚洲一区国产精品_亚洲黄色一区二区三区_欧美成人xxxx_国产精品www_xxxxx欧美_国产精品久久婷婷六月丁香_国产特级毛片

錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務,錦州廣廈維修電腦,公司IT外包服務
topFlag1 設為首頁
topFlag3 收藏本站
 
maojin003 首 頁 公司介紹 服務項目 服務報價 維修流程 IT外包服務 服務器維護 技術文章 常見故障
錦州市廣廈電腦維修|上門維修電腦|上門做系統|0416-3905144熱誠服務技術文章
開心消消樂lua腳本解密

作者: wmsuper  日期:2017-05-25 16:07:33   來源: 本站整理

本帖最后由 wmsuper 于 2017-5-25 15:31 編輯

0x01 定位
開心消消樂lua的解析引擎在libhegame.so中,用IDA分析,發現很多函數并沒有符號,包括所使用的OpenSSL和Lua的第三方庫,增加了逆向的難度。
不過字符串并沒有加密,可以通過查找".lua" "load" 這些字符串找到關鍵地方,通過字符串可以快速定位到加載lua文件的地方。
[C] 純文本查看 復制代碼
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
025
026
027
028
029
030
031
032
033
034
035
036
037
038
039
040
041
042
043
044
045
046
047
048
049
050
051
052
053
054
055
056
057
058
059
060
061
062
063
064
065
066
067
068
069
070
071
072
073
074
075
076
077
078
079
080
081
082
083
084
085
086
087
088
089
090
091
092
093
094
095
096
097
098
099
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
void __fastcall lua_load(int a1)
{
  int v1; // r0@1
  int v2; // r3@1
  int *v3; // r0@3
  int v4; // r0@3
  signed int v5; // r7@3
  int v6; // r0@4
  int v7; // r0@6
  int v8; // r5@6
  int v9; // r6@12
  int v10; // r5@12
  int v11; // r0@15
  int v12; // r4@15
  int v13; // r5@17
  int v14; // r4@18
  int v15; // r5@7
  int v16; // r0@30
  int v17; // r6@30
  int v18; // r0@30
  int v19; // r0@30
  int v20; // r0@30
  int v21; // r0@30
  int v22; // r0@30
  int v23; // r0@30
  int v24; // r0@30
  int v25; // r6@30
  int v26; // r0@30
  int v27; // r0@31
  int v28; // r0@31
  int *v29; // r0@33
  const char *v30; // r1@33
  int v31; // r0@16
  int buf; // [sp+8h] [bp-108h]@4
  int v33; // [sp+Ch] [bp-104h]@3
  int v34; // [sp+10h] [bp-100h]@1
  int v35; // [sp+1Ch] [bp-F4h]@1
  char v36; // [sp+20h] [bp-F0h]@2
  int v37; // [sp+24h] [bp-ECh]@3
  char v38; // [sp+28h] [bp-E8h]@3
  char v39; // [sp+2Ch] [bp-E4h]@3
  char v40; // [sp+30h] [bp-E0h]@3
  int v41; // [sp+34h] [bp-DCh]@3
  unsigned int len; // [sp+38h] [bp-D8h]@6
  int v43; // [sp+3Ch] [bp-D4h]@18
  int out; // [sp+40h] [bp-D0h]@3
  int v45; // [sp+44h] [bp-CCh]@1
  char v46; // [sp+48h] [bp-C8h]@32
 
  v34 = a1;
  v1 = sub_30E100();
  sub_30D100((int)&v35, v1, (int)&v45);
  v2 = sub_30D6B0(&v35, ".lua", 0);
  if ( v2 == *(_DWORD *)(v35 - 12) - 4 )
  {
    sub_30D610(&v36, &v35, 0, v2);
    sub_30D300(&v35, &v36);
    sub_30D130((int)&v36);
  }
  sub_30D100((int)&v38, (int)".", (int)&out);
  sub_30D100((int)&v39, (int)"/", (int)&v45);
  sub_7011C(&v40, &v35, &v38, &v39);
  v3 = (int *)sub_30D140(&v40, ".lua");
  v37 = *v3;
  *v3 = (int)&unk_3F3A68;
  sub_30D130((int)&v40);
  sub_30D130((int)&v39);
  sub_30D130((int)&v38);
  v4 = sub_74CD8(&v41, "src/", &v37);
  v33 = 2;
  v5 = 0;
  do
  {
    v6 = sub_1219BC(v4);
    buf = (*(int (**)(void))(*(_DWORD *)v6 + 16))();
    if ( buf )
    {
      v7 = sub_656EC();
      v8 = len;
      if ( v7 )
      {
        sub_74CD8(&v45, "@", &v37);
        v15 = sub_30E110(v34, buf, v8, v45);    // 讀取lua文件
        sub_30D130((int)&v45);
        if ( v15 )
          v5 = 3;
      }
      else if ( len <= 0x10 )      //這里可以知道這個變量是文件的長度
{
        sub_68908("load_lua", "can not get enough file data of %s", v41);
        v5 = 5;
      }
      else
      {
        if ( !(dword_3E730C & 1) && sub_30D150(&dword_3E730C) )
        {
          byte_3E7310 = 0xE9u;
          byte_3E7311 = 0x74;
          byte_3E7313 = 0x92u;
          byte_3E7314 = 0xCCu;
          byte_3E7315 = 0x32;
          byte_3E7316 = 0x2E;
          byte_3E7319 = 0x2E;
          byte_3E731A = 0x7C;
          byte_3E731B = 0x34;
          byte_3E731C = 0x51;
          byte_3E731D = 0xD7u;
          byte_3E7312 = 0x7D;
          byte_3E7317 = 0x7D;
          byte_3E731E = 0xB3u;
          byte_3E7318 = 0x11;
          byte_3E731F = 0x6A;
          sub_30D160((int)&dword_3E730C);
        }
        v9 = len - 16;
        out = 0;
        v45 = 0;
        v10 = aes_cbc_decrypt((int)&byte_3E7310, buf, buf + 16, len - 16, &out);// 第一個參數為key aes解密 IV為文件開頭的16個字節
        if ( v10 || (v10 = aes_cbc_decrypt((int)&byte_3E7310, buf, buf + 16, v9, &out)) != 0 )
        {
          zib_decompress(out, v10, (const void **)&v45);// 解壓縮
          v12 = v11;
          if ( v11 || (zib_decompress(out, v10, (const void **)&v45), (v12 = v31) != 0) )
          {
            v13 = v45;
            if ( v12 > 3 && *(_BYTE *)v45 == 0xEF && *(_BYTE *)(v45 + 1) == 0xBB && *(_BYTE *)(v45 + 2) == 0xBF )
            {
              v13 = v45 + 3;
              v12 -= 3;
              sub_688EE("load_lua", "%s with utf-8 bom", v37);
            }
            sub_74CD8(&v43, "@", &v37);
            v14 = sub_30E110(v34, v13, v12, v43);
            sub_30D130((int)&v43);
            if ( v14 )
              v5 = 3;
          }
          else
          {
            v5 = 2;
          }
        }
        else
        {
          v5 = 1;
        }
        if ( v45 )
        {
          sub_30D490(v45);
          return;
        }
        if ( out )
          sub_30D490(out);
      }
      sub_30D490(buf);
      if ( !v5 )
        goto LABEL_44;
    }
    else
    {
      v4 = sub_68908("load_lua", "can not get file data of %s", v41);
      v5 = 4;
    }
    v33 = (v33 - 1) & 0xFF;
  }
  while ( v33 );
  if ( v5 )
  {
    v16 = sub_1219BC(v4);
    (*(void (__fastcall **)(int *, int, int))(*(_DWORD *)v16 + 28))(&v43, v16, v41);
    sub_30D6D0(&v45, 16);
    v17 = sub_30D690(&v45, "error loading module ");
    v18 = sub_30D790(v34, 1, 0);
    v19 = sub_30D690(v17, v18);
    v20 = sub_30D690(v19, " from file ");
    v21 = sub_30D690(v20, v43);
    v22 = sub_30D690(v21, ":\n\t");
    v23 = sub_30D690(v22, "fileSize:");
    v24 = sub_30E120(v23, len);
    v25 = sub_30D690(v24, "\n\tmessage: ");
    v26 = sub_30D790(v34, -1, 0);
    sub_30D690(v25, v26);
    switch ( v5 )
    {
      case 1:
      case 5:
        sub_30D690(&v45, ", decrypt error");
        v27 = sub_6CA3C(v43);
        v28 = sub_B1C10(v27);
        (*(void (**)(void))(*(_DWORD *)v28 + 12))();
        goto LABEL_32;
      case 2:
        v29 = &v45;
        v30 = ", uncompress error";
        break;
      case 3:
        v29 = &v45;
        v30 = ", load buff error";
        break;
      default:
        v29 = &v45;
        v30 = ", unknown error";
        break;
    }
    sub_30D690(v29, v30);
LABEL_32:
    sub_30D590(&out, &v46);
    sub_30E130(v34, out);
  }
LABEL_44:
  sub_30D130((int)&v41);
  sub_30D130((int)&v37);
  sub_30D130((int)&v35);
}


0x02 分析
調用的算法需要進行分析,原文件中并沒有aes_cbc_decrypt和zib_decompress這兩個符號,這是需要自己去分析函數功能,這個so調用了大量的第三方庫的接口,加密算法也是調用
OpenSSL的,所以只要熟悉下這些庫的接口,可以很方便確定加解密函數的功能和參數。
跟進aes_cbc_decrypt這個函數,有很明顯的調試字符串,就可以馬上確定所調用的是哪一個OpenSSL函數。(注:函數名稱是加上去的)
 

很快的就能確定函數原型為aes_cbc_decrypt(char*key,char*iv,char*inbuf,int inlen,char**outbuf);
于是可以推出key和iv的來源,很明顯key就是上面那一串密鑰,注意2和3參數,相差16,于是可以推出來IV就是文件的開頭16個字節
 

------------------------------------------------------------------------------------------------------------------
跟進zib_decompress這個函數,1.2.8可以確定用了zlib的inflateInit(strm),第一個參數v15就是zib_decompress函數的第一個參數a1,也就是說aes解密完成
就直接開始解壓,中間沒進行額外的處理。
 


 
0x03 解密算法編寫
從上面的分析可以知道,lua文件經過aes_cbc解密之后再進行解壓,解密算法如下:
[Python] 純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
def decdata(c):
    key='\xe9\x74\x7d\x92\xcc\x32\x2e\x7d\x11\x2e\x7c\x34\x51\xd7\xb3\x6a'
    iv=c[0:16]
    main_data=c[16:]
    cryptor = AES.new(key,AES.MODE_CBC,iv)
    pad_compress_data=cryptor.decrypt(main_data)
    str_len=len(pad_compress_data)
    pad=ord(pad_compress_data[-1])
    compress_data=pad_compress_data[0:str_len-pad]
    plain_text = zlib.decompress(compress_data)
    return plain_text



0x04 加密方案評價
1.編寫程序的時候由于過多的留下調試字符串導致程序容易被逆向(要利用#define DEBUG控制代碼編譯,release版的程序不應該包含這些字符串)
2.過多的利用第三方開源加密庫。開發者是比較喜歡使用別人造好的輪子,但是也給帶來安全性問題。
3.從解密出來的lua來看,消消樂的lua腳本沒經過編譯,這就導致了源碼泄露。


熱門文章
  • 機械革命S1 PRO-02 開機不顯示 黑...
  • 聯想ThinkPad NM-C641上電掉電點不...
  • 三星一體激光打印機SCX-4521F維修...
  • 通過串口命令查看EMMC擦寫次數和判...
  • IIS 8 開啟 GZIP壓縮來減少網絡請求...
  • 索尼kd-49x7500e背光一半暗且閃爍 ...
  • 樓宇對講門禁讀卡異常維修,讀卡芯...
  • 新款海信電視機始終停留在開機界面...
  • 常見打印機清零步驟
  • 安裝驅動時提示不包含數字簽名的解...
  • 共享打印機需要密碼的解決方法
  • 圖解Windows 7系統快速共享打印機的...
  • 錦州廣廈電腦上門維修

    報修電話:13840665804  QQ:174984393 (聯系人:毛先生)   
    E-Mail:174984393@qq.com
    維修中心地址:錦州廣廈電腦城
    ICP備案/許可證號:遼ICP備2023002984號-1
    上門服務區域: 遼寧錦州市區
    主要業務: 修電腦,電腦修理,電腦維護,上門維修電腦,黑屏藍屏死機故障排除,無線上網設置,IT服務外包,局域網組建,ADSL共享上網,路由器設置,數據恢復,密碼破解,光盤刻錄制作等服務

    技術支持:微軟等
    丁香亚洲综合激情啪啪综合| 欧美性开放视频| 精品久久久久久久久久久aⅴ| 五月天综合视频| 中文字幕色一区二区| 国产日韩欧美成人| 久久久精品在线| 亚洲电影免费观看| 欧美日韩国产影院| 国内自拍一区| 蜜芽tv福利在线视频| 日韩欧美在线观看免费| 亚洲成a人片在线www| 成人免费xxxxx在线观看| 日韩在线视频国产| 精品奇米国产一区二区三区| 欧美视频中文字幕在线| 中文字幕一区二区三区在线播放 | 亚洲免费在线播放视频| 欧美性潮喷xxxxx免费视频看| 亚洲一区999| 久久久电影一区二区三区| 天堂影院一区二区| 一区二区三区午夜视频| 伊人久久大香线蕉综合网蜜芽 | 日韩一二三在线视频播| 精品少妇一区二区三区日产乱码 | 久久新电视剧免费观看| 美国av一区二区| 日韩国产精品久久久| 国产精品久久久久9999高清| 婷婷亚洲综合| 亚洲欧美网站在线观看| 欧美一区91| 欧美黄色aaaa| 欧美日韩国产高清| 国内精品久久久久久久影视麻豆 | 亚洲影影院av| 91欧美激情另类亚洲| 国产精品美乳一区二区免费 | 日本成人免费视频| 小早川怜子久久精品中文字幕| 大尺度在线观看| 国产在线观看免费播放| 国产探花在线观看视频| 97免费公开视频| 久久免费一区| 国产有色视频色综合| 色伦专区97中文字幕| 日韩av在线不卡| 亚洲性无码av在线| 久久精品视频亚洲| 69av视频在线播放| 国产日韩在线看| 国产精品一区而去| 日韩欧美亚洲日产国产| 四虎4hu永久免费入口| 国产精品久久中文字幕| 欧美牲交a欧美牲交aⅴ免费下载| 乌克兰美女av| 91制片厂免费观看| 综合网五月天| 精品久久久久久久久久中文字幕| 久久国产色av免费观看| 日日夜夜精品视频免费观看| 在线观看成人av| 91精品国产毛片武则天| 久久久久久久久久久久久久国产| 一个色综合久久| 亚洲午夜福利在线观看| 久艹视频在线观看| 国产精品一区二区av白丝下载 | 51精品视频一区二区三区| 精品欧美一区二区久久 | 91精品久久久久久久久久另类| www日韩av| 小说区视频区图片区| 成人午夜视频免费在线观看| 一起草最新网址| 多男操一女视频| 无码免费一区二区三区| 少妇av一区二区| 免费黄漫在线观看| 在线资源免费观看| 国产婷婷视频在线| 亚洲精品一区二区在线播放∴| 欧美中文字幕一区二区| 日本麻豆一区二区三区视频| 亚洲网色网站| 久久精品免费观看| 亚洲免费在线视频| 欧美一区二区啪啪| 欧美国产精品va在线观看| 波多野结衣久草一区| av磁力番号网| 欧美xxxxx少妇| 伊人中文字幕在线观看| 视频一区二区精品的福利| 意大利激情丛林无删减版dvd| 曰本三级在线| 欧美猛男同性videos| 成人三级av在线| 欧美另类专区| 成人动漫一区二区在线| 91国在线观看| 九九久久久久99精品| 国产三区精品| 爱情岛论坛成人| 精品无码人妻一区二区三区| 日本福利片在线观看| 国产丰满美女做爰| 另类图片亚洲色图| 欧美家庭影院| 成人羞羞视频播放网站| 粉嫩久久99精品久久久久久夜 | 日韩在线国产精品| 精品视频在线观看| av地址在线观看| 中文字幕在线2019| 99免费视频| aaaaaaa大片免费看| 国产在线拍揄自揄拍视频| 精品盗摄女厕tp美女嘘嘘| 国产成人免费网站| 91精品国产手机| 国产一区视频在线| 一道本视频在线观看| 超碰超碰超碰超碰| 日韩在线观看第一页| 欧美高清videos性极品| 在线播放日本| 欧美日韩一二三四| 国产欧美综合在线| 色多多国产成人永久免费网站| 极品尤物一区二区三区| 中文字幕18页| 五月激情婷婷网| 又爽又大又黄a级毛片在线视频| 伊人精品一区| 日本一区二区免费在线观看视频| 中文字幕日韩免费视频| 亚州欧美日韩中文视频| 黄色一级片黄色| 久久久久久久久影院| 天天操夜夜操天天射| 欧美9999| 久久综合九色综合97_久久久| 亚洲男人天堂视频| 波多野结衣三级在线| 亚洲国产成人精品激情在线| 成人免费淫片免费观看| 白嫩白嫩国产精品| 久久久久久久久久久久久夜| 视频直播国产精品| 欧美这里只有精品| 日本视频www色| 高清性色生活片在线观看| 欧美激情日韩| 欧美日韩精品专区| 久久天天躁夜夜躁狠狠躁2022| 91香蕉视频网址| 一级片在线观看免费| 一区 二区 三区| 欧美日韩国产探花| 欧美精品成人一区二区三区四区| 91精品免费| 国产一区二区播放| 特级全黄一级毛片| 国产精品99视频| 欧美日韩亚洲高清| 成人av网站观看| 九九热最新地址| a天堂中文在线官网| 欧美不卡一区| 日韩欧美色电影| 女人床在线观看| 不卡视频在线播放| 亚洲精品永久免费视频| 99精品欧美一区| 97久久精品人搡人人玩| 成人免费看片载| 可以看av的网址| 久久国产影院| 99精品在线观看视频| 久久精品久久久久| 毛片毛片毛片毛| 波多野结衣一区二区三区在线 | 成人影音在线| 99re视频这里只有精品| 8x拔播拔播x8国产精品| 国产精品无码专区| 午夜免费福利视频| 深夜av在线| 国产蜜臀av在线一区二区三区| 国产精品露脸自拍| 毛片aaaaa| av免费在线观| 99精品1区2区| 国产日韩在线观看av| 国产精品一区二区6|