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、在桌面找到自己下载的浏览器软件,点击浏览器图标。