蜻蜓FM涉嫌诈骗投资人和广告主源代码剖析
引用自:https://github.com/cryfish2015/QingTingCheat
本文主要內容,引用自知乎的這篇文章:如何評價蜻蜓 FM 偽造用戶活躍度等數據
感謝“左莫”、“任正”等熱心正義的網友--左莫,任正的最早的回答猜測已經被蜻蜓FM通過創新工場關系讓知乎刪除了,而且此貼已經鎖定,蜻蜓FM還在不停贊下面無關緊要的垃圾評論。希望大家一起站出來抵制這種造假和疑似詐騙的行為。
蜻蜓FM是一款音頻app,最近我反編譯了他的源代碼,主要原因是最近有篇文章:
不過蜻蜓FM大量的刪帖很多已經死鏈了,太無恥!還活著的鏈接:
蜻蜓造假黑科技新聞
充滿著好奇,黑科技是怎樣做到的呢??
蜻蜓FM是如何提高DAU,欺騙友盟,talkingdata
摘要
看了蜻蜓FM的源代碼,先總結一下它整個的工作原理:
作為一個Android程序員,實在是看不慣這種行為,順便提醒第三方數據公司和投資人,防止一些像蜻蜓FM這樣無恥的創業公司欺騙大家。
具體步驟
具體聽我細細道來:
首先來看一下我們打開蜻蜓App之后,它在后臺跑的進程的數量:?
5個進程,你沒有看錯是5個進程!!!而且這幾個進程相互守護,無法徹底殺死,十雙筷子喲,牢牢抱成團。到目前為止,從來沒見過一款應用會起這么多進程。為了知道他為什么要啟動這么多進程,我們懷著好奇的心,反編譯了蜻蜓的app。結果發現了一些很奇怪的事情。
第一件事就是,他們的App代碼居然沒有混淆,開發人員真省事,閱讀代碼如同閱讀源碼。在我們閱讀源碼的時候,我們發現了今天的主角,關鍵進程:NotificationService?
manifest.xml里面注冊為:
<service android:name=".NotificationService" android:process=":notification"><intent-filter><action android:name="fm.qingting.qtradio.NotificationService" /><category android:name="android.intent.category.DEFAULT" /></intent-filter> </service>當然他也是個小強進程,無法徹底殺死!
通過反編譯我們發現: 第一步: NotificationService 會在onCreate方法里面調用MessageManager類的restartThread方法。
而restartThread方法中會啟動一個叫MessageThread的線程
第二步: 我們看看神奇的MessageThread做了一些什么事
我們發現一個叫"執行普羅米修斯"execPrometheus的方法,智慧之神,看名字就覺得牛逼的一腿!我們再來看看他的實現,它最后調用了一個神奇的方法doPrometheus,當然中間有一些條件判斷,比如多長時間“普羅米修斯”一下,例如:
最后我們來看看這個“普羅米修斯”的最后實現方法: 啟動了一個ShieldActivity,當我們閱讀ShieldActivity的源碼驚奇的發現,這個activity居然什么事都沒做,是個無界面的activity,類似透明窗口,并且2s之后銷毀結束自己。
看ShieldActivity類源代碼
那這個打開的activity什么要做這個事呢?讓你觸目驚心,高DAU和啟動次數的神話誕生了:
為了偽造DAU,欺騙umeng,talkingdata,艾瑞等知名第三方數據公司,增加虛擬活躍用戶,他們智慧到了神的地步。自啟動無窗口的透明activity界面調第三方數據公司的API。 為了證實這點,我還專門寫了一個demo,在后臺啟動一個透明界面,發現umeng確實會把它算為活躍用戶。今天我才發現,原來App還能這樣提高自己的活躍用戶,投資人的錢是這么好騙,這招確實高明,實在無言以對。
對源代碼感興趣的:
看普羅米修斯實現源代碼
蜻蜓FM是如何提高廣告展示量和點擊量欺騙秒針,DoubleClick
摘要
繼續閱讀蜻蜓FM的源代碼,會看到宙斯類,真有點扛不住,蜻蜓FM你太逆天了,你要創造整個世界啊!不多說了,直接上菜。 既發現蜻蜓牛逼的提升日活普羅米修斯Prometheus—智慧之神后,我們發現蜻蜓又一個牛逼閃閃的服務Zeus(宙斯,牛逼的上帝,無所不能)。蜻蜓你能讓我的小心臟平定一會兒嗎,又是上演好萊塢大片的節奏。
宙斯是蜻蜓FM用來欺騙廣告主和第三方廣告數據監測公司(秒針,admaster,doubleclick等)的系統:
不揭露實在不行了,我們來看看里面到底干了什么?
步驟
看zeus類源代碼
Zeus類里面主要新建了一個WebView(瀏覽器)對象,好像這并沒有什么問題,但是你仔細觀察發現,這個神奇的Zeus類,它并沒有把webview對象添加到任何可見化界面上,比如常見的Activity/Fragment等。 那它為什么要在后臺內存中放一個webview呢?要知道android的webview本身實現的并不好,存在大量的bug,開發過android的程序員大概都知道這點。這東西,耗電,耗內存。 繼續分析,我發現兩個關鍵函數setZeusUrl()和startZeus(),兩個函數的實現如下:
看到這個我都驚呆了,原來偉大的宙斯是用來在后臺偷偷的打開網頁鏈接的。打開的網頁鏈接用戶還是看不到的。
那他為什么要這么做呢,對蜻蜓FM又有什么好處呢?
蜻蜓FM用一個看不見的瀏覽器打開廣告主的網站,接著用程序模擬用戶行為點擊。廣告的展示率和點擊率,頓時提高了一個數量級,原來廣告商的錢也這么好騙! 看到這里,我真是佩服蜻蜓FM的老板,銷售,產品,程序員,你們確實很聰明,我怎么就沒想到呢?聰明的人賺錢真的很容易,違法么,不知道,我們改天都投遞簡歷到蜻蜓吧,漲姿勢。
悲催的DoubleClick等廣告數據監測公司都被這位親密的伙伴蒙在鼓里,要阻止這樣的流氓公司,廣告主紛紛站起來說臣妾做不到啊,臣妾不給你上了! DoubleClick是美國一家網絡廣告服務商,主要從事網絡廣告管理軟件開發與廣告服務,對網絡廣告活動進行集中策劃、執行、監控和追蹤。
隨時宙斯源碼閱讀的進一步深入,我越來越不敢相信自己的眼睛,我們再來看看他們給第三方廣告公司(比如秒針、AdMaster之類)發送數據的類ThirdTracker,同樣有驚人的發現。 ThirdTracker里面有給各大第三方廣告公司發送數據的代碼邏輯,如下:
從上圖一看,各大第三方廣告數據公司齊聚宙斯系統,我們和騙神蜻蜓FM一起創造世界吧。
我們再來看看這些廣告是怎么被蜻蜓FM觸發啟動的:
這個方法的調用者為RootNode類的onClockTime方法(鬧鐘 吐槽:這位開發兄弟,你能不能不起這么直白的名字,你老板的內褲都被你暴露了),但從這個方法的名字來看,就感覺這個類有問題,是不是每間隔一段時間,后臺偷偷給廣告商發送數據呢?
onClockTime調用者為ClockManager的dispatchClockEvent方法,如下:
那dispatchClockEvent方法又是誰調用的呢?大家捂好小心臟,見證奇跡的時刻到了,宙斯也是永活的:
宙斯真是名副其實,從富有的廣告主那里拿到了錢,做成了完美的盈利模式。報表給投資人一看,完美!蜻蜓FM你就是明天的BAT啊!你是宙斯,你創造了中國互聯網未來的“神話”,廣告主和投資人就任你欺騙,任你玩,你要把中國移動互聯網做成什么樣的模式!
蜻蜓線上最新版apk v5.0.1反編譯源碼教程
apk不會造假的,google簽名的,造假得破解google簽名
第一步
首先我們直接用一個解壓apk(開發過android應該知道apk其實就是個壓縮文件),解壓之后拷貝出里面classes.dex文件待用。
第二步
*下載dex2jar工具,最新版下載鏈接dex2jar下載
*解壓之后,打開cmd,進入解壓目錄,運行命令:
d2j-dex2jar.bat classes.dex(上一步解壓的) jarpath(反編譯dex后的文件目錄)
example:
d2j-dex2jar.bat c:\user\qting\classes.dex c:\user\qting\?
*反編譯之后,會得到一個classes-dex2jar.jar文件,待用。
第三步
*下載JD-GUI(反編譯jar神器),最新版下載鏈接JD-GUI下載
*解壓之后,雙擊打開,直接把上一步得到的的classes-dex2jar.jar文件直接拖入JD-GUI里面,你就可以隨意查看蜻蜓的源碼了。
常見問題
1. 蜻蜓FM這么刷廣告,為什么監測不到?
蜻蜓FM通過自啟動的方式增加了UV,先刷了DAU,使得DAU幾乎就是裝機量。廣告也是一樣。UV增加,PV/UV比并沒有顯示異常。而且他增加了很多隨機參數,并控制好比率,所有的一切高明之處就是想模仿真人的行為。
2. 進程多,自啟動的傷害性
所有自啟動首先都是耍流氓。不過android自啟動確實是很正常的事情,很多時候用得好都是為了服務于用戶體驗。其實這個并不怎么耗電,只有打開webview的操作才是耗電的。
Summary
蜻蜓FM的Android程序員難道你們的節操都碎了么??沒有節操的你們確實很文藝--普羅米修斯,宙斯,還有阿波羅,你們是神一樣的團隊! 史上最牛逼造假App蜻蜓FM神一般的數據造假手段,讓投資人和廣告主欲哭無淚,讓中國整個互聯網都漲姿勢了。
轉載于:https://www.cnblogs.com/zjoch/p/4952978.html
總結
以上是生活随笔為你收集整理的蜻蜓FM涉嫌诈骗投资人和广告主源代码剖析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CKEditor上传图片—配置CKFin
- 下一篇: [LintCode] Wildcard