1. 程式人生 > >微信分身,微信多開,微信雙開

微信分身,微信多開,微信雙開

2016-07-08 更新

由於公司放棄該方案哪就不壓箱底了,開源造福人類,呵呵

先說一下實現雙開(多開)的幾種方案

  1. 靜態修改APK包名,然後重打包
    • 作為廠商肯定不推薦這個方式拉,可能存在法律風險
  2. 動態修改APK包名
    • 對原生程式碼修改量小,相容性差,部分APP需單獨適配
  3. 動態修改程序的例項
    • 對原生程式碼修改量大,相容性一般,可能會導致系統一些亂七八糟的BUG
  4. 通過多使用者機制實現
    • MIUI的實現機制,更多的是修改多使用者在相關的程式碼
  5. 通過動態載入(執行)的機制來實現(LBE的平行空間)
    • 作為第三方開發者,不能ROOT,不能修改系統原始碼,逼的LBE用這種方式,也是難為他們了

上面幾種方式是常見的幾種方式,我選擇的是方式2,之所以用第2種方式是由於去年年底友商也只出了微信的雙開,從技術角度我需要儘快跟進,所以用了一個程式碼修改量小,門檻不算高的方式快速跟進。

OK,接下來我詳細說一下方式2的細節。

我們分為兩部分:

  1. 安裝部分
    1. APP安裝流程就不科普了,操作是這樣的,先安裝微信,然後再一次安裝微信,這個時候會在系統裡存在兩個微信,當然原生程式碼做了校驗,我們修改了關鍵函式校驗程式碼,通過PackageInstaller第二次安裝微信的流程如下:
      PackageManagerServer::installPackageLI // 安裝函式
                  //#[email protected] {@
                  if ( ((installFlags & PackageManager.INSTALL_WEIXIN_CLONE) != 0) ) {
                      pkg = pp.parsePackage(tmpPackageFile, parseFlags | PackageParser.PARSE_CLONE_WEIXIN);
                  } else {
                      pkg = pp.parsePackage(tmpPackageFile, parseFlags);
                  }
                  // @}
      PackageParser::parsePackageSplitNames // 解析函式
              //#[email protected] {@
              if ((flags & PARSE_CLONE_WEIXIN) != 0) {
                  //Log.i("yunajie", "parsePackageSplitNames::printStackTrace1: " + packageName);
                  //new Exception().printStackTrace();
                  //Log.i("yunajie", "parsePackageSplitNames::printStackTrace2");
                  if ("com.tencent.mm".compareToIgnoreCase(packageName) == 0) {
                      boolean bInstallWeixinShadow = false;
                      Throwable throwable = new Throwable();
                      StackTraceElement[] stackElements = throwable.getStackTrace();
      
                      if (null != stackElements) {
                          for (int i = 0; i < stackElements.length; i++) {
                              String szMethodName = stackElements[i].getMethodName();
                              if ("installPackageLI".compareToIgnoreCase(szMethodName) ==  0 ||
                                   "scanPackageLI".compareToIgnoreCase(szMethodName) ==  0) {
                                  bInstallWeixinShadow = true;
                                  break;
                              }
                          }
                      }
      
                      throwable = null;
      
                      if (bInstallWeixinShadow) {
                          return Pair.create("com.tencent.mm2".intern(),
                                  (splitName != null) ? splitName.intern() : splitName);
                      }
                  }
              }
              // @}
      PackageParser::buildClassName // 處理一下類
                  //#[email protected] {@
                  if ("com.tencent.mm2".compareToIgnoreCase(pkg) == 0) {
                      return ("com.tencent.mm" + cls).intern();
                  }
                  // @}
       呵呵,到此為止,已經可以安裝兩個微信了,但實際上還執行不起來,看第2部分

  2. 執行部分
    1. 好了,當你看到桌面上有2個微信圖示是不是很興奮,結果執行不起來,開啟JNI日誌,檢視各種崩潰資訊我已經修改了絕大部分的問題了,主要是查詢類的時候路徑找不到,看程式碼了。
      class_linker::FindClass
        //#[email protected] {@
        LOG(INFO) << "yunajie::FindClass1: " << descriptor;
        std::string str_descriptor(descriptor);
        if (str_descriptor.find("tencent/mm2com") != std::string::npos) {
            str_descriptor.erase(1, 15);
        } else if (str_descriptor.find("tencent/mm2") != std::string::npos) {
            str_descriptor.erase(15, 1);
        }
        LOG(INFO) << "yunajie::FindClass2: " << str_descriptor;
        descriptor = const_cast<const char*>(str_descriptor.c_str());
        // @}
      是不是很簡單,對,就是很簡單。
  3. 後續總結
    1. 已經完美運行了,沒發現什麼問題,咦,發紅包崩潰啊,好,有包名校驗,改之:
      ContextWrapper::getPackageName
              //#[email protected] {@
              String pkg = mBase.getPackageName();
              if ("com.tencent.mm2".compareToIgnoreCase(pkg) == 0) {
                  Throwable throwable = new Throwable();
                  StackTraceElement[] stackElements = throwable.getStackTrace();
      
                  if (null != stackElements) {
                      for (int i = 0; i < stackElements.length; i++) {
                          if (stackElements[i].getClassName().indexOf("MyKeyboardWindow") > 0) {
                              pkg = "com.tencent.mm";
                              break;
                          }
                      }
                  }
      
                  throwable = null;
      
                  return pkg;
              }
              //@}

完。

====== 華麗的分割線 ======


自己來填坑了,360OS 的微信分身是如何實現的還不知道,因為手上拿到的手機無法ROOT,可以ROOT的手機已經在路上了。但這裡和大家分享一下思路:

  1. 我們知道可以通過修改包名達到共存的目的,對於微信這類的APP當然最好不要直接修改包名,我們可以在框架層動態的修改包名,騙過系統以為有兩個包,然後執行com.tencent.mm2的時候把需要的東西全部映射回原來的包,這是我的做法,已經完美運行了。
  2. 研究了樂視的做法,他是直接去修改AMS的流程來實現的,感覺這做法對AMS的流程修改有點大,說不好會有坑。

給需要的朋友參考一下思路。

附圖:




相關推薦

單播組播(播)廣播以及任播

pac 視頻 rsvp 使用 blank 缺點 ron ssa 處理 目錄 [+] 單播(unicast): 是指封包在計算機網絡的傳輸中,目的地址為單一目標的一種傳輸方式。它是現今網絡應用最為廣泛,通常所使用的網絡協議或服務大多采用單播傳輸,例如一切基於TCP的協議

中華酷聯曾經的國產四巨頭只剩華為虧損100面臨破產!

中興 中華酷聯 手機市場 消費者 優化 太差 影響力 先後 以及 中興,華為,酷派,聯想是國內最先做手機的國產廠商,記得在2015年以前,這四個國產手機的產品可以說是充滿了我們的生活之中,也是那個時候國產手機最有代表的品牌,大街小巷都可以看到這幾個品牌的手機,這算是國產手機

引用&引用的使用常引用引用與引用與指針的區別

C/C++什麽是“引用”?申明和使用“引用”要註意哪些問題? 答:引用就是某個目標變量的“別名”(alias),對應用的操作與對變量直接操作效果完全相同。申明一個引用的時候,切記要對其進行初始化。引用聲明完畢後,相當於目標變量名有兩個名稱,即該目標原名稱和引用名,不能再把該引用名作為其他變量名的別名。聲明一

【shiter編寫程式的藝術】大資料生態圈計算機視覺機器學習高階技術的愛好者話不上程式碼!!!

公眾號:     老王和他的IT界朋友們 歡迎投稿:  [email protected] QQ交流群:  593683975 QQ群提供技術交流,CSDN資源,百度文庫等資源共享 加群問題:拋硬幣正面上的期望? 我們想用一段音樂,幾張圖片, 些

10天時間淨賺20她成功創業有什麼祕訣?

25歲的王鶴潼被親戚稱為成功創業的典例,在2014年,她給父母買了房子,還給自己換了輛越野車。 從上大學起王鶴潼就逮住各種機會,拼命賺錢,並且樂此不疲。期間父親的一場重病,花盡了家中的積蓄和她大學期間賺的錢。王鶴潼要繼續賺錢為父母的生活和醫療提供物質保障,但也意識到自己的生活若只是重複著賺錢和花

A/B 測試的基本概念舉例理解以及具體實現方法【傳統A/B測試基於後端的 A/B 測試(Back-end AB test)現在基本上基於前端js在客戶端進行分流有更優點請看裡面】

文章來源:http://www.aliued.cn/2010/09/27/ab-testing-realization-method.html 什麼是A/B測試?以及如何進行? 很多朋友都問我怎麼進行A/B測試,我一般都不直接回答他們的問題,而是首先問一句:“你的日

shiter編寫程式的藝術(大資料生態圈計算機視覺機器學習高階技術的愛好者話不上程式碼!!!)

公眾號:     老王和他的IT界朋友們 歡迎投稿:  [email protected] QQ交流群:  593683975 QQ群提供技術交流,CSDN資源,百度文庫等資源共享 加群問題:拋硬幣正面上的期望? 我們想用一段音樂,幾張圖片, 些

sql 將‘1,2,3,4’轉成相應的表欄位分隔表值函式一行變

再設計表的時候我們經常遇到這樣的情況,欄位的值為1,2,3,4 等字元隔開的情況,存的是數字,但是顯示的時候是對應的類別,直接上圖,清楚明瞭, 如何想得到 分兩步完成,步驟如下: 第一步先創造 一個表值函式,將1,2,3,4 轉化為 函式是從網上找來的,程式碼如下:

整理的一些好的文章適合平時看看想想

1.分散式事務在Sharding-Sphere中的實現: 可以詳細瞭解各種事務,加強對分散式事務的瞭解 2.全面解析schedule、scheduleAtFixedRate和scheduleWithFixedDelay: 適合用執行緒池實現一些定時任務的場景

termsrv.dll XP SP3 / Win7 32/64位 支援使用者遠端桌面連線 3389

1. 下載破解的termsrv.dll 版本:5.1.2600.5512  2. 複製到C:\Windows\system32資料夾覆蓋同名檔案  3. 執行MultipleTS.bat檔案; 4. 執行Gpedit.msc開啟組策略,終端服務,限制連線數量改到2

力求改變給自己一點一點的挑戰!

前一段時間看一本《高效能網站建設進階指南》這本書,提到頁面中的js並不是同步載入的,這就會導致如果幾個js檔案是互為牽制的話,可能會造成有未讀取到的js沒有及時生成元素而報錯的問題,而今天也是在網上看到了一篇叫做js同步載入最佳實踐的文章,提出了一個能把多個js檔案實現同步載

基於個人理解的springAOP部分原始碼分析內含較原始碼慎入

## 本文原始碼較多,講述一些個人對spring中AOP程式設計的一個原始碼分析理解,只代表個人理解,希望能和大家進行交流,有什麼錯誤也渴求指點!!!接下來進入正題 AOP的實現,我認為簡單的說就是利用代理模式,對目標方法所在的類進行封裝代理。請求目標方法時,是直接請求代理物件,再根據使用者指定的通知(切點

分身

2016-07-08 更新 由於公司放棄該方案哪就不壓箱底了,開源造福人類,呵呵 先說一下實現雙開(多開)的幾種方案 靜態修改APK包名,然後重打包 作為廠商肯定不推薦這個方式拉,可能存在法律風險動態修改APK包名 對原生程式碼修改量小,相容性差,部分APP需單獨適

PC版不用軟件自己動手豐衣足食。

tex ech tencent 文本 class ber 保存 後綴名 AR 關於PC版微信多開 找到微信的安裝路徑(包含 WeChat.exe 的文件夾)如: D:\Program Files\Tencent\WeChat 新建文本文檔,隨意命名,打開後粘貼如下代碼並保

PC版不用軟體自己動手豐衣足食。

關於PC版微信多開 找到微信的安裝路徑(包含 WeChat.exe 的資料夾)如: D:\Program Files\Tencent\WeChat新建文字文件,隨意命名,開啟後貼上如下程式碼並儲存:

小程序卡券接入流程酷客為你支招

酷客多小程序 小程序 微信小程序 酷客多 1.必須是已經認證的小程序(需300元/年認證費)2.必須是已經認證的微信公眾號(需300元/年認證費)必須在微信公眾平臺開通卡券功能3.需要在微信開放平臺綁定公眾號AppId與小程序AppId(開發者資質認證300元/年)在開放平臺綁定小程序和微信公

小程序平臺化開發案例公開商家門店線下盈利模式

運營 實例 images .cn 技術分享 盈利 後臺管理系統 線下 招募 小程序商圈平臺、多商家/門店入駐、開發管理後臺(實例分析) 咫尺網絡 出品 1、小程序“商圈平臺”開發設計源碼小程序平臺化經營,占據商圈流量高點,對外招募商家門店(多樣化盈利模式),打造人氣

好用不需說的公眾號實用技巧一起來叨叨!

新媒體至此軍訓之際,太陽大大當空照,火熱的陽光真是好!小編的心情也是非常的好,想一想那麽多嗮黑了,餓瘦了的小學妹們,終於可以顯的我好白好白啦(不是白胖白胖)!白白瘦瘦的我現在比較容易緊張,一緊張我就...喜歡裝逼...裝逼我就想到了微信,想到了微信就忍不住和大家叨叨幾個超級牛逼的技巧(⊙o⊙) 牛逼的技巧一:

[完整源源碼V10]最新仿紅包牛牛掃雷雷禁搶雷坐莊雷接龍PC蛋蛋遊戲

hvm pk10 編譯 最新 edi medium erl flag 數據 [完整開源源碼V10]最新仿微信紅包牛牛掃雷多雷禁搶雷坐莊雷接龍PC蛋蛋遊戲 完整源碼版和編譯運營修復版正式發布 同步發布,需要聯系qq:3373137913[完整開源源碼V10]最新仿微信紅包牛牛

小程序-兩個input疊加次點擊字體變粗或閃動

img 效果 brush 問題 inf rip nbsp jpg highlight 問題描述:   當兩個input疊加,多次點擊input框, placeholder 字體變粗或input框閃動。如圖:    代碼:    <!-- 最上層input-1 --