h5反編譯
1. 怎麼把人家的H5游戲扒下來
反編譯的話,目前還沒有很好的方法。個人推薦你還是試試自己仿製一個吧。
2. 請問應該如何破解這個程序
這個是C# 編寫的程序,用ILSpy很容易反編譯,之後你就明白了。
3. file.read()讀取的位元組數據怎麼反編譯恢復成源文件中的數據、字母或文字。
由於課程原因,用到了其中的離線手寫漢字型檔(HWDB1.1trn_gnt與HWDB1.1tst _gnt)的數據。這些數據以.gnt格式存儲,解碼後可以得到3755個常用漢字的各300個樣本。按照CASIA的建議,240個不同的書寫者的樣本作為training set,剩餘60位書寫者的樣本作為testing set, 則共有897758個training sample, 223991個testing sample. 本文提供一段python腳本,可以直接將其中的數據存儲成numpy數組文件(.npy文件)。只是,由於圖像位置及大小對齊處理的原因,代碼效率不是很高,執行起來需要的時間有點久:
Intel Core i7-4710MQ
16GB DDR3L RAM123
配置下,training set由.gnt文件轉成.npy文件共花費 78 分鍾。最終的結果文件有點大(training set 876MB, testing set 218M),可能存成.npy文件不如.h5文件更方便些。
另外,請大家在使用數據時遵守CASIA對於該資料庫數據的使用要求。
gnt格式定義見下圖:
如圖所示,文件的前4個位元組記錄了第一個字元數據與下一個字元數據之間的位元組數,比如這4個位元組是35656的話,第二個字元的數據就是從第35657個位元組開始(下標35656)。接下來的兩個位元組存儲該字元的GBK編碼,再下面的4個位元組記錄了字元圖片的寬度和高度,然後就是字元圖片的數據(按行存儲)。
所需依賴:
opencv (>=2.0)
numpy
- # -*- coding: utf-8 -*-
- from __future__ import print_function
- import cv2
- import numpy as np
- import os
- import struct
- import sys
- import zipfile
- def gnt2npy(src_file, dst_file, image_size, map_file):
- '''
- 將gnt文件存為npy格式
- param src_file: 源文件名,gnt文件
- param dst_file: 目標文件名, 若此參數設置為'xxx',則會生成xxx_images.npy 和 xxx_labels.npy
- param image_size: 圖片大小,設置為m時,最終文件的大小將為 m x m
- param map_file: 由於漢字編碼不連續,作為分類label並不合適,該文件保存漢字碼和label的映射關系
- '''
- code_map = {}
- if os.path.exists(map_file):
- with open(map_file, 'r') as fp:
- for line in fp.readlines():
- if len(line) == 0:
- continue;
- code, label = line.split()
- code_map[int(code)] = int(label)
- fp.close()
- images = []
- labels = []
- if zipfile.is_zipfile(src_file): #單體zip文件
- zip_file = zipfile.ZipFile(src_file, 'r')
- file_list = zip_file.namelist()
- for file_name in file_list:
- print("processing %s ..." % file_name)
- data_file = zip_file.open(file_name)
- total_bytes = zip_file.getinfo(file_name).file_size
- image_list, label_list, code_map = readFromGnt(data_file, file_name, image_size, total_bytes, code_map)
- images += image_list
- labels += label_list
- elif os.path.isdir(src_file): #包含gnt文件的文件夾
- file_list = os.listdir(src_file)
- for file_name in file_list:
- file_name = src_file + os.sep + file_name
- print("processing %s ..." % file_name)
- data_file = open(file_name, 'rb')
- total_bytes = os.path.getsize(file_name)
- image_list, label_list, code_map = readFromGnt(data_file, image_size, total_bytes, code_map)
- images += image_list
- labels += label_list
- else:
- sys.stderr.write('Source file should be a ziped file containing the gnt files. Plese check your input again. ')
- return None
- with open(map_file, 'w') as fp:
- for code in code_map:
- print(code, code_map[code], file=fp)
- fp.close()
- np.save(dst_file + '_images.npy', images)
- np.save(dst_file + '_labels.npy', labels)
- def readFromGnt(data_file, image_size, total_bytes, code_map):
- '''
- 從文件對象中讀取數據並返回
- param data_file, 文件對象
- param image_size: 圖片大小,設置為m時,最終文件的大小將為m x m
- param total_bytes: 文件總byte數
- param code_map: 由於漢字編碼不連續,作為分類label並不合適,該dict保存漢字碼和label的映射關系
- '''
- decoded_bytes = 0
- image_list = []
- label_list = []
- new_label = len(code_map)
- while decoded_bytes != total_bytes:
- data_length, = struct.unpack('<I', data_file.read(4))
- tag_code, = struct.unpack('>H', data_file.read(2))
- image_width, = struct.unpack('<H', data_file.read(2))
- image_height, = struct.unpack('<H', data_file.read(2))
- arc_length = image_width
- if image_width < image_height:
- arc_length = image_height
- temp_image = 255 * np.ones((arc_length, arc_length ,1), np.uint8)
- row_begin = (arc_length - image_height) // 2
- col_begin = (arc_length - image_width) // 2
- for row in range(row_begin, image_height + row_begin):
- for col in range(col_begin, image_width + col_begin):
- temp_image[row, col], = struct.unpack('B', data_file.read(1))
- decoded_bytes += data_length
- result_image = cv2.resize(temp_image, (image_size, image_size))
- if tag_code not in code_map:
- code_map[tag_code] = new_label
- new_label += 1
- image_list.append(result_image)
- label_list.append(code_map[tag_code])
- return image_list, label_list, code_map
- if __name__=='__main__':
- if len(sys.argv) < 5:
- sys.stderr.write('Please specify source file, target file, image size and map file ')
- sys.exit()
- src_file = sys.argv[1]
- dst_file = sys.argv[2]
- image_size = int(sys.argv[3])
- map_file = sys.argv[4]
- gnt2npy(src_file, dst_file, image_size, map_file)
- 10710810911011111114115
具體代碼如下:
命令格式舉例:python gnt2npy.py src target img_size map_file,以上參數中,gnt2npy為腳本文件名,可任意更改。src為源文件名,可以是只包含.gnt文件的zip包,也可以是將壓縮文件解壓後的文件夾名稱,target為目標文件名,假設該值為train則腳本執行後會生成train_images.npy與trian_labels.npy兩個文件,分別為圖像數據和對應的label。圖像的大小則可以通過第三個參數img_size指定,假設該值為32則圖像文件大小為32 x 32。另外,由於漢字的GBK編碼並不是從零開始,也不完全連續,作為分類的label不是很合適,因此在保存label時根據一定的規則將GBK編碼映射為數據的label,最後一個參數map_file則保存這種映射關系,第一次執行腳本時生成該文件,以後則可以通過該文件保證相同漢字,其label總是相同的。
請注意,HWDB1.1trn_gnt.zip包含的其實是一個ALZ壓縮文件,因此請不要將該文件名直接作為參數傳入以上代碼,請將裡面的ALZ文件解壓後將文件夾的名字作為參數。
此外,這個Github鏈接提供了預覽及保存圖片文件的工具,同樣可以用於該文件類型(.gnt)的數據提取,並且可以通過選擇使用的框架(Caffe/CNTK/TensorFlow/NvidiaDigits)將圖片文件按照不同的大小、格式保存。其中,win64_bianry.zip包含編譯好的X64二進制文件和一份簡單的使用說明,其他為源碼及源碼生成GUI需要用到的圖片和一個qt項目文件gntDecoder.pro,有興趣的話也歡迎大家下載源碼隨意修改。預編譯的X64程序運行時可能要求」api-ms-win-crt-runtime-l1-1-0.dll」,出現該信息的話請通過微軟官網或者機器中的Windows Update安裝KB2999226補丁(通用C運行庫)。
4. html格式如何轉換為txt格式
1、打開需要轉換的網頁文件。
5. 微信小程序error:enoent:no such file or directory,open 怎麼回事
導致這個問題應該是你添加了文件,後面刪除了,重新編譯就會提示
no such file or directory,open
處理方法(關閉已經刪除文件的窗口)
把你刪除的文件關閉已經打開的窗口就可以了,因為你刪除文件,開發工具找不到,但是頁面還是打開狀態
6. app測試和web測試的區別, web測試和app測試的區別
一、測試方式不同
1、app測試:指對移動應用進行測試,包括自動化測試和人工測試等。
2、web測試:是軟體測試的一部分,是針對Web應用的一類測試。
二、測試內容不同
1、app測試:模擬用戶操作對應用程序進行黑盒測試,並使用Cucumber作為自然語言來編寫測試用例。還會對應用測試操作進行記錄,以幫助開發者進行測試回顧。
2、web測試:包括內容測試、界面測試、功能測試、性能測試、兼容性測試、安全性測試等。
三、特點不同
1、app測試:可通過增加預先測試環節來確認環境已經測試就緒,同時還能知道哪些錯誤是環境不穩定引起的,哪些是一般的測試用例錯誤。
2、web測試:通過測試可以盡可能地多發現瀏覽器端和伺服器端程序中的錯誤並及時加以修正,以保證應用的質量。
7. 把安卓Chrome反編譯,寫入自己的網址,做成自己的H5app。能實現不
你是要做一個網站,還是APP?
雖然我沒做過安卓開發,但我也知道反編譯APP和自己寫一個APP難度不一樣
特別是Google這樣的大公司開發的軟體,架構肯定非常好,這就導致你要改的話要研究幾十兆的源碼,然後找到自己要改的內容來修改
如果你要做APP,我知道幾種簡單的方法你可以試試
PWA
微信小程序
8. Android無線開發的幾種常用技術(阿里巴巴資深
完整的開發一個android移動App需要經過從分解需求、架構設計到開發調試、測試、上線發布等多個階段,在發布後還會有產品功能上的迭代演進,此外還會面對性能、安全、無線網路質量等多方面的問題。
移動App的產品形態各不相同,有的是內容類,有的是工具類,有的是社交類,所以它們的業務邏輯所偏重的核心技術有些差別,但它們都會用到一些常用的技術方案。今天我們就先來簡單介紹一下這些常用技術,以後會專門分專題來詳細介紹這些技術的原理和使用場景。
1. Multidex
在Dalvik虛擬機所使用的dex文件格式中,用原生類型short來索引文件中的方法數,也就是最多隻能有4個位元組65536個method,在打包apk的過程中會把工程所需要的全部class文件都合並壓縮到一個dex文件中,也就是說自己開發的代碼加上外部引用的庫的方法總數不能超過65535。
隨著業務邏輯的不斷增長,很容易就會超過這個限制,在編譯期間就會遇到這樣一個錯誤:
還好google官方給出了一個解決方案Multidex,它會把dex文件拆成兩個或多個,第二個dex文件叫classes2.dex,在Application實例化後會從apk中解壓出classes2.dex並將其拷貝到應用的目錄下,通過反射將其注入到當前的ClassLoader中。但是這個方案非但不能解決一切問題也不能直接拿來用,而要加入自己的一些改造,來解決NoClassDefFoundError、INSTALL_FAILED_DEXOPT等問題,以保證自己的dex被順利的載入流暢的執行。
2. Plugin
Multidex雖然可以解決方法數的限制,但隨著業務邏輯越來越多,apk的大小也變得越來越多,而且有一些功能並非全部用戶都想用的,所以會把一些功能模塊獨立出來做成插件,讓用戶可以按需下載更新,這樣既減小了包大小,又改善了用戶體驗。
插件類似於windows的dll文件,放在某個特定目錄,應用程序主框架會用LoadLibrary載入各dll文件,按插件介面去訪問插件。Android的插件技術也是這樣,利用一個進程可以運行多個apk的機制,用ClassLoader將宿主apk之外的類載入進來,插件的context可以通過createPackageContext方法創建。因為插件中的activity,service等組件如果沒有在AndroidManifest.xml中聲明將不能運行,所以需要預先在AndroidManifest.xml中聲明一個代理類(ProxyActivity),將這個ProxyActivity傳給插件,讓插件的activity也有訪問資源的能力。
3. Hot Patch
有時一些嚴重的crash bug或漏洞需要緊急修復,但有些用戶不會或不願意立即升級,而且頻繁升級,沒有特別的功能更新只是修復bug的升級,對活躍用戶是一種傷害。熱補丁就可以解決這樣的窘境,它是一種可以線上修復的技術方案,有動態改變方法的能力,一般大型的移動應用都會使用熱補丁來處理緊急事件。
Hot Patch可以通過hook來修改java的method,注入自己的代碼,實現非侵入式的runtime修改,或者採用正向編程,通過工具生成patch文件,通過jni bridge指向補丁文件中的方法。還有就是利用ClassLoader,在dex中查找class時,如果找到類則返回,找不到就從下一個dex文件中繼續查找,由此可以想到,在把問題修復後,可以單獨生成一個dex,通過反射插入到dexElements數組的最前面,這樣就能讓dalvik載入補丁里的類了。
4. Push通道
Push是移動App常用的一種無線技術,基礎是基於TCP的心跳機制,和客戶端維持一個長連接。用處是向客戶端推送消息,或者代替客戶端定時去從伺服器pull的策略,改為客戶端接收到push消息後再去pull。
如果每個應用都自己實現push通道的話,cpu就會不定時地經常被喚醒,耗電量達到難以容忍的程度,而且自己搭建push平台的成本也很大,實時性和效率也存在問題,一般都直接使用一些服務商提供的push方案,這些push平台一般都經過了優化設計,在跨平台和網路穿透性、長連接心跳包、多客戶端App鏈路復用、服務和連接保活等技術上做了優化。比如Agoo最初是淘寶無線事業部開發的push服務,在逐漸完善和支撐淘系其他app後,通過服務端容量、通訊協議優化、業務和開放能力的拓展改進後,與友盟等合作,開始向第三方提供推送服務。
5. 應用加固
一款熱門的移動app或游戲發布後會受到很多的關注,經常會遇到二次打包的盜版行為,破解者要麼修改游戲的資源文件、道具、分值甚至直接把訪問的站點指向自己架設的伺服器,損害了開發者的利益;要麼偷偷植入自己的惡意代碼,表面上看起來跟正版的app完全一樣,在後台卻盜取用戶隱私,植入木馬;要麼通過反向工程學習原app的核心技術,打破技術上的競爭壁壘。
為了防止被破解只通過混淆是遠遠不夠的,即使是在native層混淆也還是會被人熟練的反編譯,所以需要一套對apk的保護方案來反調試、防逆向和防篡改。一般的加固方法都是對原apk先進行加密,然後和殼合並生成新的apk。殼是用來解密apk的dex文件。當應用啟動時,殼先解密原apk,准備好自己定義的ClassLoader,然後獲取源程序中的Application名稱,通過反射找到正確的Application對象,運行它的onCreate方法,這樣原apk才能被真正運行。其他一些反調試的方法有針對反編譯工具,在源程序中加入一些無效的指令或無效的指針,引發反編譯工具的崩潰,還有就是加花指令,利用一些跳轉,堆棧操作等指令,讓破解者無法清楚地理解反匯編後的內容。
6. 其他
除了上述幾點外,在服務端還會涉及灰度策略、鏈路流量優化、動態更新配置、防DNS劫持等技術,在客戶端會涉及用戶埋點上報、在線監控、進程保活、H5和native混合開發、注入框架等。
9. vue壓縮後的js可以反編譯出來嗎
vue壓縮後的js可以反編譯出來,反編譯方法為:
1、在桌面找到自己下載的瀏覽器軟體,點擊瀏覽器圖標。