当前位置:首页 » 编程软件 » img反编译

img反编译

发布时间: 2022-01-08 20:08:46

‘壹’ 如何反编译 android 中 /data/dalvik-cache/arm 下的文件

所有的 apk 内包含一个 classes.dex 文件。在 Dalvik上,apk包里的 dex文件在安装的时候会通过 dexopt 转化成另一个格式,叫odex(Opitimized dex),然后存在 /data/dalvik-cache里面,如:

/data/dalvik-cache/data@[email protected]@classes.dex
虽然文件后缀还是 .dex,但是这个dex和apk内的那个已经不一样了。这个文件是针对当前机器的硬件对 dex 文件进行了定制化,也就是说把这个放到别的设备上,不一定能运行。

PS: 在要编译 rom 的时候,如果参数加上 "WITH_DEXPREOPT=true",会在 /system/app/ 下同时生成 .apk 和 .odex 文件(注意,这里后缀又用的 .odex,但实际上和系统在 /data/dalvik-cache/ 下的 .dex文件是一样的)

ART

在 ART上,apk 包里的 dex文件在安装的时候通过 dex2oat,也会生成一个后缀为 .dex 的文件,放在 /data/dalvik-cache中,如:

/data/dalvik-cache/arm/system@app@[email protected]@classes.dex
/data/dalvik-cache/arm64/system@vendor@app@[email protected]@classes.dex
这个文件后缀叫 .dex ,但是这个文件又不一样了,这个既不是 dex 也不是 odex,用 dex2jar 的无法进行反编译的。文件格式也完全不同,因为这其实就是一个实打实的 elf文件,这个文件已经可以直接在机器上运行了。

为何 pm.jar 是空的?

首先来了解一下 ROM 的编译选项,看一下编译的时候能做什么事情, 大致了解就行了 。

编译选项

WITH_DEXPREOPT

使能编译时生成 OAT,避免第一次开机时编译耗时,但会增大 system分区的空间消耗

DONT_DEXPREOPT_PREBUILTS

使能后,将不会对 Android.mk中包含了 include $(BUILD_PREBUILT)的 Apk进行 oat,例如 Gmail,它很可能会在后期通过商店自行升级,而升级后系统中的 oat文件则没有意义了,但又无法删除,会造成空间的浪费(oat比dex文件要大)

WITH_DEXPREOPT_BOOT_IMG_ONLY

仅仅针对 boot.img进行oat优化(boot.img中包含 boot.art和 boot.oat)

LOCAL_DEX_PREOPT ture|false|nostripping

可用于各个 Android.mk,对每个 package进行单独配置,当设置为 true时,dex文件将会从 apk中剔除,如果不想剔除可使用 nostripping WPRODUCT _DEX PREOPT_*

WPRODUCT__DEX_PREOPT_*

PRODUCT_DEX_PREOPT_BOOT_FLAGS

这里的参数将会传至 dex2oat,控制 boot.img的编译优化行为。

PRODUCT_DEX_PREOPT_DEFAULT_FLAGS

控制除 boot.img 外,其他(如 jar, apk)的 OAT编译行为 例如:

PRODUCT_DEX_PREOPT_DEFAULT_FLAGS := --compiler- filter=interpret-only
$(call add-proct-dex-preopt-mole- config,services,--compiler-filter=space)
WITH_DEXPREOPT_PIC ture|false

使能 position-independent code,这样在dex2oat编译生成的 odex文件在运行时将不必再从 /system 下拷贝到 /data/dalvik-cache/ 目录下, 可以节省 /data 空间

WITH_ART_SMALL_MODE true|false

设置为 true 时,将只编译处于 boot classpath 里的类,其他的均不编译,这样既能加快第一次开机时间,因为大部分必要的类已经编译过了; 同时也能节省不少空间,因为 APP 都未进行编译。缺点是可能损失一性能,这可能要平时觉察不出,但在跑分软件上会有所体现

编译选项的经典配置

为了提高第一次开机速度,WITH_DEXPREOPT是必须使能的,这样则在编译阶段会完成 dex2oat的操作,避免在开机时间去做这个转码,节省了开机时间(6min以上缩短2min内)。

但会引起一个缺点,那就是 apk中还是包含了 class.dex(dexopt生成的),同时在对应的apk文件夹中又生成了已经转码成oat的 class.odex(dex2oat生成的),相当于这部分重复,造成了大量的空间浪费。

为了把 apk包里的 class.dex去除,节省空间,可以打开 DEX PREOPT DEFAULT := ture。

然而,这样开机速度是快了,而且节省了不少system空间,但开机后,咱们会发现即使在 system中已经存在 class.odex的 apk,第一次开机后还是会在 /data下面生成 class.odex,如data/dalvik-cache/arm64/system@app@[email protected]@classes.dex,这是何解?原来 Google为了提高安全性,在每一台机器开机时都会在之前的机器码加一个随机的偏移量,这个偏移量是随机的,每台机器都不相同,而 data分区下的这些文件就是从 system下的 class.odex加上偏移而来。

‘贰’ 有没有将.IMG的文件反编译成.c的工具啊

这几乎是不可能的。IMG文件是?通常这么底层的编译语言都没有很好的反编译工具,因为太灵活了。

‘叁’ unity webgl能反编译吗

可以的
加密原理(无需Unity源码):

1. IDA Pro打开libmono.so, 修改mono_image_open_from_data_with_name为
mono_image_open_from_data_with_name_0,
2. 替换实现mono_image_open_from_data_with_name,
extern mono_image_open_from_data_with_name_0(...);
mono_image_open_from_data_with_name(...) {
MonoImage *img = mono_image_open_from_data_with_name_0(...);
//发现数据文件头不是DLL前缀则解密 img->raw_data, 相应修改img->raw_data_len
return img;
}
3. 重新打包libmono.so; 替换Unity3D中的android下的版本.
4. 另外写个加密的工具,植入构建环境(MonoDeveloper或VS,添加一个打包后Build Phase来加密DLL); (IOS下禁用JIT固采用AOT编译,DLL中没有逻辑代码,所以无需操心);

‘肆’ 如何反编译IMG(内核)文件

先介绍一下编译核心的选项,希望能对大家消除对内核的神秘感有所帮助。
1.代码成熟等级
2..处理器类型和特色
3.对模块的支持
4.基本的选择
5.即插即用支持
6.块设备支持
7.网络选项
8.电话支持
9.SCSI设备的支持
10.I2O接口适配器
11.网络设备支持
12.配置业余无线广播
13.红外支持
14.ISDN的文件系统
15.旧型的光驱类型(非IDE界面的光驱)
16.字符设备
17.USB支持
18.文件系统
19.控制台驱动
20.声卡驱动
21.Kernel hacking
第二节 内核版本
由于linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布
给他人使用。Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应
),为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。一个树是稳
定树(stable tree),另一个树是非稳定树(unstable tree)或者开发树(developm
ent tree)。一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所
做的改进也可以应用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同
的改进。一旦开发树经过了足够的发展,开发树就会成为新的稳定树。开发数就体现在
源程序的版本号中;源程序版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于开
发树来说,y比相应的稳定树大一(因此,是奇数)。确定是以″ root ″的身份签入,
然后cd 到 /usr/src 。uname -r 这个指令将会显示版本。内核版本的更新可以访问<h
ttp://www.kernel.org/>。
第三节 编译原因
Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了
旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的
系统度身定制一个更高效,更稳定的内核,就需要重新编译内核。
通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、更稳
定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是
Linux使用者的必要操作内容。

为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主
要有下面四个考虑:
---自己定制编译的内核运行更快(具有更少的代码)
---系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
---不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞
---将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些
以上是针对成熟的Linux套件如Redhat Linux而言,我的目的是为建造嵌入式Linux操作系
统做准备,也是必由之路。
第四节 准备工作
第一部分 新版本内核的获取和更新
Linux内核版本发布的官方网站是< http://www.kernel.org/>,国内各大ftp上一般都可
以找到某些版本的内核。新版本的内核的发布有两种形式,一种是完整的内核版本,另
外一种是patch文件,即补丁。完整的内核版本比较大,比如linux-2.4.0-test8.tar.b
z2就有18M之多。完整内核版本一般是.tar.gz(.tgz)文件或者是.bz2文件,二者分别
是使用gzip或者bzip2进行压缩的文件,使用时需要解压缩。patch文件则比较小,一般
只有几十K到几百K,极少的会超过1M。但是patch文件是针对于特定的版本的,需要找到
自己对应的版本才能使用。
编译内核需要root权限。把需要升级的内 拷贝到/usr/src/下(下文中以2.2.16的内核
的linux-2.2.16tar.gz为例),命令为
#cp linux-2.2.16tar.gz /usr/src
先查看当前/usr/src的内容,注意到有一个linux的符号链接,它指向一个类似于linux
-2.2.14(对应于现在使用的内核版本号)的目录。首先删除这个链接:
#cd /usr/src
#rm -f linux
现在解压下载的源程序文件。如果所下载的是.tar.gz(.tgz)文件,使用命令:
#tar -xzvf linux-2.2.16tar.gz
如果下载的是.bz2文件,例如linux-2.2.16tar.bz2,使用命令
#bzip2 -d linux-2.2.16tar.bz2
#tar -xvf linux-2.2.16tar

现在再来看一下/usr/src下的内容,发现现在有了一个名为linux的目录,里面就是需要
升级到的版本的内核的源程序。还记得那个名为linux的链接么?之所以使用那个链接就
是防止在升级内核的时候会不慎把原来版本内核的源程序给覆盖掉了。现在也需要同样
处理:
#mv linux linux-2.2.16
#ln -s linux-2.2.16 linux

如果还下载了patch文件,比如patch-2.2.16,就可以进行patch操作(下面假设patch-
2.2.16已经位于/usr/src目录下了,否则需要先把该文件拷贝到/usr/src下):
#patch -p0 < patch-2.2.16
第二部分 准备主机板和相关硬件的说明手册
其实也不用太详细,只要知道您的硬件是属于哪一类型就行了。例如:有一张SCSI卡,
那就要知道这张卡的名字,有一台cd-rom,就要知道这台光驱是哪一种牌子的,是否为标
准的IDE/ATAPI界面,还是另有专属接口卡呢?或者,主机版是否有支持Triton芯片(通
常586以上的电脑常有),这些信息能帮助我们,使得设定变得清楚且容易。
因此,不管您有什么使用手册,准备好吧。即使现在不用,将来还是会用到的(设X-w
indow system时要显示卡的手册)。
第三部分 检查声卡的IRQ设定和其种类
如果配有一张声卡,除了要知道卡的种类外(例如 Sound Blaster)还需要知道这张卡
的IRQ地址。一般来说,卢卡的IRQ地址是5或7而IO地址则为220。DMA则l,不过,有时不
同的声卡可能会有不同的设定。因为稍后的选项里,就会要填入这些数字。
第四部分 编译核心的硬件需求
在编译核心时,确定您的RAM最好在8MB以上, 否则可能会很慢而且问题会很多,记得查
看swap有没有打开(用free指令)。此外,最好不要超频,不然很有可能会发生signal
11的错误,使得编到一半的核心停了下来,其实编译核心就好比编译程序一样,只是因
为构成核心的程序太多了,因此我们能小心尽量小心。

‘伍’ 请问下安卓4.2.2的systeam.img怎样解包,以及线刷改卡刷包

到官方网站下载rom包,找一张内存卡,储存到卡里,然后将卡插入手机,三键同按,就会开始卡刷,不过,这属于强制刷机,也就是说任何情况都能进行,包括手机黑屏死机什么的。

‘陆’ 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运行库)。

‘柒’ apktool4.0怎么反编译和回编译

您可以在安卓手机上反编译回编译安卓apk软件而不需要借助电脑。
apktool4.0推出!全新的bootimg解包打包机制,更可靠,更稳定。增加任务管理。解压后的数据包体积大幅减小。如果apktool文件夹不是放在/sdcard下,需要先长按apktool文件夹,选择“设为apktool数据目录”。自动检测机器是否已root,没root的仅部分含(root)的选项不能正常工作。即使没有root,也可以修改第三方软件。

‘捌’ android kernel 怎样反编译

好像不能反编译吧,自己到xda论坛找源码。如果手机厂官方没有公开源码,也没办法了

‘玖’ 字符串反编译

要解决的问题:
将下面的URL作为一个参数传到其他的页面
1 http://domain/de.apx?uid=12&page=15
2 url后面的参数中出现汉字等,如: ....aspx?title=起重机
在出现上面的情况的时候,必须经过一个RUL编码和解码的过程,否则会出现错误.

代码如下:
<a href="DictEdit.aspx?Dict=<%#Eval("SourceLang")%>&target=<%#Eval("TargetLang")%>&Email=<%#Eval("UserEmail")%>&Word=<%#System.Web.HttpUtility.UrlEncode(Eval("Word").ToString())%>"><img src="/img/mini_edit.gif" alt="编辑" /></a>

1//传值
2string temp = " <a href='Add.aspx?url=" +Server.UrlEncode( skin.Page.Request.Url.AbsoluteUri )+ "&title=" +Server.UrlEncode( skin.Page.Header.Title )+ "'>添加到收藏夹</a>");
3
4//在另外一个文件中取从上面传的值
5if (Request.QueryString["url"] != null)
6{
7 string url = Server.UrlDecode(Request.QueryString["url"].ToString());
8 this.txtAddress.Text = url;
9}
10if (Request.QueryString["title"] != null)
11{
12 string title = Server.UrlDecode(Request.QueryString["title"].ToString());
13 this.txtTitle.Text = title;
14}

原文链接在这里:)
http://www.cnblogs.com/lihuimingcn/archive/2008/11/04/1326433.html

‘拾’ 如何防止Unity3D代码被反编译

加密原理(无需Unity源码):

1. IDA Pro打开libmono.so, 修改mono_image_open_from_data_with_name为
mono_image_open_from_data_with_name_0,
2. 替换实现mono_image_open_from_data_with_name,
extern mono_image_open_from_data_with_name_0(...);
mono_image_open_from_data_with_name(...) {
MonoImage *img = mono_image_open_from_data_with_name_0(...);
//发现数据文件头不是DLL前缀则解密 img->raw_data, 相应修改img->raw_data_len
return img;
}
3. 重新打包libmono.so; 替换Unity3D中的android下的版本.
4. 另外写个加密的工具,植入构建环境(MonoDeveloper或VS,添加一个打包后Build Phase来加密DLL); (IOS下禁用JIT固采用AOT编译,DLL中没有逻辑代码,所以无需操心);

热点内容
安卓电视上如何下载电视家 发布:2024-09-21 08:29:57 浏览:293
php字符串引号 发布:2024-09-21 08:17:03 浏览:783
androidduration 发布:2024-09-21 08:17:03 浏览:402
大话西游2华山论剑什么时候开的服务器 发布:2024-09-21 08:00:15 浏览:530
编程马鞍数 发布:2024-09-21 07:48:32 浏览:726
新建文件夹dos命令 发布:2024-09-21 07:44:13 浏览:131
舞蹈解压介绍 发布:2024-09-21 07:40:04 浏览:973
qq如何显示密码 发布:2024-09-21 07:22:26 浏览:566
安卓导航如何调大mlc音量 发布:2024-09-21 06:59:21 浏览:34
洛奇解压中发生错误 发布:2024-09-21 06:53:30 浏览:293