源码编译绕过反调试

Bingghost Bingghost     2022-08-15     449

关键词:

参考师弟的贴子修改的, 基本我一次就弄好了, 没有遇到啥问题, 下面我主要是补充下他的帖子

http://bbs.pediy.com/showthread.php?t=213481


一. 环境搭建

(1). 环境介绍:

手机:nexus 5

ubuntu版本:15.10

android版本:4.4.4


android源码官网(这里有很多相关的资料,基本上按照官网的来就可以编译想编译的任何版本了)

http://source.android.com/source/


(2). 环境配置

配置环境得好好看看这篇,不同的android版本选择不同的环境

http://source.android.com/source/requirements.html


JDK环境配置 

(支持多版本,这个姿势正确点, 以后如果要编译其他版本的可以随时切换JDK版本)

ps:题外话,python也有类似的版本管理方案

http://www.cnblogs.com/butterfly-clover/p/5764587.html

. 添加软件源

sudo add-apt-repository ppa:webupd8team/java

.更新软件源

sudo apt-get update

.安装 jdk 6

sudo apt-get install oracle-java6-installer

.查看所有 jdk 安装版本

sudo update-java-alternatives -l

java-6-oracle 3 /usr/lib/jvm/java-6-oracle

java-7-oracle 4 /usr/lib/jvm/java-7-oracle

java-8-oracle 2 /usr/lib/jvm/java-8-oracle

.通过-s参数可以方便的切换到其它的java版本

$ sudo update-java-alternatives -s java-6-oracle


需要注意的是:

不同版本的android源码需要不同的jdk来编译,不然可能会在源码编译的时候报错jdk版本不对


Cupcake到Froyo  (android1.5~android2.2.x) 使用JDK5

Gingerbread到kitkat (android2.3.x~android4.4.x)使用JDK6

Lollipop到Marshmallow (android5.x~android6.0) Open-JDK7

其他版本使用OpenJDK8


对应手机型号的支持版本在这里查询

http://source.android.com/source/build-numbers.html

我的版本属于kitkat,所以用jdk6编译


python环境

python环境Ubuntu 15.10已经安装了所以略过,如果没有需要安装python2.6~2.7


安装编译库环境

编译依赖的环境按照这里进行配置

http://source.android.com/source/initializing.html

官网上看起来Ubuntu15.10是不用再另外配置环境了,这点我没有进行尝试,我当时没有看到这个页面,所以我还是按照Ubuntu14.04的方式配置了环境

sudo apt-get install git-core gnupg flex bison gperf build-essential \

  zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \

  lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \

  libgl1-mesa-dev libxml2-utils xsltproc unzip


okay环境都配置好了,下面开始下载源码


二. 下载源码

(1). 官网教程

谷歌官网的教程在这里,我这边下载的比较慢(谷歌源)

http://source.android.com/source/downloading.html


(2). 配置清华大学的下载源

我们使用清华大学的源,速度飞快,在公司的网络,一个晚上就下载好了

1. 配置git

设置 github邮箱姓名使用 git 工具,配置github可以百度github配置本篇幅不在多余介绍

git config --global user.email "<你的 github 的 email 地址>"

git config --global user.name "<你的 github 的 name 名称>"


2.下载repo

我们后面会使用repo来进行源码下载,repo是什么?(请自行百度)

我这边是这样管理的,新建了一个android目录,然后在android目录下新建了一个aosp目录

我们的源码以后就下载到aosp目录了


cd到android目录执行下面第2条代码

①. git clone git://aosp.tuna.tsinghua.edu.cn/android/git-repo.git/

. git clone https://aosp.tuna.tsinghua.edu.cn/android/git-repo.git

我这边试了下,好像只能用https的方式下载了, 所以我们选择方案2


3. 配置repo可执行

下载完毕后会得到一个 git-repo 项目,找到里面的 repo 文件, 

在我们的android目录下新建一个bin目录,同时复制repo到bin目录

最后在加上可执行的权限

chmod a+x repo


4. 修改repo,设置repo下载源为清华源

修改下载 URL

双击打开 repo,修改 REPO_URL 为

. REPO_URL = 'git://aosp.tuna.tsinghua.edu.cn/android/git-repo'

. REPO_URL = 'https://aosp.tuna.tsinghua.edu.cn/android/git-repo'

同理修改成方案2,https的url, 方案一现在不能用了


然后使用

export PATH=......./android/bin:$PATH   (给出全路径)

导出 bin 执行目录


5.下载源码

新建一个目标文件夹用于存放源码文件,命令行中用 cd 指令进入。执行下面指令

repo init -u https://aosp.tuna.tsinghua.edu.cn/android/platform/manifest -b android-4.4.4_r1


上面的版本号在这里查询

http://source.android.com/source/build-numbers.html#source-code-tags-and-builds


最后执行下面的指令就可以开始下载源码了

repo sync

^_^ 漫长的等待, 我晚上下班回家之前开始下载的,早上来就下载好了

记得设置不要睡眠(电源选项&亮度和锁屏)


(3). 下载驱动文件

接下来在官网下载手机对应的驱动(如下):

https://developers.google.com/android/nexus/drivers#hammerhead

找到 Nexus 5 (GSM/LTE) binaries for Android 4.4.4 (KTU84P)

下面三个文件都要下载,解压后是三个.sh文件,放到安卓源码根目录下,

分别对三个文件chmod a+x 文件名 赋权限,然后分别执行三个文件,此时会生成 vendor文件夹。


三. 编译系统源码

android官网的编译介绍

http://source.android.com/source/building.html


aosp_arm-eng为模拟器

nexus5为aosp_hammerhead-userdebug

编译完后操作系统路径为 out/target/product/hammerhead下


编译时依次执行下面这些命令即可

source build/envsetup.sh                           # 设置编译环境

lunch aosp_hammerhead-userdebug        # 设置编译选项

export USE_CCACHE=1                           #  使用缓存,可以加快以后的编译速度

prebuilts/misc/linux-x86/ccache/ccache -M 100G   #使用 100GB 来作为缓存的空间

#设置缓存地址,可以不要这个命令而使用默认缓存路径

export CCACHE_DIR=/<path_of_yourt_choice>/.ccache   

make -j4


编译完后:

输出目录: out/target/product/hammerhead


五. 下载编译内核源码

此时编译的操作系统自带默认的内核,要修改内核的话,得重新下载内核源码并修改编译。

在Android源码文件夹下创建kernel文件夹,并下载内核源码:

相关说明在这里:

http://source.android.com/source/building-kernels.html

(1). git clone https://android.googlesource.com/kernel/msm.git

(由于实验手机设备为Nexus 5,因此我们选择内核代码为msm.git)


(2). checkout所选内核版本

cd ~/source/kernel/msn

git branch –a

git checkout remotes/origin/android-msm-hammerhead-3.4-kitkat-mr1


(3). 修改内核调试标志,绕过反调试(Kernel proc)

要修改的文件: 

kernel/msm/fs/proc/base.c 

kernel/msm/fs/proc/array.c 


要修改对以下文件的写入 

Status,stat

修改点: 


1. base.c 第285行改成如下: 

else { 

           if (strstr(symname, "trace")) { 

                return sprintf(buffer, "%s", "sys_epoll_wait"); 

           } 

           return sprintf(buffer, "%s", symname); 

      } 


2. array.c第134行改成如下: 

      static const char * const task_state_array[] = { 

           "R (running)",        /*    0 */ 

           "S (sleeping)",       /*    1 */ 

           "D (disk sleep)",     /*    2 */ 

           "S (sleeping)",       /*    4 */ 

           "S (sleeping)", /*     8 */ 

           "Z (zombie)",         /*  16 */ 

           "X (dead)",           /*  32 */ 

           "x (dead)",           /*  64 */ 

           "K (wakekill)",       /* 128 */ 

           "W (waking)",         /* 256 */ 

      };  

array.c第187行改成如下: 

      "Gid:\t%d\t%d\t%d\t%d\n", 

                get_task_state(p), 

                task_tgid_nr_ns(p, ns), 

                pid_nr_ns(pid, ns), 

                ppid, /*tpid*/0, 

                cred->uid, cred->euid, cred->suid, cred->fsuid, 

                cred->gid, cred->egid, cred->sgid, cred->fsgid); 

    修改完成后,按下面步骤编译内核,刷入系统


4、修改Makefile文件支持交叉编译器,编译内核。可用内核初始化脚本如下:

到kernel源码目录新建build.sh

export PATH='/media/bingghost/data/android/aosp/prebuilts/gcc/linux-x86/arm/arm-eabi-4.6/bin':$PATH

export ARCH=arm

export SUBARCH=arm

export CROSS_COMPILE=arm-eabi-

make hammerhead_defconfig

make -j4


--------执行build.sh-------------

chmod 777 build.sh

./build.sh


编译成功后可以看到下面的输出:

编译完内核后,内核生成的路径为:kernel/msm/arch/arm/boot目录下的zImage-dtb文件(nexus 5是这个文件,nexus 4是zImage文件,请注意别弄错了),把该文件复制到源码下的device/lge/hammerhead-kernel夹下(注意:nexus 4则为mako-kernel文件夹),覆盖掉同名文件,然后重新按上面步骤编译一次安卓源码(这时候编译很快完成)即可


六. 刷机

刷机过程可以参考我之前的一篇文章

http://blog.csdn.net/bingghost/article/details/53308694


(1). 检测 USB 端口

1. 配置好adb和fastboot的环境变量,在android sdk里面均有

2. 检测adb和fastboot能否正常识别手机

         adb devices

         fastboot devices

有型号的输出则能识别,不能则需要按照下面进配置


(2). 配置USB端口

如果上面的检测usb不通过,则按照下面的方法来配置

stackoverflow上的介绍

http://stackoverflow.com/questions/7641939/android-fastboot-waiting-for-devices

①. 将下面的内容保存为51-android.rules,OWNER="xxx", xxx修改成你的用户名

# adb protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e12", MODE="0600", OWNER="<username>"
# fastboot protocol on passion (Nexus One)
SUBSYSTEM=="usb", ATTR{idVendor}=="0bb4", ATTR{idProduct}=="0fff", MODE="0600", OWNER="<username>"
# adb protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e22", MODE="0600", OWNER="<username>"
# fastboot protocol on crespo/crespo4g (Nexus S)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e20", MODE="0600", OWNER="<username>"
# adb protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="22b8", ATTR{idProduct}=="70a9", MODE="0600", OWNER="<username>"
# fastboot protocol on stingray/wingray (Xoom)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="708c", MODE="0600", OWNER="<username>"
# adb protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="04e8", ATTR{idProduct}=="6860", MODE="0600", OWNER="<username>"
# fastboot protocol on maguro/toro (Galaxy Nexus)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e30", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d101", MODE="0600", OWNER="<username>"
# adb protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="d002", MODE="0600", OWNER="<username>"
# fastboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d022", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d00f", MODE="0600", OWNER="<username>"
# usbboot protocol on panda (PandaBoard ES)
SUBSYSTEM=="usb", ATTR{idVendor}=="0451", ATTR{idProduct}=="d010", MODE="0600", OWNER="<username>"
# adb protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e42", MODE="0600", OWNER="<username>"
# fastboot protocol on grouper/tilapia (Nexus 7)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4e40", MODE="0600", OWNER="<username>"
# adb protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee2", MODE="0600", OWNER="<username>"
# fastboot protocol on manta (Nexus 10)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0600", OWNER="<username>"
# adb protocol on hammerhead (Nexus 5)
SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee1", MODE="0600", OWNER="<username>"

②. 修改51-android.rules,添加如下2行,注意OWNER修改成自己的用户名

# fastboot protocol on manta (Nexus 5)

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", ATTR{idProduct}=="4ee0", MODE="0666", OWNER="<bingghost>"

# fastboot protocol on manta (Nexus 5)

SUBSYSTEM=="usb", ATTR{idVendor}=="18d1", MODE="0666", OWNER="<bingghost>"

③. 放到 Ubuntu 的/etc/udev/rules.d/51-android.rules


修改完后用命令

sudo service udev restart

重启服务进程,重新拨插数据线再

fastboot devices

查看是否识别出来


(3). 刷机

1. 进入bootload模式

手机关机之后, 按住下音量键和电源键(同时按住不放)


2. 解锁bootload

fastboot oem unlock


3. 刷机

插上手机连接上电脑,确认正常连接上电脑后,进行刷机

转到源码img生成路径

cd source/out/target/product/hammerhead/

adb reboot bootloader

fastboot -w flashall

大概两分钟后,系统刷成功


 







修改系统内核绕过反调试tracerpid为0

原文http://bbs.pediy.com/showthread.php?t=207538感谢作者整理,亲测可用坐着用的mac现在改成windows下操作设备nexus5系统android4.4如果设备与上不符 按照以下方法获取boot.img一、  提取ker内核文件在提取zImage前,必须确保自己拥... 查看详情

学习:反调试之检测类名与标题名(代码片段)

...成功的话那么直接ExitProcess反调试之检测类名与标题名的绕过:FindWindow接收两个参数,上面我们可以看到传入的参数为类名,标题名不进行判断直接在判断比较的时候将ZF标志位置1不进行跳转就可以成功绕过了 查看详情

android反编译反调试入门资料

0x01反编译出错1.插入无效指令是部分逆向工具崩溃原理:大部分逆向工具都是线性读取字节码并解析,如dex2jar,baksmali,apktool等,当遇到无效字节码时,就会引起反编译工具解析失败。例如:新版的dex2jar遇到这种情... 查看详情

java层反调试

...试以“百度加固”为例。1.将样本拖入jdax-gui中,进行反编译,来到加固程序的onCreate里,如下图所示。2 查看详情

一种基于tls的高级反调试技术(代码片段)

...程序入口处插入断点命令来调试程序。对于使用C/C++语言编译的程序来说,问题通常会更严重,在执 查看详情

反调试手法之createprocess反调试(代码片段)

              反调试手法之CreateProcess反调试在学习Win32创建进程的时候.我们发现了有一个进程信息结构体.STARTUPINFO.这个结构体可以实现反调试.具体CreateProcess可以参考上一篇博客.:  https://www.cnblogs.com/iBi... 查看详情

android签名验证与反调试机制的对抗技术(代码片段)

文章目录前言签名验证1.1签名机制1.2签名验签1.3签名绕过反反调试2.1tracerPid检测2.2进程名称检测2.3关键文件检测2.4调试端口检测2.5ptrace值检测2.6时间差异检测2.7内置函数检测2.8调试断点检测总结前言Android的APK文件为了防止被篡... 查看详情

过反调试

...二者本为一体破解技术就不要我多介绍了,下面我来介绍反调试技术也就是所谓的防破解技术反调试技术可以简单通俗的理解为:防止OD分析软件的技术,也就是反调试技术那么反调试技术又有几种呢?下面我介绍几种常用反调... 查看详情

反调试-checkremotedebuggerpresent

和IsDebuggerPresent差不多简单的反调试技术 查看详情

反调试-isdebuggerpresent

目前这个是我知道的最简单的反调试方法了 查看详情

ida动态调试破解alicrackme与反调试对抗(代码片段)

...调试对抗2.1Ptrace2.2全局调试2.3反反调试APK破解(下)3.1重新编译3.2动态调试总结前言在前面的文章中IDA动态调试破解EXE文件与分析APK流程介绍了IDA对APK进行动态调试分析的简单流程,然而实际上很多APP为了防止被动态调试分析&#... 查看详情

反调试

反调试IsDebuggerPresent()__readgsqword(0x60)得到指向PEB64的指针,pPeb->BeingDebugged.__readfsdword(0x30)CheckRemoteDebuggerPresent(GetCurrentProcess(),&bIsDbgPresent)BOOL HeapFlags(),64位下,得到指向PEB的地址加 查看详情

elf反调试初探

ELF反调试初探http://www.freebuf.com/sectool/83509.html ELF(ExecutableandLinkableFormat)是Unix及类Unix系统下可执行文件、共享库等二进制文件标准格式。为了提高动态分析的难度,我们往往需要对ELF文件增加反调试措施。本文便对相关技术进... 查看详情

.NET:如何隔离反调试类库?

】.NET:如何隔离反调试类库?【英文标题】:.NET:Howtoisolateananti-debuggingclasslibrary?【发布时间】:2022-01-2212:28:51【问题描述】:我构建了一个.NET类库并使用混淆器通过反调试对其进行混淆。我使用我的混淆类库构建了一个测试项... 查看详情

javascript奇淫技巧:反调试

JavaScript奇淫技巧:反调试本文,将分享几种JS代码反调试技巧,目标是:实现防止他人调试、动态分析自己的代码。检测调试,方法一:用console.log检测代码:varc=newRegExp("1");c.toString=function()alert("检测到调试")console.log(c);原理:... 查看详情

《逆向工程核心原理》学习笔记:反调试技术(代码片段)

目录前言一、反调试技术概况二、静态反调试技术1、PEB2、NtQueryInformationProcess()(1)ProcessDebugPort(0x7)(2)ProcessDebugObjectHandle(0x1E)(3)ProcessDebugFlags(0x1F)(4)例子(5)破解之法3、NtQuerySystemIn... 查看详情

android逆向案例:干掉梆梆加固免费版的反调试检测

...行网银手机客户端分析壳类型:使用【d2j-dex2jar】反编译后发现关键代码缺失,因为AndroidManifest.xml中的绝大部分activity和server的实现都是在cmb.pb这个包中,但是反编译的代码里没有cmb.pb这个包,只有一些无关紧要... 查看详情

android逆向案例:干掉梆梆加固免费版的反调试检测

...行网银手机客户端分析壳类型:使用【d2j-dex2jar】反编译后发现关键代码缺失,因为AndroidManifest.xml中的绝大部分activity和server的实现都是在cmb.pb这个包中,但是反编译的代码里没有cmb.pb这个包,只有一些无关紧要... 查看详情