手机android values文件夹wt是什么文件夹

当前【安卓手机】
全部安卓手机安卓平板安卓电视iPhoneiPad其他
当前位置:>>>96.1 WTTH安卓版
如果您正把手机连着电脑,欢迎点击
热门排行榜
100万+人在玩1000万+人在玩1000万+人在玩1000万+人在玩500万+人在玩100万+人在玩
96.1 WTTH app相关推荐
发现该应用有下载安装使用错误或恶意扣费携带病毒,请
版权所有 京ICP备号-5
京公网安备 50 备谁给了你第一个手机病毒?安卓手机病毒来源分析 -
| 关注黑客与极客
谁给了你第一个手机病毒?安卓手机病毒来源分析
共223102人围观
,发现 7 个不明物体
用户手机的第一个病毒从何而来?这篇文章也许能给你答案。
新应用安装概况
在用户下载安装应用之时,Clean Master会对下载的文件进行安全扫描,仅从Clean Master扫描数据来看,几乎每天都有上千万次的应用安装行为。
应用的安装来源分布如下图二所示。据统计,约有1/3的应用是在用户未设置installer的情况下安装的。这意味着这些应用的来源无法被监控,也就是下图二中的‘未知’来源。绝大部分手机病毒都隐藏在这部分‘未知’来源的应用中。
主要安装源中病毒相关的行为:
1. &GooglePlay安装源:
&&& 自动/网页广告/用户解锁/点击弹出的广告等来打开Google Play市场到指定的推广app页面,诱导下载
&&& 打开googlePlay模拟点击,自动安装(不需root)
2. 未知安装源:
&&& 通过色情网页,第三方链接等渠道下载的病毒
&&& 病毒推广安装的app
&&& 短信蠕虫
&&& 手机出厂预装(如赠品推广、电视广告等形式的山寨手机)
‘未知’来源的病毒应用安装情况
‘未知’来源的应用中含有大量病毒应用。来自Clean Master的数据显示,目前有三种病毒每天被安装超过10000次。
病毒应用名称
每天被安装次数
org.message.up.update
com.android.syscore
com.power.core.setting
org.ndf.sut
com.kiy.freewifi
com.zsysc.dwonload
com.impupa.hum.zq
com.witskies.yoyogo
com.kaixuan
com.google.webcps
com.android.tools.receiver
com.android.patchs
com.codeauroim.systemupdate
com.fun.locktouch
com.op.uuj
com.nts.gtf.zwt
net.smart.game
com.evince.exactly.exceeded
heart.clear.luck
com.bc.android.bctcore
com.bt.wallpapers.hd
com.google.android.syscps.mj
com.fpnq.cleaner
com.android.akeyassist.c
表一 ‘未知’来源病毒应用安装数量
不计算病毒推广安装的正常app,只计算被安装的应用为病毒的数量,根据上面的数据与每天安装总量的对比,病毒所占的比例不低于每天安装总量的千分之一。
以上病毒大部分是被谁推广的?
我们分析了其中两个主要病毒推广源com.sms.sys.manager与com.al.alarm.controller,它们属于同一家族,
这些病毒应用进入用户手机之后,会疯狂推广安装其他对用户无用的应用。下表是Clean Master统计到的设置了installer的数据。
图三中所示的两个病毒每日推广安装其他应用的数量较大。而受这两个病毒应用最严重的国家是印度,超过一半的感染量都在这里。其次是印度尼西亚和菲律宾,可见受灾最严重的国家主要集中在亚洲。
病毒恶意行为分析
遍历elf运行获取root权限
/system/bin/nis/system/bin/daemonnis/system/bin/.daemon/nis/system/bin/.sr/nis/system/bin/ndcfg/system/bin/.daemon/ndcfg/system/bin/.sr/ndcfg
广告推广及其它恶意app推广
这两个样本每天的推广安装量在3至4万之间,从1月份检测到此病毒至6月份为止一直成上升趋势,目前每天的推广量维持在3到4万之间。
分析完病毒推广维度,我们又统计了网页维度的app下载量,以从整体上对恶意app的安装有个总体的认知。
当用户访问某个链接时,CMS隐私浏览功能可以判断是否为恶意链接。下表是根据CM Security 查询的数据统计的通过恶意网址传播的TOP病毒。
Wireless optimizer
Root+恶意广告
WIFI Master pro
Root+恶意广告
AndroidSystemTheme
Adult Victoria
Root+恶意广告
AndroidBackup
MXplayer pro
Root+恶意广告
ES File Manager pro
Root+恶意广告
Love Beauty
Root+恶意广告
Root+恶意广告
Run Keeper
Root+恶意广告
Music Player Pro
Root+恶意广告
Root+恶意广告
表二 恶意应用下载top
GhostPush家族
以上所有病毒与恶意广告均属于同一家族,简要分析如下
MXplayer pro与Wireless optimizer代码结构
通过代码结构可以看到基本属于同一变种,其它的样本大多用了GhostPush相同的root模块,目前为止此病毒家族感染量一直稳居首位。
Wireless optimizer与MXplayer pro Root方式:
?& Wirelessoptimizer上传信息从云端获取root elf文件来进行root
root脚本及要替换的系统文件
root 用到的工具
root 手机的elf
?& Wirelessoptimizer下载root apk来进行root
root手机的apk
root样本的多次升级,目前Android6.0以下的机器基本都可以完成root,关键代码以加密的方式放于assets目录或服务器中,用时动态加载,放于系统目录伪装成系统内置应用,su的调用加入多个不同的参数防止第三方获取root。 这些都加大了对root病毒的检测及清除难度,所以root病毒至今依然猖獗,感染量居高不下。
Wirelessoptimizer
行为以第一个Wireless optimizer为例,总体流程:
主要行为简述:
?& 显示欺诈/色情页面,诱导支付或下载新的恶意样本
?& 显示广告/网站推广
?& 点击跳转到色情页面或app推广
?& 状态栏广告推送
病毒的行为同其它家族病毒行为基本相同,总体来说中毒用户依然是少数用户,但由于其具有root行为,并且病毒之间相互合作安装其它病毒,并通过色情,欺诈页面,引诱下载等方式引导用户下载恶意程序,所以其推广app的量甚至可以和一些第三方的应用市场持平,加上root病毒难以清除并经常自动从服务器更新广告/root sdk数据,会有一批稳定的“用户”量,通过广告,推广app等形式来获取收益。
以上病毒对应的恶意域名TOP
病毒对应恶意域名
d11w6715sf0qtr.cloudfront.net
d2xprsj0riymso.cloudfront.net
d2elva29up0ecb.cloudfront.net
d2b5yq44mldizo.cloudfront.net
d149ec88gwqs65.cloudfront.net
d2xprsj0riymso.cloudfront.net
d1aqbdl78d2ij9.cloudfront.net
d2xprsj0riymso.cloudfront.net
d2hxoy27lswrwn.cloudfront.net
d3nrmonu5chdoe.cloudfront.net
dflnr8mbt9zn4.cloudfront.net
developed.down.paipaijiajiahoho.rocks
developed.down.speedeverything.racing
d223pr27hf09gh.cloudfront.net
d32vdaxi7kise9.cloudfront.net
d1p99gh6syi4w3.cloudfront.net
d2zftpxw5x4sda.cloudfront.net
d12wwrgn171dpf.cloudfront.net
d3miaiw22d9toa.cloudfront.net
diyuudi4itl2y.cloudfront.net
d15kk6vif9vfl2.cloudfront.net
d2g6yvve5jkgj.cloudfront.net
d3befr7zfyxng9.cloudfront.net
dufk90vz3m463.cloudfront.net
developed.down.speedeverything.racing
d3v84euoiqd4ja.cloudfront.net
d16tqylaric8rz.cloudfront.net
d3vgnpmqp0287f.cloudfront.net
d1oys6pgzouz0v.cloudfront.net
d3hg5helwcy9a6.cloudfront.net
d3rnd9sreh1icy.cloudfront.net
dgpp3263vzsn4.cloudfront.net
d2qk9dhiyof2a7.cloudfront.net
dz4h53f1fc33s.cloudfront.net
d16lmr1g7q6e6x.cloudfront.net
d2ky4lft4asw5.cloudfront.net
down.slamdunk.space
ds1tj08wt495i.cloudfront.net
developed.down.paipaijiajiahoho.rocks
d9bf1mn02xkeo.cloudfront.net
表三 恶意域名top
由于是同一家庭的病毒,基本上访问的root服务、广告服务都是对应于同一个域名。猎豹移动安全实验室对这些域名的来源做了分析,以发现是什么样的链接引导用户安装恶意的app。
跳转到这些域名下载的上一级来源为
病毒下载链接的referrer
cloudfront.net
clickpartoffon.xyz
popads.net
zatnawqy.net
表四 上级链接来源top
可见病毒的主要来源,来自短链接以及一些广告链接。
经过我们排查短链接与广告链接的上一级来源后,结果大致如下。
l& 病毒在每天的安装量中占到至少千分之一,实际病毒的推广量远大于这个数值
l& 病毒安装量主要来源于root病毒及网页安装
l& 色情网站、短链接、广告链接为主要的病毒来源
病毒一般以色情、欺诈页面、诱导等方式通过第三方网页传播下载,目前Android6.0以下的机器都有被病毒root的风险,在平时请不要点击不认识的第三方链接,仅从正规市场上下载应用。一旦手机中了root病毒可以搜索相关的专杀软件或者通过手机售后刷机来达到清除root病毒的目的,除此外尽快升级为Android6.0或以上版本也是一个好的方法。
*猎豹移动安全实验室,转载请注明来自FreeBuf()&
必须您当前尚未登录。
必须(保密)
猎豹移动安全实验室官方账号
关注我们 分享每日精选文章Android逆向之旅---SO(ELF)文件格式详解 - 移动开发 - 程序员之家论坛 -
Powered by Discuz! Archiver
Android逆向之旅---SO(ELF)文件格式详解
&h1&第一、前言&/h1&&p&从今天开始我们正式开始Android的逆向之旅,关于逆向的相关知识,想必大家都不陌生了,逆向领域是一个充满挑战和神秘的领域。作为一名Android开发者,每个人都想去探索这个领域,因为一旦你破解了别人的内容,成就感肯定爆棚,不过相反的是,我们不仅要研究破解之道,也要研究加密之道,因为加密和破解是相生相克的。但是我们在破解的过程中可能最头疼的是native层,也就是so文件的破解。所以我们先来详细了解一下so文件的内容下面就来看看我们今天所要介绍的内容。今天我们先来介绍一下elf文件的格式,因为我们知道Android中的so文件就是elf文件,所以需要了解so文件,必须先来了解一下elf文件的格式,对于如何详细了解一个elf文件,就是手动的写一个工具类来解析一个elf文件。&/p&&p&&br /&&/p&&h1&第二、准备资料&/h1&&p&我们需要了解elf文件的格式,关于elf文件格式详解,网上已经有很多介绍资料了。这里我也不做太多的解释了。不过有两个资料还是需要介绍一下的,因为网上的内容真的很多,很杂。这两个资料是最全的,也是最好的。我就是看这两个资料来操作的:&/p&&p&第一个资料是非虫大哥的经典之作:&/p&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/46951.png& alt=&& /&&br /&&/p&&p&看吧,是不是超级详细?后面我们用Java代码来解析elf文件的时候,就是按照这张图来的。但是这张图有些数据结构解释的还不是很清楚,所以第二个资料来了。&/p&&p&第二个资料:北京大学实验室出的标准版&/p&&p&http://download.csdn.net/detail/jiangwei/9204051&br /&&/p&&p&这里就不对这个文件做详细解释了,后面在做解析工作的时候,会截图说明。&/p&&p&关于上面的这两个资料,这里还是多数两句:一定要仔细认真的阅读。这个是经典之作。也是后面工作的基础。&/p&&p&&br /&&/p&&h1&第三、工具&/h1&&p&当然这里还需要介绍一个工具,因为这个工具在我们下面解析elf文件的时候,也非常有用,而且是检查我们解析elf文件的模板。&/p&&p&就是很出名的:&strong&readelf&/strong&命令&/p&&p&不过Window下这个命令不能用,因为这个命令是Linux的,所以我们还得做个工作就是安装&strong&Cygwin&/strong&。关于这个工具的安装,大家可以看看这篇文章:&/p&&p&http://blog.csdn.net/jiangwei/article/details/&br /&&/p&&p&不过在下载的过程中,我担心小朋友们会遇到挫折,所以很贴心的,放到的云盘里面:&/p&&p&/s/1C1Zci&br /&&/p&&p&下载下来之后,需要改一个东西才能用:&/p&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/26547.png& alt=&& /&&br /&&/p&&p&该一下这个文件:&/p&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/30300.png& alt=&& /&&br /&&/p&&p&这个路径要改成你本地cygwin64中的bin目录的路径,不然运行错误的。改好之后,直接运行Cygwin.bat就可以了。&/p&&p&关于readelf工具我们这里不做太详细的介绍,只介绍我们要用到的命令:&/p&&p&&strong&1、readelf -h xxx.so&/strong&&/p&&p&查看so文件的头部信息&/p&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/35512.png& alt=&& /&&br /&&/p&&p&&br /&&/p&&p&&strong&2、readelf -S xxx.so&/strong&&/p&&p&查看so文件的段(Section)头的信息&/p&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/40861.png& alt=&& /&&br /&&/p&&p&&br /&&/p&&p&&strong&3、readelf -l xxx.so&/strong&&/p&&p&查看so文件的程序段头信息(Program)&/p&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/56464.png& alt=&& /&&br /&&/p&&p&&br /&&/p&&p&&strong&4、readelf -a xxx.so&/strong&&/p&&p&查看so文件的全部内容&/p&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/01855.png& alt=&& /&&br /&&/p&&p&&br /&&/p&&p&还有很多命令用法,这里就不在细说了,网上有很多介绍的~~&/p&&p&&br /&&/p&&h1&第四、实际操作解析Elf文件(Java代码&C++代码)&/h1&&p&上面我们介绍了elf文件格式资料,elf文件的工具,那么下面我们就来实际操作一下,来用Java代码手把手的解析一个libhello-jni.so文件。关于这个libhello-jni.so文件的下载地址:&/p&&p&http://download.csdn.net/detail/jiangwei/9204087&br /&&/p&&h2&&strong&1、首先定义elf文件中各个结构体内容&/strong&&/h2&&p&这个我们需要参考elf.h这个头文件的格式了。这个文件网上也是有的,这里还是给个下载链接吧:&/p&&p&http://download.csdn.net/detail/jiangwei/9204081&br /&&/p&&p&我们看看Java中定义的elf文件的数据结构类:&/p&&p&package com.demo.
import java.util.ArrayL
public class ElfType32 {
& & & & public elf32_
& & & & public elf32_
& & & & public ArrayList&Elf32_Sym& symList = new ArrayList&Elf32_Sym&();
& & & & public elf32_//elf头部信息
& & & & public ArrayList&elf32_phdr& phdrList = new ArrayList&elf32_phdr&();//可能会有多个程序头
& & & & public ArrayList&elf32_shdr& shdrList = new ArrayList&elf32_shdr&();//可能会有多个段头
& & & & public ArrayList&elf32_strtb& strtbList = new ArrayList&elf32_strtb&();//可能会有多个字符串值
& & & & public ElfType32() {
& & & & & & & & rel = new elf32_rel();
& & & & & & & & rela = new elf32_rela();
& & & & & & & & hdr = new elf32_hdr();
& & & & /**
& & & &*typedef struct elf32_rel {
& & & & & & & && &Elf32_Addr& & & & r_
& & & & & & & && &Elf32_Word& & & & r_
& & & & & & & & } Elf32_R
& & & & public class elf32_rel {
& & & & & & & & public byte[] r_offset =
& & & & & & & & public byte[] r_info =
& & & & & & & &
& & & & & & & & @Override
& & & & & & & & public String toString(){
& & & & & & & & & & & & return &r_offset:&+Utils.bytes2HexString(r_offset)+&;r_info:&+Utils.bytes2HexString(r_info);
& & & & & & & & }
& & & & /**
& & & &*typedef struct elf32_rela{
& & & & & & & && &Elf32_Addr& & & & r_
& & & & & & & && &Elf32_Word& & & & r_
& & & & & & & && &Elf32_Sword& & & & r_
& & & & & & & & } Elf32_R
& & & & public class elf32_rela{
& & & & & & & & public byte[] r_offset =
& & & & & & & & public byte[] r_info =
& & & & & & & & public byte[] r_addend =
& & & & & & & &
& & & & & & & & @Override
& & & & & & & & public String toString(){
& & & & & & & & & & & & return &r_offset:&+Utils.bytes2HexString(r_offset)+&;r_info:&+Utils.bytes2HexString(r_info)+&;r_addend:&+Utils.bytes2HexString(r_info);
& & & & & & & & }
& & & & /**
& & & &* typedef struct elf32_sym{
& & & & & & & && &Elf32_Word& & & & st_
& & & & & & & && &Elf32_Addr& & & & st_
& & & & & & & && &Elf32_Word& & & & st_
& & & & & & & && &unsigned char& & & & st_
& & & & & & & && &unsigned char& & & & st_
& & & & & & & && &Elf32_Half& & & & st_
& & & & & & & & } Elf32_S
& & & & public static class Elf32_Sym{
& & & & & & & & public byte[] st_name =
& & & & & & & & public byte[] st_value =
& & & & & & & & public byte[] st_size =
& & & & & & & & public byte st_
& & & & & & & & public byte st_
& & & & & & & & public byte[] st_shndx =
& & & & & & & &
& & & & & & & & @Override
& & & & & & & & public String toString(){
& & & & & & & & & & & & return &st_name:&+Utils.bytes2HexString(st_name)
& & & & & & & & & & & & & & & & & & & & +&\nst_value:&+Utils.bytes2HexString(st_value)
& & & & & & & & & & & & & & & & & & & & +&\nst_size:&+Utils.bytes2HexString(st_size)
& & & & & & & & & & & & & & & & & & & & +&\nst_info:&+(st_info/16)
& & & & & & & & & & & & & & & & & & & & +&\nst_other:&+(((short)st_other) & 0xF)
& & & & & & & & & & & & & & & & & & & & +&\nst_shndx:&+Utils.bytes2HexString(st_shndx);
& & & & & & & & }
& & & & public void printSymList(){
& & & & & & & & for(int i=0;i&symList.size();i++){
& & & & & & & & & & & & System.out.println();
& & & & & & & & & & & & System.out.println(&The &+(i+1)+& Symbol Table:&);
& & & & & & & & & & & & System.out.println(symList.get(i).toString());
& & & & & & & & }
& & & & //Bind字段==》st_info
& & & & public static final int STB_LOCAL = 0;
& & & & public static final int STB_GLOBAL = 1;
& & & & public static final int STB_WEAK = 2;
& & & & //Type字段==》st_other
& & & & public static final int STT_NOTYPE = 0;
& & & & public static final int STT_OBJECT = 1;
& & & & public static final int STT_FUNC = 2;
& & & & public static final int STT_SECTION = 3;
& & & & public static final int STT_FILE = 4;
& & & & /**
& & & &* 这里需要注意的是还需要做一次转化
& & & &*#define ELF_ST_BIND(x)& & & & ((x) && 4)
& & & & & & & & #define ELF_ST_TYPE(x)& & & & (((unsigned int) x) & 0xf)
& & & & /**
& & & &* typedef struct elf32_hdr{
& & & & & & & && &unsigned char& & & & e_
& & & & & & & && &Elf32_Half& & & & e_
& & & & & & & && &Elf32_Half& & & & e_
& & & & & & & && &Elf32_Word& & & & e_
& & & & & & & && &Elf32_Addr& & & & e_// Entry point
& & & & & & & && &Elf32_Off& & & & e_
& & & & & & & && &Elf32_Off& & & & e_
& & & & & & & && &Elf32_Word& & & & e_
& & & & & & & && &Elf32_Half& & & & e_
& & & & & & & && &Elf32_Half& & & & e_
& & & & & & & && &Elf32_Half& & & & e_
& & & & & & & && &Elf32_Half& & & & e_
& & & & & & & && &Elf32_Half& & & & e_
& & & & & & & && &Elf32_Half& & & & e_
& & & & & & & & } Elf32_E
& & & & public class elf32_hdr{
& & & & & & & & public byte[] e_ident =
& & & & & & & & public byte[] e_type =
& & & & & & & & public byte[] e_machine =
& & & & & & & & public byte[] e_version =
& & & & & & & & public byte[] e_entry =
& & & & & & & & public byte[] e_phoff =
& & & & & & & & public byte[] e_shoff =
& & & & & & & & public byte[] e_flags =
& & & & & & & & public byte[] e_ehsize =
& & & & & & & & public byte[] e_phentsize =
& & & & & & & & public byte[] e_phnum =
& & & & & & & & public byte[] e_shentsize =
& & & & & & & & public byte[] e_shnum =
& & & & & & & & public byte[] e_shstrndx =
& & & & & & & &
& & & & & & & & @Override
& & & & & & & & public String toString(){
& & & & & & & & & & & & return&magic:&+ Utils.bytes2HexString(e_ident)
& & & & & & & & & & & & & & & & & & & & +&\ne_type:&+Utils.bytes2HexString(e_type)
& & & & & & & & & & & & & & & & & & & & +&\ne_machine:&+Utils.bytes2HexString(e_machine)
& & & & & & & & & & & & & & & & & & & & +&\ne_version:&+Utils.bytes2HexString(e_version)
& & & & & & & & & & & & & & & & & & & & +&\ne_entry:&+Utils.bytes2HexString(e_entry)
& & & & & & & & & & & & & & & & & & & & +&\ne_phoff:&+Utils.bytes2HexString(e_phoff)
& & & & & & & & & & & & & & & & & & & & +&\ne_shoff:&+Utils.bytes2HexString(e_shoff)
& & & & & & & & & & & & & & & & & & & & +&\ne_flags:&+Utils.bytes2HexString(e_flags)
& & & & & & & & & & & & & & & & & & & & +&\ne_ehsize:&+Utils.bytes2HexString(e_ehsize)
& & & & & & & & & & & & & & & & & & & & +&\ne_phentsize:&+Utils.bytes2HexString(e_phentsize)
& & & & & & & & & & & & & & & & & & & & +&\ne_phnum:&+Utils.bytes2HexString(e_phnum)
& & & & & & & & & & & & & & & & & & & & +&\ne_shentsize:&+Utils.bytes2HexString(e_shentsize)
& & & & & & & & & & & & & & & & & & & & +&\ne_shnum:&+Utils.bytes2HexString(e_shnum)
& & & & & & & & & & & & & & & & & & & & +&\ne_shstrndx:&+Utils.bytes2HexString(e_shstrndx);
& & & & & & & & }
& & & & /**
& & & &* typedef struct elf32_phdr{
& & & & & & & && &Elf32_Word& & & & p_
& & & & & & & && &Elf32_Off& & & & p_
& & & & & & & && &Elf32_Addr& & & & p_
& & & & & & & && &Elf32_Addr& & & & p_
& & & & & & & && &Elf32_Word& & & & p_
& & & & & & & && &Elf32_Word& & & & p_
& & & & & & & && &Elf32_Word& & & & p_
& & & & & & & && &Elf32_Word& & & & p_
& & & & & & & & } Elf32_P
& & & & public static class elf32_phdr{
& & & & & & & & public byte[] p_type =
& & & & & & & & public byte[] p_offset =
& & & & & & & & public byte[] p_vaddr =
& & & & & & & & public byte[] p_paddr =
& & & & & & & & public byte[] p_filesz =
& & & & & & & & public byte[] p_memsz =
& & & & & & & & public byte[] p_flags =
& & & & & & & & public byte[] p_align =
& & & & & & & &
& & & & & & & & @Override
& & & & & & & & public String toString(){
& & & & & & & & & & & & return &p_type:&+ Utils.bytes2HexString(p_type)
& & & & & & & & & & & & & & & & & & & & +&\np_offset:&+Utils.bytes2HexString(p_offset)
& & & & & & & & & & & & & & & & & & & & +&\np_vaddr:&+Utils.bytes2HexString(p_vaddr)
& & & & & & & & & & & & & & & & & & & & +&\np_paddr:&+Utils.bytes2HexString(p_paddr)
& & & & & & & & & & & & & & & & & & & & +&\np_filesz:&+Utils.bytes2HexString(p_filesz)
& & & & & & & & & & & & & & & & & & & & +&\np_memsz:&+Utils.bytes2HexString(p_memsz)
& & & & & & & & & & & & & & & & & & & & +&\np_flags:&+Utils.bytes2HexString(p_flags)
& & & & & & & & & & & & & & & & & & & & +&\np_align:&+Utils.bytes2HexString(p_align);
& & & & & & & & }
& & & & public void printPhdrList(){
& & & & & & & & for(int i=0;i&phdrList.size();i++){
& & & & & & & & & & & & System.out.println();
& & & & & & & & & & & & System.out.println(&The &+(i+1)+& Program Header:&);
& & & & & & & & & & & & System.out.println(phdrList.get(i).toString());
& & & & & & & & }
& & & & /**
& & & &* typedef struct elf32_shdr {
& & & & & & & && &Elf32_Word& & & & sh_
& & & & & & & && &Elf32_Word& & & & sh_
& & & & & & & && &Elf32_Word& & & & sh_
& & & & & & & && &Elf32_Addr& & & & sh_
& & & & & & & && &Elf32_Off& & & & sh_
& & & & & & & && &Elf32_Word& & & & sh_
& & & & & & & && &Elf32_Word& & & & sh_
& & & & & & & && &Elf32_Word& & & & sh_
& & & & & & & && &Elf32_Word& & & & sh_
& & & & & & & && &Elf32_Word& & & & sh_
& & & & & & & & } Elf32_S
& & & & public static class elf32_shdr{
& & & & & & & & public byte[] sh_name =
& & & & & & & & public byte[] sh_type =
& & & & & & & & public byte[] sh_flags =
& & & & & & & & public byte[] sh_addr =
& & & & & & & & public byte[] sh_offset =
& & & & & & & & public byte[] sh_size =
& & & & & & & & public byte[] sh_link =
& & & & & & & & public byte[] sh_info =
& & & & & & & & public byte[] sh_addralign =
& & & & & & & & public byte[] sh_entsize =
& & & & & & & &
& & & & & & & & @Override
& & & & & & & & public String toString(){
& & & & & & & & & & & & return &sh_name:&+Utils.bytes2HexString(sh_name)/*Utils.byte2Int(sh_name)*/
& & & & & & & & & & & & & & & & & & & & +&\nsh_type:&+Utils.bytes2HexString(sh_type)
& & & & & & & & & & & & & & & & & & & & +&\nsh_flags:&+Utils.bytes2HexString(sh_flags)
& & & & & & & & & & & & & & & & & & & & +&\nsh_add:&+Utils.bytes2HexString(sh_addr)
& & & & & & & & & & & & & & & & & & & & +&\nsh_offset:&+Utils.bytes2HexString(sh_offset)
& & & & & & & & & & & & & & & & & & & & +&\nsh_size:&+Utils.bytes2HexString(sh_size)
& & & & & & & & & & & & & & & & & & & & +&\nsh_link:&+Utils.bytes2HexString(sh_link)
& & & & & & & & & & & & & & & & & & & & +&\nsh_info:&+Utils.bytes2HexString(sh_info)
& & & & & & & & & & & & & & & & & & & & +&\nsh_addralign:&+Utils.bytes2HexString(sh_addralign)
& & & & & & & & & & & & & & & & & & & & +&\nsh_entsize:&+ Utils.bytes2HexString(sh_entsize);
& & & & & & & & }
& & & & /****************sh_type********************/
& & & & public static final int SHT_NULL = 0;
& & & & public static final int SHT_PROGBITS = 1;
& & & & public static final int SHT_SYMTAB = 2;
& & & & public static final int SHT_STRTAB = 3;
& & & & public static final int SHT_RELA = 4;
& & & & public static final int SHT_HASH = 5;
& & & & public static final int SHT_DYNAMIC = 6;
& & & & public static final int SHT_NOTE = 7;
& & & & public static final int SHT_NOBITS = 8;
& & & & public static final int SHT_REL = 9;
& & & & public static final int SHT_SHLIB = 10;
& & & & public static final int SHT_DYNSYM = 11;
& & & & public static final int SHT_NUM = 12;
& & & & public static final int SHT_LOPROC = 0x;
& & & & public static final int SHT_HIPROC = 0x7
& & & & public static final int SHT_LOUSER = 0x;
& & & & public static final int SHT_HIUSER = 0
& & & & public static final int SHT_MIPS_LIST = 0x;
& & & & public static final int SHT_MIPS_CONFLICT = 0x;
& & & & public static final int SHT_MIPS_GPTAB = 0x;
& & & & public static final int SHT_MIPS_UCODE = 0x;
& & & & /*****************sh_flag***********************/
& & & & public static final int SHF_WRITE = 0x1;
& & & & public static final int SHF_ALLOC = 0x2;
& & & & public static final int SHF_EXECINSTR = 0x4;
& & & & public static final int SHF_MASKPROC = 0xf0000000;
& & & & public static final int SHF_MIPS_GPREL = 0x;
& & & & public void printShdrList(){
& & & & & & & & for(int i=0;i&shdrList.size();i++){
& & & & & & & & & & & & System.out.println();
& & & & & & & & & & & & System.out.println(&The &+(i+1)+& Section Header:&);
& & & & & & & & & & & & System.out.println(shdrList.get(i));
& & & & & & & & }
& & & & public static class elf32_strtb{
& & & & & & & & public byte[] str_
& & & & & & & &
& & & & & & & &
& & & & & & & & @Override
& & & & & & & & public String toString(){
& & & & & & & & & & & & return &str_name:&+str_name
& & & & & & & & & & & & & & & & & & & & +&len:&+
& & & & & & & & }
这个没什么问题,也没难度,就是在看elf.h文件中定义的数据结构的时候,要记得每个字段的占用字节数就可以了。&/p&&p&&br /&&/p&&p&有了结构定义,下面就来看看如何解析吧。&/p&&p&在解析之前我们需要将so文件读取到byte[]中,定义一个数据结构类型&/p&&p&public static ElfType32 type_32 = new ElfType32();
byte[] fileByteArys = Utils.readFile(&so/libhello-jni.so&);
if(fileByteArys == null){
& & & & System.out.println(&read file byte failed...&);
}&br /&&/p&&h2&&strong&2、解析elf文件的头部信息&/strong&&/h2&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/05475.png& alt=&& /&&br /&&/p&&p&关于这些字段的解释,要看上面提到的那个pdf文件中的描述&/p&&p&这里我们介绍几个重要的字段,也是我们后面修改so文件的时候也会用到:&/p&&p&&strong&1)、e_phoff&/strong&&/p&&p&这个字段是程序头(Program Header)内容在整个文件的偏移值,我们可以用这个偏移值来定位程序头的开始位置,用于解析程序头信息&/p&&p&&strong&2)、e_shoff&/strong&&/p&&p&这个字段是段头(Section Header)内容在这个文件的偏移值,我们可以用这个偏移值来定位段头的开始位置,用于解析段头信息&/p&&p&&strong&3)、e_phnum&/strong&&/p&&p&这个字段是程序头的个数,用于解析程序头信息&/p&&p&&strong&4)、e_shnum&/strong&&/p&&p&这个字段是段头的个数,用于解析段头信息&/p&&p&&strong&5)、e_shstrndx&/strong&&/p&&p&这个字段是String段在整个段列表中的索引值,这个用于后面定位String段的位置&/p&&p&&br /&&/p&&p&按照上面的图我们就可以很容易的解析&/p&&p&/**
* 解析Elf的头部信息
* @param header
private static voidparseHeader(byte[] header, int offset){
& & & & if(header == null){
& & & & & & & & System.out.println(&header is null&);
& & & & & & & &
& & & & /**
& & & &*public byte[] e_ident =
& & & & & & & & & & & & public short e_
& & & & & & & & & & & & public short e_
& & & & & & & & & & & & public int e_
& & & & & & & & & & & & public int e_
& & & & & & & & & & & & public int e_
& & & & & & & & & & & & public int e_
& & & & & & & & & & & & public int e_
& & & & & & & & & & & & public short e_
& & & & & & & & & & & & public short e_
& & & & & & & & & & & & public short e_
& & & & & & & & & & & & public short e_
& & & & & & & & & & & & public short e_
& & & & & & & & & & & & public short e_
& & & & type_32.hdr.e_ident = Utils.copyBytes(header, 0, 16);//魔数
& & & & type_32.hdr.e_type = Utils.copyBytes(header, 16, 2);
& & & & type_32.hdr.e_machine = Utils.copyBytes(header, 18, 2);
& & & & type_32.hdr.e_version = Utils.copyBytes(header, 20, 4);
& & & & type_32.hdr.e_entry = Utils.copyBytes(header, 24, 4);
& & & & type_32.hdr.e_phoff = Utils.copyBytes(header, 28, 4);
& & & & type_32.hdr.e_shoff = Utils.copyBytes(header, 32, 4);
& & & & type_32.hdr.e_flags = Utils.copyBytes(header, 36, 4);
& & & & type_32.hdr.e_ehsize = Utils.copyBytes(header, 40, 2);
& & & & type_32.hdr.e_phentsize = Utils.copyBytes(header, 42, 2);
& & & & type_32.hdr.e_phnum = Utils.copyBytes(header, 44,2);
& & & & type_32.hdr.e_shentsize = Utils.copyBytes(header, 46,2);
& & & & type_32.hdr.e_shnum = Utils.copyBytes(header, 48, 2);
& & & & type_32.hdr.e_shstrndx = Utils.copyBytes(header, 50, 2);
}按照对应的每个字段的字节个数,读取byte就可以了。&/p&&p&&br /&&/p&&h2&&strong&3、解析段头(Section Header)信息&/strong&&/h2&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/09162.png& alt=&& /&&br /&&br /&这个结构中字段见pdf中的描述吧,这里就不做解释了。后面我们会手动的构造这样的一个数据结构,到时候在详细说明每个字段含义。&/p&&p&按照这个结构。我们解析也简单了:&/p&&p&/**
* 解析段头信息内容
public static void parseSectionHeaderList(byte[] header, int offset){
& & & & int header_size = 40;//40个字节
& & & & int header_count = Utils.byte2Short(type_32.hdr.e_shnum);//头部的个数
& & & & byte[] des =
& & & & for(int i=0;i&header_i++){
& & & & & & & & System.arraycopy(header, i*header_size + offset, des, 0, header_size);
& & & & & & & & type_32.shdrList.add(parseSectionHeader(des));
private static elf32_shdr parseSectionHeader(byte[] header){
& & & & ElfType32.elf32_shdr shdr = new ElfType32.elf32_shdr();
& & & & /**
& & & &*public byte[] sh_name =
& & & & & & & & & & & & public byte[] sh_type =
& & & & & & & & & & & & public byte[] sh_flags =
& & & & & & & & & & & & public byte[] sh_addr =
& & & & & & & & & & & & public byte[] sh_offset =
& & & & & & & & & & & & public byte[] sh_size =
& & & & & & & & & & & & public byte[] sh_link =
& & & & & & & & & & & & public byte[] sh_info =
& & & & & & & & & & & & public byte[] sh_addralign =
& & & & & & & & & & & & public byte[] sh_entsize =
& & & & shdr.sh_name = Utils.copyBytes(header, 0, 4);
& & & & shdr.sh_type = Utils.copyBytes(header, 4, 4);
& & & & shdr.sh_flags = Utils.copyBytes(header, 8, 4);
& & & & shdr.sh_addr = Utils.copyBytes(header, 12, 4);
& & & & shdr.sh_offset = Utils.copyBytes(header, 16, 4);
& & & & shdr.sh_size = Utils.copyBytes(header, 20, 4);
& & & & shdr.sh_link = Utils.copyBytes(header, 24, 4);
& & & & shdr.sh_info = Utils.copyBytes(header, 28, 4);
& & & & shdr.sh_addralign = Utils.copyBytes(header, 32, 4);
& & & & shdr.sh_entsize = Utils.copyBytes(header, 36, 4);
}这里需要注意的是,我们看到的Section Header一般都是多个的,这里用一个List来保存&/p&&p&&br /&&/p&&h2&&strong&4、解析程序头(Program Header)信息&/strong&&/h2&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/12578.png& alt=&& /&&br /&这里的字段,这里也不做解释了,看pdf文档。&/p&&p&我们按照这个结构来进行解析:&/p&&p&/**
* 解析程序头信息
* @param header
public static void parseProgramHeaderList(byte[] header, int offset){
& & & & int header_size = 32;//32个字节
& & & & int header_count = Utils.byte2Short(type_32.hdr.e_phnum);//头部的个数
& & & & byte[] des =
& & & & for(int i=0;i&header_i++){
& & & & & & & & System.arraycopy(header, i*header_size + offset, des, 0, header_size);
& & & & & & & & type_32.phdrList.add(parseProgramHeader(des));
private static elf32_phdr parseProgramHeader(byte[] header){
& & & & /**
& & & &*public int p_
& & & & & & & & & & & & public int p_
& & & & & & & & & & & & public int p_
& & & & & & & & & & & & public int p_
& & & & & & & & & & & & public int p_
& & & & & & & & & & & & public int p_
& & & & & & & & & & & & public int p_
& & & & & & & & & & & & public int p_
& & & & ElfType32.elf32_phdr phdr = new ElfType32.elf32_phdr();
& & & & phdr.p_type = Utils.copyBytes(header, 0, 4);
& & & & phdr.p_offset = Utils.copyBytes(header, 4, 4);
& & & & phdr.p_vaddr = Utils.copyBytes(header, 8, 4);
& & & & phdr.p_paddr = Utils.copyBytes(header, 12, 4);
& & & & phdr.p_filesz = Utils.copyBytes(header, 16, 4);
& & & & phdr.p_memsz = Utils.copyBytes(header, 20, 4);
& & & & phdr.p_flags = Utils.copyBytes(header, 24, 4);
& & & & phdr.p_align = Utils.copyBytes(header, 28, 4);
}&/p&&p&&br /&&/p&当然还有其他结构的解析工作,这里就不在一一介绍了,因为这些结构我们在后面的介绍中不会用到,但是也是需要了解的,详细参见pdf文档。&p&&br /&&/p&&h2&&strong&5、验证解析结果&/strong&&/h2&&p&那么上面我们的解析工作做完了,为了验证我们的解析工作是否正确,我们需要给每个结构定义个打印函数,也就是从写toString方法即可。&/p&&p&&img src=&http://img.it-home.org/data/attachment/forum/2015pic1/16221.png& alt=&& /&&br /&&/p&&p&然后我们在使用readelf工具来查看so文件的各个结构内容,对比就可以知道解析的是否成功了。&/p&&p&&br /&&/p&&p&&strong&解析代码下载地址:http://download.csdn.net/detail/jiangwei/9204119&/strong&&/p&&p&&br /&&/p&&p&上面我们用的是Java代码来进行解析的,为了照顾广大程序猿,所以给出一个C++版本的解析类:&/p&&p&#include&iostream.h&
#include&string.h&
#include&stdio.h&
#include &elf.h&
& & & & 非常重要的一个宏,功能很简单:
& & & & P:需要对其的段地址
& & & & ALIGNBYTES:对其的字节数
& & & & 功能:将P值补充到时ALIGNBYTES的整数倍
& & & & 这个函数也叫:页面对其函数
& & & & eg: 0x3e45/0x1000 == &0x4000
#define ALIGN(P, ALIGNBYTES)( ((unsigned long)P + ALIGNBYTES -1)&~(ALIGNBYTES-1) )
int addSectionFun(char*, char*, unsigned int);
int main()
& & & & addSectionFun(&D:\libhello-jni.so&, &.jiangwei&, 0x1000);
& & & & return 0;
int addSectionFun(char *lpPath, char *szSecname, unsigned int nNewSecSize)
& & & & FILE *fdr, *
& & & & char *base = NULL;
& & & & Elf32_Ehdr *
& & & & Elf32_Phdr *t_phdr, *load1, *load2, *
& & & & Elf32_Shdr *s_
& & & & int flag = 0;
& & & & int i = 0;
& & & & unsigned mapSZ = 0;
& & & & unsigned nLoop = 0;
& & & & unsigned int nAddInitFun = 0;
& & & & unsigned int nNewSecAddr = 0;
& & & & unsigned int nModuleBase = 0;
& & & & memset(name, 0, sizeof(name));
& & & & if(nNewSecSize == 0)
& & & & & & & & return 0;
& & & & fdr = fopen(lpPath, &rb&);
& & & & strcpy(name, lpPath);
& & & & if(strchr(name, '.'))
& & & & & & & & strcpy(strchr(name, '.'), &_new.so&);
& & & & else
& & & & & & & & strcat(name, &_new&);
& & & & fdw = fopen(name, &wb&);
& & & & if(fdr == NULL || fdw == NULL)
& & & & & & & & printf(&Open file failed&);
& & & & & & & & return 1;
& & & & fseek(fdr, 0, SEEK_END);
& & & & mapSZ = ftell(fdr);//源文件的长度大小
& & & & printf(&mapSZ:0x%x\n&, mapSZ);
& & & & base = (char*)malloc(mapSZ * 2 + nNewSecSize);//2*源文件大小+新加的Section size
& & & & printf(&base 0x%x \n&, base);
& & & & memset(base, 0, mapSZ * 2 + nNewSecSize);
& & & & fseek(fdr, 0, SEEK_SET);
& & & & fread(base, 1, mapSZ, fdr);//拷贝源文件内容到base
& & & & if(base == (void*) -1)
& & & & & & & & printf(&fread fd failed&);
& & & & & & & & return 2;
& & & & //判断Program Header
& & & & ehdr = (Elf32_Ehdr*)
& & & & t_phdr = (Elf32_Phdr*)(base + sizeof(Elf32_Ehdr));
& & & & for(i=0;i&ehdr-&e_i++)
& & & & & & & & if(t_phdr-&p_type == PT_LOAD)
& & & & & & & & {
& & & & & & & & & & & & //这里的flag只是一个标志位,去除第一个LOAD的Segment的值
& & & & & & & & & & & & if(flag == 0)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & load1 = t_
& & & & & & & & & & & & & & & & flag = 1;
& & & & & & & & & & & & & & & & nModuleBase = load1-&p_
& & & & & & & & & & & & & & & & printf(&load1 = %p, offset = 0x%x \n&, load1, load1-&p_offset);
& & & & & & & & & & & & }
& & & & & & & & & & & & else
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & load2 = t_
& & & & & & & & & & & & & & & & printf(&load2 = %p, offset = 0x%x \n&, load2, load2-&p_offset);
& & & & & & & & & & & & }
& & & & & & & & }
& & & & & & & & if(t_phdr-&p_type == PT_DYNAMIC)
& & & & & & & & {
& & & & & & & & & & & & dynamic = t_
& & & & & & & & & & & & printf(&dynamic = %p, offset = 0x%x \n&, dynamic, dynamic-&p_offset);
& & & & & & & & }
& & & & & & & & t_phdr ++;
& & & & //section header
& & & & s_hdr = (Elf32_Shdr*)(base + ehdr-&e_shoff);
& & & & //获取到新加section的位置,这个是重点,需要进行页面对其操作
& & & & printf(&addr:0x%x\n&,load2-&p_paddr);
& & & & nNewSecAddr = ALIGN(load2-&p_paddr + load2-&p_memsz - nModuleBase, load2-&p_align);
& & & & printf(&new section add:%x \n&, nNewSecAddr);
& & & & if(load1-&p_filesz & ALIGN(load2-&p_paddr + load2-&p_memsz, load2-&p_align) )
& & & & & & & & printf(&offset:%x\n&,(ehdr-&e_shoff + sizeof(Elf32_Shdr) * ehdr-&e_shnum));
& & & & & & & & //注意这里的代码的执行条件,这里其实就是判断section header是不是在文件的末尾
& & & & & & & & if( (ehdr-&e_shoff + sizeof(Elf32_Shdr) * ehdr-&e_shnum) != mapSZ)
& & & & & & & & {
& & & & & & & & & & & & if(mapSZ + sizeof(Elf32_Shdr) * (ehdr-&e_shnum + 1) & nNewSecAddr)
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & printf(&无法添加节\n&);
& & & & & & & & & & & & & & & & return 3;
& & & & & & & & & & & & }
& & & & & & & & & & & & else
& & & & & & & & & & & & {
& & & & & & & & & & & & & & & & memcpy(base + mapSZ, base + ehdr-&e_shoff, sizeof(Elf32_Shdr) * ehdr-&e_shnum);//将Section Header拷贝到原来文件的末尾
& & & & & & & & & & & & & & & & ehdr-&e_shoff = mapSZ;
& & & & & & & & & & & & & & & & mapSZ += sizeof(Elf32_Shdr) * ehdr-&e_//加上Section Header的长度
& & & & & & & & & & & & & & & & s_hdr = (Elf32_Shdr*)(base + ehdr-&e_shoff);
& & & & & & & & & & & & & & & & printf(&ehdr_offset:%x&,ehdr-&e_shoff);
& & & & & & & & & & & & }
& & & & & & & & }
& & & & else
& & & & & & & & nNewSecAddr = load1-&p_
& & & & printf(&还可添加 %d 个节\n&, (nNewSecAddr - ehdr-&e_shoff) / sizeof(Elf32_Shdr) - ehdr-&e_shnum - 1);
& & & & int nWriteLen = nNewSecAddr + ALIGN(strlen(szSecname) + 1, 0x10) + nNewSecS//添加section之后的文件总长度:原来的长度 + section name + section size
& & & & printf(&write len %x\n&,nWriteLen);
& & & & char *lpWriteBuf = (char *)malloc(nWriteLen);//nWriteLen :最后文件的总大小
& & & & memset(lpWriteBuf, 0, nWriteLen);
& & & & //ehdr-&e_shstrndx是section name的string表在section表头中的偏移值,修改string段的大小
& & & & s_hdr.sh_size = nNewSecAddr - s_hdr.sh_offset + strlen(szSecname) + 1;
& & & & strcpy(lpWriteBuf + nNewSecAddr, szSecname);//添加section name
& & & & //以下代码是构建一个Section Header
& & & & Elf32_Shdr newSecShdr = {0};
& & & & newSecShdr.sh_name = nNewSecAddr - s_hdr.sh_
& & & & newSecShdr.sh_type = SHT_PROGBITS;
& & & & newSecShdr.sh_flags = SHF_WRITE | SHF_ALLOC | SHF_EXECINSTR;
& & & & nNewSecAddr += ALIGN(strlen(szSecname) + 1, 0x10);
& & & & newSecShdr.sh_size = nNewSecS
& & & & newSecShdr.sh_offset = nNewSecA
& & & & newSecShdr.sh_addr = nNewSecAddr + nModuleB
& & & & newSecShdr.sh_addralign = 4;
& & & & //修改Program Header信息
& & & & load1-&p_filesz = nWriteL
& & & & load1-&p_memsz = nNewSecAddr + nNewSecS
& & & & load1-&p_flags = 7;& & & & & & & & //可读 可写 可执行
& & & & //修改Elf header中的section的count值
& & & & ehdr-&e_shnum++;
& & & & memcpy(lpWriteBuf, base, mapSZ);//从base中拷贝mapSZ长度的字节到lpWriteBuf
& & & & memcpy(lpWriteBuf + mapSZ, &newSecShdr, sizeof(Elf32_Shdr));//将新加的Section Header追加到lpWriteBuf末尾
& & & & //写文件
& & & & fseek(fdw, 0, SEEK_SET);
& & & & fwrite(lpWriteBuf, 1, nWriteLen, fdw);
& & & & fclose(fdw);
& & & & fclose(fdr);
& & & & free(base);
& & & & free(lpWriteBuf);
& & & & return 0;
}&strong&&/strong&&/p&&p&&strong&&br /&&/strong&&/p&看了C++代码解析之后,这里不得不多说两句了,看看C++中的代码多么简单,原因很简单:在做文件字节操作的时候,C++中的指针真的很牛逼的,这个也是Java望成莫及的。。&p&&strong&&br /&&/strong&&/p&&p&&strong&C++代码下载:http://download.csdn.net/detail/jiangwei/9204139&/strong&&br /&&br /&&/p&&h1&第五、总结&/h1&&p&关于Elf文件的格式,就介绍到这里,通过自己写一个解析类的话,可以很深刻的了解elf文件的格式,所以我们在以后遇到一个文件格式的了解过程中,最好的方式就是手动的写一个工具类就好了。那么这篇文章是逆向之旅的第一篇,也是以后篇章的基础,下面一篇文章我们会介绍如何来手动的在elf中添加一个段数据结构,尽情期待~~&/p&&p&&br /&&/p&&p&&/p&&p style=&margin-top: 0 margin-bottom: 0 padding-top: 0 padding-bottom: 0 color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15 line-height: 35&&PS: 关注微信,最新Android技术实时推送&/p&&p style=&margin-top: 0 margin-bottom: 0 padding-top: 0 padding-bottom: 0 color: rgb(85, 85, 85); font-family: 'microsoft yahei'; font-size: 15 line-height: 35&&&img src=&http://blog.csdn.net/jiangwei/article/details/data:image/base64,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

我要回帖

更多关于 android 新建文件夹 的文章

 

随机推荐