㈠ android学习之Build环境介绍
这里略过对android在手机上的文件系统框架的阐述(google或者都能帮助你找到对应的信息),主要看google是如何把生成合适的rootfs的工作整合到它的build体系当中,同时,会顺带看一下CyanogenMod中对应各种机型的build机制。
首先,来看一下Android的build系统中,使用到的编译选项和相关工具
具体的目录在:mydroid/build/tools/下
|-- acp
这是一个稍微改良的cp命令,用来应付在windows/MAC/linux下的cp命令的缺陷,其中的README很值得一看!
|-- adbs
这是一个用来查看crash问题的工具,详细请看《Android调试工具之adbs》
|-- Android.mk
|-- apicheck
用来进行发布前的API检查(参见mydroid/build/core/tasks/apicheck.mk),是否新编译的系统中有破坏API兼容性或是非法的API
这里的代码是用java写的用来检查编译时生成的API相关信息的xml文件(mydroid/framework/base/api/中),可以参考里面对于xml文件解析的代码
|-- apriori
实现prelink的工具,简单介绍参见(mydroid/bionic/linker/README.TXT)
|-- atree
为android SDK服务的一个工具,用来按照指定xxx.atree文件中的内容进行一些文件操作
|-- bin2asm
不太明白具体的用处,应该是用来应付mac上编译android一些与gcc相关的问题
|-- buildinfo.sh
生成target中的各种xxx.prop文件,如system.prop, build.prop等
|-- check_builds.sh
包装了diff,用来看2个发布版本之间变化
|-- check_prereq
device上进行ota升级时的工具之一
|-- compare_fileslist.py
与check_builds.sh配合完成版本比较的脚本
|-- droiddoc
Android更具javadoc的一些移植
|-- mp-package-stats
简单的查看一个jar/apk文件内的dex和其它文件的大小信息
|-- event_log_tags.py
处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》
|-- fileslist.py
简化的列出指定目录下所有文件及大小的脚本 -- 可以放入自己的工具库了使用:)
|-- findleaves.py
在指定目录中(可多个)找指定文件的脚本 -- 可以放入自己的工具库了使用:)
|-- fixlinebreaks.sh
把windows中的换行改为linux下的 -- 可以放入自己的工具库了使用:大散芦)
|-- fs_config
列出指定文件夹滚带及文件的权限
|-- fs_get_stats
得到指定文件夹下文件的简单stats信息
|-- iself
判断文件是否是ELF格式
|-- isprelinked
判断文件是否是prelink过的
|-- java-event-log-tags.py
处理event-log-tags的内容,关于event-log-tags文件的意义参见《Android学习之event-log-tags是神马》
|-- kcm
key character map的工具, 相关资料参照:
|-- lsd
!!!!!! ???
|-- merge-event-log-tags.py
处理event-log-tags的内容,关于event-log-tags文件的意掘野义参见《Android学习之event-log-tags是神马》
|-- mktarball.sh
与fs_get_stats配合而执行的打包工具
|-- print_mole_licenses.sh
显示当前目录下所有mole信息
|-- releasetools
-- check_target_files_signatures
|-- common.py
|-- edify_generator.py
|-- img_from_target_files
|-- ota_from_target_files
`-- sign_target_files_apks
|-- rgb2565
rgb转换工具
|-- signapk
命令行下对jar包签名的工具
|-- soslim
Android定制的编译工具之一,简单介绍参见(mydroid/bionic/linker/README.TXT)
|-- warn.py
解析Android系统编译log的工具
`-- zipalign
zipfile的对齐工具,参见该文件夹下的README.TXT
#p#副标题#e#
在来看看Android编译系统中定义的一些通用XXX.mk文件
mydroid/build/core/
|-- armelflib.x
|-- armelf.x
|-- armelf.xsc
|-- base_rules.mk
|-- binary.mk
|-- build_id.mk
|-- build-system.html
|-- checktree
|-- cleanbuild.mk
|-- cleanspec.mk
|-- clear_vars.mk
|-- combo
|-- config.mk
|-- _headers.mk
|-- definitions.mk
|-- device.mk
|-- dex_preopt.mk
|-- distdir.mk
|-- droiddoc.mk
|-- mpvar.mk
|-- dynamic_binary.mk
|-- envsetup.mk
|-- executable.mk
|-- filter_symbols.sh
|-- find-jdk-tools-jar.sh
|-- help.mk
|-- host_executable.mk
|-- host_java_library.mk
|-- host_native_test.mk
|-- host_prebuilt.mk
|-- host_shared_library.mk
|-- host_static_library.mk
|-- java_library.mk
|-- java.mk
|-- legacy_prebuilts.mk
|-- main.mk
|-- Makefile
|-- multi_prebuilt.mk
|-- native_test.mk
|-- node_fns.mk
|-- notice_files.mk
|-- package.mk
|-- pathmap.mk |-- phony_package.mk
|-- prebuilt.mk
|-- process_wrapper_gdb.cmds
|-- process_wrapper_gdb.sh
|-- process_wrapper.sh
|-- proct_config.mk
|-- proct.mk
|-- proguard.flags
|-- proguard_tests.flags
|-- raw_executable.mk
|-- raw_static_library.mk
|-- root.mk
|-- shared_library.mk
|-- static_java_library.mk
|-- static_library.mk
|-- tasks
|-- user_tags.mk
`-- version_defaults.mk
#p#副标题#e#
这里,目录在mydroid/build/core/tasks/有一些特别的task
|-- apicheck.mk, 判断api是否符合AOSP的规范
|-- cts.mk cts测试, 可以在代码根目录, make cts, 编译结束之后,进入out/host/linux-x86/bin/下,执行cts命令
|-- ide.mk IDE开发环境
|-- proct-graph.mk
`-- sdk-addon.mk
NDK的build环境没有包含在标注难得AOSP的/build/目录下
而是在mydroid/ndk/build下
$ cd ndk/build/tools
$ export ANDROID_NDK_ROOT=aosp-root/ndk
$ ./make-release --help
一些小技巧
如何显示每次编译所包含的所有xxx.mk文件
找到build/core/main.mk
把include $(subdir_makefiles)替换为
[plain] view plain $(foreach subdir_makefile, $(subdir_makefiles),
$(info Including $(subdir_makefile))
$(eval include $(subdir_makefile)))
subdir_makefile :=
如果遇见API相关的PACKAGING/checkapi-current-timestamp] Error 38
需要执行:make update-api
如何在AOSP代码目录之外编译
[plain] view plain # Paths and settings
TARGET_PRODUCT = generic
ANDROID_ROOT = /home/karim/android/aosp-2.3.x
BIONIC_LIBC = $(ANDROID_ROOT)/bionic/libc
PRODUCT_OUT = $(ANDROID_ROOT)/out/target/proct/$(TARGET_PRODUCT)
CROSS_COMPILE =
$(ANDROID_ROOT)/prebuilt/linux-x86/toolchain/arm-eabi-4.4.3/bin/arm-eabi-
# Tool names
AS = $(CROSS_COMPILE)as
AR = $(CROSS_COMPILE)ar
CC = $(CROSS_COMPILE)gcc
CPP = $(CC) -E
LD = $(CROSS_COMPILE)ld
NM = $(CROSS_COMPILE)nm
OBJCOPY = $(CROSS_COMPILE)obj
OBJDUMP = $(CROSS_COMPILE)objmp
RANLIB = $(CROSS_COMPILE)ranlib
READELF = $(CROSS_COMPILE)readelf
SIZE = $(CROSS_COMPILE)size
STRINGS = $(CROSS_COMPILE)strings
STRIP = $(CROSS_COMPILE)strip
export AS AR CC CPP LD NM OBJCOPY OBJDUMP RANLIB READELF
SIZE STRINGS STRIP
# Build settings
CFLAGS = -O2 -Wall -fno-short-enums
HEADER_OPS = -I$(BIONIC_LIBC)/arch-arm/include
-I$(BIONIC_LIBC)/kernel/common
-I$(BIONIC_LIBC)/kernel/arch-arm
LDFLAGS = -nostdlib -Wl,-dynamic-linker,/system/bin/linker
$(PRODUCT_OUT)/obj/lib/crtbegin_dynamic.o
$(PRODUCT_OUT)/obj/lib/crtend_android.o
-L$(PRODUCT_OUT)/obj/lib -lc -ldl
# Installation variables
EXEC_NAME = example-app
INSTALL = install
INSTALL_DIR = $(PRODUCT_OUT)/system/bin
# Files needed for the build
OBJS = example-app.o
# Make rules
all: example-app
.c.o:
$(CC) $(CFLAGS) $(HEADER_OPS) -c {1}lt;
example-app: ${OBJS}
$(CC) -o $(EXEC_NAME) ${OBJS} $(LDFLAGS)
install: example-app
test -d $(INSTALL_DIR) || $(INSTALL) -d -m 755 $(INSTALL_DIR)
$(INSTALL) -m 755 $(EXEC_NAME) $(INSTALL_DIR)
clean:
rm -f *.o $(EXEC_NAME) core
distclean:
rm -f *~
rm -f *.o $(EXEC_NAME) core
如何增加一个新的设备
[plain] view plain $ cd ~/android/aosp-2.3.x
$ . build/envsetup.sh
$ mkdir -p device/acme/coyotepad
$ cd device/acme/coyotepad
进入AndroidProcts.mk
PRODUCT_MAKEFILES :=
$(LOCAL_DIR)/full_coyotepad.mk
对于full_coyotepad.mk
$(call inherit-proct, $(SRC_TARGET_DIR)/proct/languages_full.mk)
$(call inherit-proct, $(SRC_TARGET_DIR)/proct/full.mk)
DEVICE_PACKAGE_OVERLAYS :=
PRODUCT_PACKAGES +=
PRODUCT_COPY_FILES +=
PRODUCT_NAME := full_coyotepad
PRODUCT_DEVICE := coyotepad
PRODUCT_MODEL := Full Android on CoyotePad, meep-meep
在BoardConfig.mk中
TARGET_NO_KERNEL := true
TARGET_NO_BOOTLOADER := true
TARGET_CPU_ABI := armeabi
BOARD_USES_GENERIC_AUDIO := true
USE_CAMERA_STUB := true
打开vendorsetup.sh
add_lunch_combo full_coyotepad-eng
#p#副标题#e#
㈡ APP被攻击导致数据篡改泄露如何渗透测试漏洞与修复解决
APP渗透测试目前包含了Android端+IOS端的漏洞检测与安全测试,前段时间某金融客户的APP被黑客恶意攻击,导致APP里的用户数据包括平台里的账号,密码,手机号,姓名都被信息泄露,通过老客户的介绍找到我们SINE安全公司寻求安全防护上的技术支持,防止后期APP被攻击以及数据篡改泄露等安全问题的发生。针对于客户发生的网站被黑客攻击以及用户资料泄露的情况,我们立即成立了SINE安全移动端APP应急响应小组,关于APP渗透测试的内容以及如何解决的问题我们做了汇总,通过这篇文章来分享给大家。
首先要了解客户的情况,知彼知己百战不殆,客户APP架构开发是Web(php语言)+VUE框架,服务器采用的是Linuxcentos系统,数据库与WEBAPP端分离,通过内网进行传输,大部分金融以及虚拟币客户都是采用此架构,有的是RDS数据库,也基本都是内网传输,杜绝与前端的连接,防止数据被盗,但是如果前端服务器(APP)存在漏洞导致被黑客攻击,那么攻击者很有可能利用该服务器的权限去远程连接数据库端,导致数据泄露,用户信息被盗取的可能。
然后对客户服务器里的APP代码,以及网站PHP源文件进行代码的安全审计,以及网站木马文件的检测与清除,包括网站漏洞测试与挖掘,我们SINE安全都是人工进行代码的安全审计与木马检查,下载了客户代码到本地电脑里进行操作,包括了APP的网站访问日志,以及APP的Android端+IOS端文件也下载了一份到手机里。我们在检测到客户APP里的充值功能这里存在SQL注入漏洞,因为本身网站选择的是thinkphp框架二次开发的,程序员在写功能的时候未对充值金额的数值进行安全判断,导致可以远程插入恶意的SQL注入代码到服务器后端进行操作,SQL注入漏洞可以查询数据库里的任何内容,也可以写入,更改,通过配合日志的查询,我们发现该黑客直接读取了APP后台的管理员账号密码,客户使用的后台地址用的是二级域名,开头是admin.XXXXX.com,导致攻击者直接登录后台。我们在后台的日志也找到黑客的登录访问后台的日志,通过溯源追踪,黑客的IP是菲律宾的,还发现后台存在文件上传功能,该功能的代码我们SINE安全对其做了详细的人工代码安全审计与漏洞检测,发现可以上传任意文件格式漏洞,包括可以上传PHP脚本木马。
攻击者进一步的上传了已预谋好的webshell文件,对APP里的网站数据库配置文件进行了查看,利用APP前端服务器的权限去连接了另外一台数据库服务器,导致数据库里的内容全部被黑客打包导出,此次安全事件的根源问题才得以明了,我们SINE安全技术继续对该金融客户的APP网站代码进行审计,总共发现4处漏洞,1,SQL注入漏洞,2,后台文件上传漏洞。3,XSS跨站漏洞,4,越权查看其它用户的银行卡信息漏洞。以及APP前端里共人工审计出6个网站木马后门文件,包含了PHP大马,PHP一句话木马,PHP加密,PHP远程调用下载功能的代码,mysql数据库连接代码,EVAL免杀马等等。
我们SINE安全对SQL注入漏洞进行了修复,对get,post,cookies方式提交的参数值进行了安全过滤与效验,限制恶意SQL注入代码的输入,对文件上传漏洞进行修复,限制文件上传的格式,以及后缀名,并做了文件格式白名单机制。对XSS跨站代码做了转义,像经常用到的<>script等等的攻击字符做了拦截与转义功能,当遇到以上恶意字符的时候自动转义与拦截,防止前端提交到后台中去。对越权漏洞进行银行卡查看的漏洞做了当前账户权限所属判断,不允许跨层级的查看任意银行卡信息,只能查看所属账户下的银行卡内容。对检测出来的木马后门文件进行了隔离与强制删除,并对网站安全进行了防篡改部署,以及文件夹安全部署,服务器底层的安全设置,端口安全策略,等等的一系列安全防护措施。
至此客户APP渗透测试中发现的网站漏洞都已被我们SINE安全修复,并做了安全防护加固,用户信息泄露的问题得以解决,问题既然发生了就得找到漏洞根源,对网站日志进行溯源追踪,网站漏洞进行安全测试,代码进行安全审计,全方面的入手才能找出问题所在,如果您的APP也被攻击存在漏洞,不知道该如何解决,修复漏洞,可以找专业的网站安全渗透测试公司来解决,国内SINESAFE,鹰盾安全,绿盟,启明星辰,深信服都是比较专业的、也由衷的希望我们此次的安全处理过的分享能够帮到更多的人,网络安全了,我们才能放心的去运营APP。
㈢ linux下怎么样重命名文件
这两天在使用Ubuntu系统上进行开发软件的安装,一直遇到创建的Android
Studio图标无法使用的问题,创建的图标提示“应用程序启动错误”。在网上也找了很多文章,都是说文件夹中包含空格。但是文件路径确实没包含空格,但是包含-,即"android-studio",所以准备重命名进行尝试,但是遇到"bareword
not
allowed"的问题。
Linux下对文件重命名有两种命令:
mv
,rename
mv很简单,move文件移动
mv
/dir/file1
/dir2/file1
两个参数,第一个是源文件,第二个是目的地,如果第二个参数文件名不一样,则会重命名。
当两个参数不带目录,只有文件名时,那就是重命名了。这是单个文件的重命名。
rename
arg1
arg2
arg3
rename才是真正的批量重命名命令。而且他是3个参数,不是2个。
arg1:旧的字符串
arg2:新的字符串
arg3:匹配要重命名的文件,可以使用3种通配符,*、?、[char],*表示任意多个字符,?表示单个字符,[char]匹配char单个自定的精确字符,可以填写任意字符,foo[a]*表示只匹配fooa开头的文件名,如果一个文件是foobcc.txt,是不会被匹配的。
值的注意的是,此命令在不同的Linux版本也有不同,Debian一系的操作系统别有用法。举例说明:
比如/home下有两个文件
abbcc.txt,
addbb.txt
,
a.txt
我想把a替换为xxx,命令是这样的
:
rename
“a”
“xxx”
*.txt
那么它会首先去匹配有哪些文件需要修改,这里凡是.txt后缀的文件都会被匹配,如果改成?.txt则只会匹配到一个文件,那就是a.txt。然后把匹配到的文件中的a字符替换为xxx,注意测试时abab.txt这样的,只会替换第一个a,有待再了解。
说到Debian一系的操作系统,比如Ubuntu,这个命令这样使用是不对的,报错,向下面这样的:
Bareword
“a”
not
allowed
while
“strict
subs”
in
use
at
(eval
1)
line
1.
经过Google之后发现有这样的说法:
On
Debian-based
distros
it
takes
a
perl
expression
and
a
list
of
files.
you
need
to
would
need
to
use:
rename
‘s/foo/foox/’
*
这里是一个perl表达式,好理解点说就是综合了前两个参数为1个,这样就只需要2个参数,而非上面所说的3个参数形式。
所以在Ubuntu下执行上面举例的重命名时,命令是这样的:rename
‘s/a/xxx/’
*.txt