2019年6月17日 星期一

低功率訊號量測

markdown 在用 spectrum 量測訊號時,會發現下方有橫貫整個螢幕雜訊,也就是 noise floor。真實世界雜訊是一定會存在的,雜訊產生的原因可以參考 Reference [Noise floor-頻譜下方的雜訊是怎麼來的](https://www.strongpilab.com/spectrum-noise-floor/)。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZKe8qv0i0Qe3gKOaZEoSB6ixa0ujj0MMD7gesf5BqHKD_WB2oFMtEtv4R0nEYqdClVX8qoWZPkG4KtO3GYIdgUe49ENSTWNtLVMyR_TfO_1PwvgTl9RK4TEy61zC-wBUQdodwcebvdSvA/s1600/spectrum-noise1.png =600x*) 在量測低功率的訊號時,如何降低 noise floor 就顯得很重要,因為若是欲量測的訊號強度比 noise floor 還低的話,訊號會被 noise floor 淹沒導致無法量測到訊號。 有個參數 RBW (Resolution Bandwidth) 可以降低 noise floor,這個參數的作用是設定 spectrum 用多寬的頻率當最小單位來掃描輸入的訊號,該頻寬內測得的功率,就會是螢幕上的一個點。若是這個頻寬越窄,在此頻寬內通過的雜訊就會越少,測得的雜訊功率就會越小。不過這個參數也不是越低越好,因為值越低就表示作完一次完整掃描要掃更多次,就會花更多時間。所以依據實驗需要來調整最適合的 RBW 來作量測。 Reference: * [RBW 調低讓低功率訊號浮出水面-觀察小訊號的好方法](https://www.strongpilab.com/low-power-meas-by-low-rbw/) * [頻譜原理-Spectrum內部構造簡介](https://www.strongpilab.com/spectrum-how-it-work/) * [VBW Video bandwidth做甚麼用? 頻譜軌跡的化妝師](https://www.strongpilab.com/vbw-video-bandwidth-spectrum/) * [Noise floor-頻譜下方的雜訊是怎麼來的](https://www.strongpilab.com/spectrum-noise-floor/) * [Optimization of weak signal measurement by spectrum analyzer](http://www.micronix-jp.com/english/note/application/MSA_DR_e.html)

2019年6月13日 星期四

Word 分頁符號

markdown Word 可以輸入分頁符號讓分頁符號插入點的內容強制移到下一頁去,可參考[這篇](http://www1.nttu.edu.tw/it/it03/word/layout03.htm)

2019年6月11日 星期二

Android NDK Build Fail

markdown 一個專案在加入 NDK 後遇到 Build Fail,Android Studio 一如既往給的錯誤訊息看不出是甚麼原因,只能用關鍵字 External Native Build Issues: Error configuring 來搜尋,網路上查了資料看到需要更新 Gradle Build Tool,原本是 3.1.3,更新到 3.2.1,接著 Android Studio 提示還要再連帶更新 Gradle Version,從 4.4 更新到 4.6,更新完後真的就可以 Build 成功,在此記錄一下。

2019年6月6日 星期四

Android 逆向 - 可執行檔案格式

markdown 要反組譯 Android 的程式,跟一般桌面 Java 應用程式比是要麻煩一些的,雖然 Android 上是用 Java 語言開發,但是底層的 Java 虛擬機並不是 Oracle 的 JVM,而是 Google 自己做的 Dalvik。而且從 Java 原始碼編譯出來的可執行檔案,隨著 Android 最佳化機制的演進,還會生成不同的檔案格式,因此要學 Android 逆向,首先要對這些編譯後的可執行檔案格式有些了解,在這篇會介紹一下這些檔案格式,幫自己理清思路,也順便做個筆記可供日後備查。 ## DEX 一般 Java 程式透過 javac 編譯後,得出的是一個一個 .class 檔案,內含 Java byte code,檔案格式為 [class file format](https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html),可以直接讓 JVM load 起來執行。但是 Android 自有的 Dalvik 虛擬機吃的不是 class 格式,而是 DEX 格式的檔案,DEX 也就是 Dalvik EXecutable 的意思。 要生成 DEX 格式檔案,在 Java 程式碼編譯為 class 檔案後,需用 Android 的 dx compiler (或是下一代 compiler [D8](https://developer.android.com/studio/command-line/d8)) 來將 class 檔再編譯成 DEX 檔案。 通常將 apk 解開來後,可以看到裡面都會有一個 classes.dex,這個就是 Dalvik 吃的 DEX 格式檔案,所有 App 的 Java 程式碼都會被編譯到這個檔案中。 ## ODEX Dalvik 在將 classes.dex 檔案跑起來的時候,會做一些最佳化例如將 virtual method 查找的動作移除改為直接呼叫某 index 上的 method 以節省時間,但這個動作是每次將 dex 載入時都會執行一次。為了節省這個時間,Android 將最佳化後的 dex 寫成檔案儲存到 Dalvik 的 cache 目錄中,也就是 odex 檔案,以後 Dalvik 要再執行同一個 App 時,載入的會是 cache 目錄中的 odex 檔。 這個 dex to odex 的轉換是由 Android 上自帶的工具 dexopt 完成的,odex 檔中大部分的內容都跟原本的 classes.dex 差不多,只是做了一些最佳化而已。 ## OAT Android 為了要讓 App 執行的更快速,在 Dalvik 中使用了 JIT 技術,將 Dalvik bytecode 轉換為 native code,但是 JIT 是在 App 執行過程中完成,而且是每次 App 跑起來都會做一次,這浪費了不必要的資源,因此在 Android 5.0 之後,採用了新的策略,在 App 安裝時就將 classes.dex 檔案裡的程式碼使用 Android 平台自帶的 dex2oat 工具編譯為 native code,並且將其放在另一種格式的檔案中。 這會造成 App 安裝的時間增加,但是 dex 到 native code 的轉換從此只要一次就好,而因為執行檔內容已經從 Dalvik bytecode 轉換為 native code 了,在這時期的虛擬機也從 Dalvik 變為 ART(Android Runtime) 來支援這種新執行檔格式。 這個新的檔案格式,實際上是一個 ELF 格式的檔案,但 ELF 只是一個殼,ELF 殼內存放的實際上是一個 Android 叫做 OAT 格式的資料。這可能不是那麼直觀,如果有網路封包概念的話,可以把它想像成類似 TCP/IP 封包架構,就像 MAC 封包的 payload 其實是 IP 封包,IP 封包的 payload 又是 TCP 封包。 而這個檔案的副檔名通常會是 .odex 或是 .oat,這可能也會讓人混淆,因為 Dalvik 時期 dex 最佳化後的檔案也叫 odex,因此 Android 上的副檔名不太可信,還是要實際看文件內容才能確定到底是甚麼格式的檔案。 要逆向 OAT 中的 native code 是極為困難的,但好在 OAT 檔案中已經包含了原本的 dex 檔案,說原本的也不太準確,它包含的是經過最佳化後的 dex 檔,但跟 native code 比起來還是好太多了,因此可以先從 OAT 中將 dex 提取出來,再作逆向。 ## VDEX 在 Android 8.0 之後,dex2oat 生成的不再是單一個 OAT 檔案,而是生成兩個檔案 classes.odex 跟 classes.vdex。 * classex.odex:包含 native code 的 OAT 檔 * classes.vdex:原本的 dex 檔的副本 這個時候要逆向,一樣可以從 vdex 中提取出 dex 檔,再作逆向 ## 結語 Android 上可執行檔的格式有 vdex、odex、oat、dex,其中又跟虛擬機 Dalvik、ART 牽扯在一起,要理清其中的關係的確不是那麼容易,在網路上看到一張圖,算是將這些檔案間的關係描述的相當清楚,放在這邊分享一下。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjdeIcIxbiOf2Bapn5YTfCIu3RMRVoHfFCmNVOkpMfg4bm2wO-EULWPambG_jNX2-SiMQQRJgHIHA_UmWDy3TFMcmSl1rZfJz0QE6Qg6Z_WkzOWlI-_EVfBnIQL96R71de0q6QwMPvWmTOe/s1600/658px-ART_view.png) Reference: * [Android formats](https://lief.quarkslab.com/doc/latest/tutorials/10_android_formats.html) * [Configuring ART](https://source.android.com/devices/tech/dalvik/configure) * [Android运行时ART加载OAT文件的过程分析](https://blog.csdn.net/Luoshengyang/article/details/39307813) * [Android ART运行时无缝替换Dalvik虚拟机的过程分析](https://blog.csdn.net/luoshengyang/article/details/18006645) * [ART view](https://en.wikipedia.org/wiki/File:ART_view.png)

2019年6月4日 星期二

電源供應器降溫筆記

markdown [之前](https://lausai360.blogspot.com/2019/06/r9-270.html)幫顯示卡成功降溫,就想著電腦裡還有甚麼發熱源可以來改善,然後發現電源供應器溫度也很高,目視看到風扇沒有在轉動,就把電源供應器也拆了,準備做個保養上油 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj-girVP64vb9w_4bdWzlrzDGzrP8UpMEKjQtJUvKV9wNZl9rUV2IenNMoKTky8AE8O1g9zR8QxKPfs7i2W8cWWY1sZRbByLKTzu3_ji1NKZqJjva3Tg8ZBKvfcourisXzWwOJgScZd3FQG/s1600/IMG_20190602_125139.jpg =600x*) 雖然顯示卡的問題跟風扇潤滑無關,但電源供應器就真的是風扇的潤滑劑乾掉了,拆下來用手轉就可以感覺到阻力極大。除了風扇外,灰塵也相當多,就簡單清了灰塵再把風扇上油,用大賣場買的膏狀黃油上到風扇軸承上再裝回去,就發現風扇好轉很多了。 電源供應器裝回電腦之後,看到風扇順利的轉起來,過了兩小時用手測溫,發現溫度很涼,跟之前摸到的高溫有天壤之別,降溫成就再加一。 原本還想幫機殼買個系統風扇來散熱,但做完顯示卡跟電源供應器降溫後應該是不需要了。

2019年6月1日 星期六

顯示卡 R9-270 降溫筆記

markdown 之前為了打遊戲買了一張憾迅 R9-270 ,不過一直沒有注意過它的溫度,最近無意中用手摸到顯示卡,才發現溫度高的驚人,於是開始想辦法讓顯示卡降溫。一開始先想到是不是風扇有問題,觀察了一下發現雖然顯示卡溫度很高但風扇卻轉速很低,於是以為是風扇潤滑乾掉了就把顯示卡拆下來保養,但沒想到拆完發現風扇的潤滑沒問題,但拆都拆了還是保養一下順便給風扇上點油。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidqvOgoYkKHv7tPUqtYHs7L_JoaDpnnejIgTYBOAJNZqAmHL6M9xpViVx-41k65p5qrgv29goF3QdfhZg37_aMhyi27HqCVzltSkabU5QR5H6fvYAt3oBN-3pkwPls2LmVmSlDPYMmUS5a/s1600/IMG_20190601_090037.jpg =500x*) 接著谷歌找答案,發現 PTT 一篇[關鍵文章](https://www.ptt.cc/bbs/VideoCard/M.1479636880.A.335.html),情況跟我一模一樣,我這張卡待機也是 6x 度而且頻率在 450/1400。看起來是因為 BIOS 將待機頻率設的太高。接下來就是照文章中解法想辦法去改 BIOS 重刷了。 之前沒玩過顯示卡刷 BIOS,不過網路上找了一下發現也不是很麻煩,先用 [GPU-Z](https://www.techpowerup.com/gpuz/) 將原本的 BIOS 備份出來,然後用 [VBE7](https://www.techpowerup.com/forums/threads/vbe7-vbios-editor-for-radeon-hd-7000-series-cards.189089/) 修改 BIOS,然後再用 [ATIWinflash](https://www.techpowerup.com/download/ati-atiflash/) 將 BIOS 刷回去就可以了。 這種刷機玩法看似步驟並不複雜,但是當真的自己做的時候總是會發現不一定如網路上的教學文章這麼順利,像是我一開始刷完 BIOS 後發現待機頻率還是一樣在 450/1400,但是 BIOS 內我修改的風扇設定卻又有生效。這就讓人十分困惑了,那我刷的 BIOS 到底是成功還是失敗? 接下來就是瘋狂的 Google ,在 PTT 看到文章[這篇](https://www.ptt.cc/bbs/DigiCurrency/M.1495983520.A.0EF.html)跟[這篇](https://www.ptt.cc/bbs/PC_Shopping/M.1487655269.A.C5B.html)講到 AMD 新版的 driver 會鎖 BIOS,所以又抓了好幾版 driver 移除又重裝再加上用 [atikmdag-patcher](https://bitcoinforum.com/bitcoin-mining/atikmdag-patcher-1-4-7-14711/) 打 patch 不停的試。在 Try and Error 的過程中看到 [mobile01](https://www.mobile01.com/topicdetail.php?f=298&t=4988057) 有人也是用憾訊這張卡然後成功將待機頻率降低,但我不管怎麼試就是不行。 毫無頭緒的 Google 亂找,在一篇外國論壇中看到有人建議用 [DDU](https://www.wagnardsoft.com/) 移除 AMD driver,我就下載了 AMD 自己出的移除工具 [AMD Cleanup Utility](https://www.amd.com/zh-hant/support/kb/faq/gpu-601) 將 driver 移除重裝然後再刷 BIOS,神奇的事情發生了,待機頻率降到 300/150,顯示卡溫度也降到 42 度。 因為我在刷 BIOS 前曾經在 driver 中設定過頻率,我猜想也許是這個設定一直沒有被移除,直到用 AMD Cleanup Utility 後才被移掉(不過 AMD 搞到要出一個專門的移除工具會不會有點搞笑阿)。 雖然花了很多時間,但最終證實了 R9-270 刷 BIOS 是可以成功修改待機頻率與降溫的,溫度也低了差不多 20 度,結果還是挺滿意的。下面是我用的 BIOS 設定,在這邊記錄一下,而最後 driver 是用了 17.2.1 版。 ![](https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjA6cfGxt_HjmkGe1NAYd3Ep9u8S0x5gcI8_I3XuTgfXqNBNLXo3d5teoG-55z2KIkjOdBgv6CPN5mYj1IPefcpSqGeR-YlfZMDBsSzuQ0ZyOmcae-sxBg8smMUZQteLWrda6qsLM58hvm4/s1600/Image+1.png =800x*)