吾愛破解 - LCG - LSG |安卓破解|病毒分析|001aa.com

 找回密碼
 注冊[Register]

QQ登錄

只需一步,快速開始

搜索
查看: 7266|回復: 69

[原創] 摩爾莊園頁游數據包加密算法逆向及復現

  [復制鏈接]
樓主
FinchK 發表于 2020-5-18 17:08 回帖獎勵

0x1 前言

时时彩平台​ 本文對摩爾莊園頁游進行逆向與分析,解密并復現其核心加解密算法。本思路也適用于其他形式的加解密算法分析過程,尤其是對flascc技術(一種能夠在flash中運行C++編譯生成的字節碼的技術)進行逆向分析。

0x2 所用工具

​ WireShark(數據包抓包)

​ ffdec(Flash反編譯)

0x3 逆向分析過程

​ 首先,我們進入游戲,使用抓包工具抓得swf文件,嘗試反編譯,發現其加密。

​ 我們使用ffdec提供的“搜索內存中的SWF”功能,嘗試直接從內存中dump出swf文件。

时时彩平台​ 這里有個小技巧。當下的瀏覽器為了追求穩定和渲染速度都采用一種技術,將多個頁面分為多個進程,很難確定游戲頁面到底在哪一個進程里面。我這里自己寫了個單進程的小程序。

时时彩平台​ 這樣就能輕松dump出我們想要的swf文件了。對文件大小排個序,剔除掉尺寸特別大的,然后逐個反編譯。最終我們找到了核心加解密算法所在的文件。

​ 看看反編譯的結果:

package com.fcc
{
   import avm2.intrinsics.memory.li8;
   import avm2.intrinsics.memory.si32;
   import avm2.intrinsics.memory.si8;
   import flash.utils.ByteArray;
   import flash.utils.getDefinitionByName;
   import sample.MEncrypt.CModule;
   import sample.MEncrypt.ESP;
   import sample.MEncrypt.F_malloc;
   import sample.MEncrypt.eax;
   import sample.MEncrypt__3A__5C_Development_5C_Crossbridge_5C_cygwin_5C_tmp_5C_cc4krDaY_2E_lto_2E_bc_3A_d3346e37_2D_9080_2D_43e6_2D_a632_2D_6710752e3a2f.F_IDAlloc;
   import sample.MEncrypt__3A__5C_Development_5C_Crossbridge_5C_cygwin_5C_tmp_5C_cc4krDaY_2E_lto_2E_bc_3A_d3346e37_2D_9080_2D_43e6_2D_a632_2D_6710752e3a2f.L__2E_str5;

   public function MDecrypt(param1:ByteArray, param2:int, param3:ByteArray) : void
   {
      var _loc6_:* = 0;
      var _loc17_:* = 0;
      var _loc16_:int = 0;
      var _loc10_:* = 0;
      var _loc13_:int = 0;
      var _loc14_:int = 0;
      var _loc12_:int = 0;
      var _loc11_:* = 0;
      var _loc9_:* = 0;
      var _loc7_:* = 0;
      var _loc5_:* = int(ESP);
      _loc6_ = _loc5_;
      ESP = _loc5_ & -16;
      var _loc4_:* = int(getDefinitionByName("com.taomee.mole.net.ConnectionServerAgent").size);
      if(_loc4_ == 5477)
      {
         ESP = _loc5_ & -16;
         _loc17_ = param2;
         _loc5_ = int(_loc5_ - 16);
         si32(_loc17_,_loc5_);
         ESP = _loc5_;
         F_malloc();
         _loc5_ = int(_loc5_ + 16);
         _loc16_ = eax;
         ESP = _loc5_ & -16;
         CModule.writeBytes(_loc16_,_loc17_,param1);
         _loc5_ = int(_loc5_ - 16);
         _loc14_ = _loc17_ + -1;
         si32(_loc14_,_loc5_);
         ESP = _loc5_;
         F_malloc();
         _loc5_ = int(_loc5_ + 16);
         _loc13_ = eax;
         if(_loc14_ >= 1)
         {
            _loc12_ = _loc16_ + 1;
            _loc11_ = int(_loc17_ + -1);
            _loc10_ = li8(_loc16_);
            _loc9_ = _loc13_;
            do
            {
               _loc4_ = _loc10_ & 224;
               var _loc8_:int = _loc4_ >>> 5;
               _loc10_ = li8(_loc12_);
               _loc4_ = _loc10_ << 3;
               _loc4_ = _loc4_ | _loc8_;
               si8(_loc4_,_loc9_);
               _loc12_ = _loc12_ + 1;
               _loc11_ = int(_loc11_ + -1);
               _loc9_ = int(_loc9_ + 1);
            }
            while(_loc11_ != 0);

            if(_loc14_ >= 1)
            {
               _loc12_ = _loc17_ + -1;
               _loc11_ = _loc13_;
               _loc7_ = 0;
               do
               {
                  _loc10_ = li8(_loc11_);
                  _loc9_ = 0;
                  _loc17_ = int(L__2E_str5);
                  if(_loc7_ != 21)
                  {
                     _loc17_ = int(L__2E_str5 + _loc7_);
                     _loc9_ = int(_loc7_ + 1);
                  }
                  _loc4_ = li8(_loc17_);
                  _loc4_ = _loc4_ ^ _loc10_;
                  si8(_loc4_,_loc11_);
                  _loc11_ = int(_loc11_ + 1);
                  _loc12_ = _loc12_ + -1;
                  _loc7_ = _loc9_;
               }
               while(_loc12_ != 0);

            }
         }
         if(_loc16_ != 0)
         {
            _loc5_ = int(_loc5_ - 16);
            si32(_loc16_,_loc5_);
            ESP = _loc5_;
            F_idalloc();
            _loc5_ = int(_loc5_ + 16);
         }
         ESP = _loc5_ & -16;
         CModule.readBytes(_loc13_,_loc14_,param3);
         if(_loc13_ != 0)
         {
            _loc5_ = int(_loc5_ - 16);
            si32(_loc13_,_loc5_);
            ESP = _loc5_;
            F_idalloc();
            _loc5_ = int(_loc5_ + 16);
         }
      }
      _loc5_ = _loc6_;
      ESP = _loc5_;
      return undefined;
   }
}

时时彩平台​ 相信各位看了后也感覺這代碼的可讀性的確不佳,在此我對它進行簡單的解讀。

​ 首先介紹一下代碼中所用到的一些函數:

函數簽名 函數解釋
CModule.readBytes(sourceAddress,count,target) 將源地址的數據寫到as代碼的變量中
CModule.writeBytes(targetAddress,count,source) 將as代碼的變量的值寫到目標地址中
si32/si16/si8(value,address) 將定長(8/16/32位)的值寫到地址中
li32/li16/li8(address) 從地址中讀取定長的數據(8/16/32位)

时时彩平台​ 因為Flash技術的過時,因此我之前并沒有接觸過ActionScript和Flascc技術,但是相信大家看到這里,應該敏感的發現,這類函數似乎是在模擬底層的內存讀寫。并且,我們還發現反編譯代碼中有“ESP”,“eax”這樣的關鍵詞,可以大膽的猜測,flascc技術應該是模擬了一個虛擬的運行環境,包含虛擬文件系統,標準的C函數等,這樣的代碼更接近于匯編代碼。

​ 我們通過分析匯編代碼的思路,直接分析這個反編譯代碼,發現其不過是先對每一個byte的8bit進行拆分的預處理,然后異或一個常量值(L__2E_str5),這里的關鍵就是找到這個常量值在哪。

​ 我們找到這個變量定義的地方:

时时彩平台​ 繼續查找定義:

​ 發現其數據拷貝自DS2這個類,我們查看這個swf文件的二進制數據塊:

​ 發現了我們想要的:

​ 查看其內容(計算數據偏移:208=0xD0):

时时彩平台​ 嗯,應該是這個沒錯了。我們直接寫一個python腳本,抓取數據包測試我們的加解密函數。

时时彩平台​ 這里我們選擇抓取喊話數據包,因為如果我們的解密算法正確,那么我們解密后的數據包中就能看到我們所發送的字符。

​ 抓到包了,丟進python腳本試試。

​ 成功了,看到了我發送的文本。

0x4 后記

​ 話說淘米這算法是真坑啊,當初以為是循環異或,下標應該是0,1,2...n,0,1,2...這樣循環的,沒想到nt開發者竟然是這樣設計的:0,1,2...n,0,0,1,2...給我整了兩個0,我都懵了。

时时彩平台​ 其實有了這算法,加上swf反編譯后的那些代碼,可以做一個真正的云玩家了,懂我意思吧。

0x5 附錄

免費評分

參與人數 39威望 +2 吾愛幣 +136 熱心值 +37 收起 理由
RyanLuo + 1 + 1 謝謝@Thanks!
Harson + 1 + 1 用心討論,共獲提升!
Daemonicly + 1 + 1 我很贊同!
bricher9988 + 1 + 1 謝謝@Thanks!
volcanocan + 1 + 1 用心討論,共獲提升!
dillane + 1 用心討論,共獲提升!
乄落日乀 + 1 + 1 用心討論,共獲提升!
DDFer + 1 + 1 大佬&amp;amp;#128002;&amp;amp;#127866;
中二二 + 1 歡迎分析討論交流,吾愛破解論壇有你更精彩!
xQAQx + 1 + 1 我很贊同!
zeroyearn + 1 + 1 謝謝@Thanks!
q105277951 + 1 + 1 歡迎分析討論交流,吾愛破解論壇有你更精彩!
gaosld + 1 + 1 熱心回復!
Naxior + 1 + 1 用心討論,共獲提升!
sktline + 1 我很贊同!
37566454 + 1 + 1 用心討論,共獲提升!
jnez112358 + 1 + 1 謝謝@Thanks!
獨行風云 + 1 + 1 用心討論,共獲提升!
x51zqq + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
Hmily + 2 + 100 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
香煙烈酒無睡意 + 1 + 1 謝謝@Thanks!
3141592654 + 1 用心討論,共獲提升!
雪之下陽乃 + 1 + 1 熱心回復!
東方學痞 + 1 + 1 熱心回復!
Roberick + 1 我很贊同!
冷淘 + 1 我很贊同!
972038516 + 1 + 1 我很贊同!
blywq + 1 + 1 謝謝@Thanks!
七尺大豆腐 + 1 + 1 熱心回復!
tbb233 + 1 + 1 用心討論,共獲提升!
地球守護者 + 1 + 1 用心討論,共獲提升!
wxc6688 + 2 + 1 我很贊同!
憶魂丶天雷 + 1 + 1 我很贊同!
笙若 + 1 + 1 感謝發布原創作品,吾愛破解論壇因你更精彩!
濤之雨 + 3 + 1 分析到這里應該是目前來說這個游戲能做出的最大貢獻 了
巴別塔 + 1 熱心回復!
Agzcx + 1 + 1 用心討論,共獲提升!
dddl + 1 + 1 我很贊同!
牧魚龍 + 1 + 1 用心討論,共獲提升!

查看全部評分

本帖被以下淘專輯推薦:

發帖前要善用論壇搜索功能,那里可能會有你要找的答案或者已經有人發布過相同內容了,請勿重復發帖。

推薦
JoeW 發表于 2020-5-18 22:54
0202年了還有人搗鼓摩爾莊園真是不容易啊,我還以為除了搞輔助的人之外沒人對這游戲感興趣了呢,lz辛苦了。現在雖然沒關服,但也不會再更新了,當個養老游戲玩玩還好,官方對輔助的態度也是睜一只眼閉一只眼,不做太出格的事也不會封你號,畢竟這游戲已經不能盈利了。說實話對輔助里面的一部分功能我還是挺好奇運行的原理是什么的。
沙發
Eaysuild.xean 發表于 2020-5-18 17:52
3#
吞茶嚼花 發表于 2020-5-18 18:47
4#
totoroyyw 發表于 2020-5-18 19:28
淘米也有人干了 有趣
5#
肌肉猛男吳亦凡 發表于 2020-5-18 19:48
```牛嗷
6#
私心作怪 發表于 2020-5-18 20:12
哈哈哈  讓我康康誰還玩這個
7#
yawang 發表于 2020-5-18 21:06
愛了愛了
9#
52pjShiron 發表于 2020-5-18 23:02
17roco可以安排一下嘛哈哈哈
10#
小飛蟲 發表于 2020-5-18 23:29
下一個目標:賽爾號

點評

似乎挺難的,論壇以前有個大佬拓海真一做過輔助沒多久就失效了  發表于 2020-5-22 21:36
您需要登錄后才可以回帖 登錄 | 注冊[Register]

本版積分規則 警告:本版塊禁止灌水或回復與主題無關內容,違者重罰!

快速回復 收藏帖子 返回列表 搜索

RSS訂閱|小黑屋|聯系我們|吾愛破解 - LCG - LSG ( )

GMT+8, 2020-5-28 21:44

Powered by Discuz!

时时彩平台Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表
时时彩平台官网-欢迎您 时时彩平台注册-爱问知识人 时时彩平台app-互动百科 时时彩平台投注-百科词条 超级快三-搜霸天下 时时彩平台邀请码-即可搜索 时时彩平台开户-新浪爱彩 彩神大发快三-一定牛 彩神大发快三官网-360云盘 彩神大发快三注册-百度耨米