so分析
找到native层的cL函数(该函数为动态注册,这个只需要hook RegisterNative即可看到详细地址)
nativeCL是我改的名字。点入该函数,直接看汇编
首先来到ndk的目录下的.../toolchains/llvm/prebuilt/linux-x86_64/bin
,然后./clang --version
查看clang的版本。
我们这里的版本是11.05,那我们就找最接近这个版本的11.01
llvm版本来进行编译和使用。
我们采用的是ubuntu18来进行编译。请在控制台执行如下命令
1 | sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig |
在llvm的目录下创建一个目录用来编译mkdir build_debug
执行如下命令cmake -G "Ninja" ../llvm/
(release则为cmake -G Ninja -DMAKE_BUILD_TYPE=Release -DLLVM_INCLUDE_TEST=OFF -DLLVM_ENABLE_PROJECTS="clang" ../llvm
)
此时可能会发生报错,大致的内容是llvm12.0以后只支持3.14及以上的cmake来进行编译,虽然我也纳闷我编译的是llvm11.01为啥会报错,既然报错,那我们就升级cmake,具体怎么升级,可以参考这个链接https://askubuntu.com/questions/1164459/how-to-install-cmake-3-14-on-ubuntu-18-04
,编译cmake的过程可能会报错如下
此时需要执行如下命令sudo apt install libssl-dev
再次执行命令
发现还是报这个问题,搜了一下是因为Ninja没有在$PATH
环境变量里被找到。好吧,下一个吧。。。
参考这个链接https://ninja-build.org/
,装好之后请添加Ninja
到~/.bashrc
当中。
再次编译,Ok~
ninja -jn
,n的大小一般为核数 * 2
最佳等待编译结束。。。(以下截图是我编译Release之后的,但本教程其实是在编译Debug),出现截图这样的情况就意味着编译成功了~
CRC32: 4个字节的int
MD5: 返回结果的特征长度为32个字符或者0x10大小的buffer
sha1: 返回结果的特征长度为40个字符或者0x14大小的buffer
sha256: 返回结果的特征长度为64个字符或者0x20大小的buffer
HMAC: 常见的组合类型为搭配(md5、sha1、sha256)
因为网络传输占用带宽较多,且存储压力增加。
待补充
hexdump开头是1f8b则可以判断出它是gzip压缩的
789c
开头是PK则可以判断它是zip压缩的
它不算是压缩,应该是打包,其开头为文件名
开头是7z的就是7z压缩
本文在原文[原创][分享]AndroidSyscallLogger的基础上对Android10的内核进行编译,并迁移AndroidSyscallLogger到Android10(实际上就是直接搬过来\笑),感谢原作者石头哥在我编译他原项目时所作的指导,磕磕绊绊完成他项目的使用和改进。废话不说多,开始我们的正文。
我们需要的是手动编译内核,而不需要官网的这个基于脚本编译内核,但是我们需要参考一下官网这里给出的repo路径找到我们应该需要clone的目录。
然后参考官方的手动构建内核下载源代码部分。clone 我们刚才标记的msm
,即跟官方要clone的这部分一样
git clone https://android.googlesource.com/kernel/msm
NOTE: 科学需要大家自己各显神通哦~
下载完成之后切换分支git checkout -b android-msm-wahoo-4.4-android10-qpr3 origin/android-msm-wahoo-4.4-android10-qpr3
dang dang dang dang~
这样我们就把我们想要下的内核源码就下完了,但是我们还需要设置一下,原文用到make menuconfig
,我们就不用了,那样的做法不科学。科学的做法实际上官方已经给出。
先在msm目录内执行以下步骤
1 | export ARCH=arm64 |
我们要配置的内容都在这个.config里面
我们按照原文的配置要求挨个去搜索然后配置好即可,这里略过,但给出相应需要配置的地方(有些地方可能找不到配置,无所谓那就略过呗~)
1 |
|
写好.config之后,make -j8
/frameworks/base/core/java/android/os/Build.java
读源码最终应该会统一到某一个函数内,我们试着跟看看。
前往getString(String str)
再往上跟SystemProperties.get
所在位置/frameworks/base/core/java/android/os/SystemProperties.java
private static native String native_get(String key);
可以看到这个是一个native函数,我们接着跟到JNI层。
可以看到该函数被动态注册了,其原函数为SystemProperties_getS
最终来到SystemProperties_getSS
RegisterNatives函数是JNI动态注册时所用到的函数,其定义在结构体ArtMethod当中,其在Android10的具体实现是在/art/runtime/jni/jni_internal.cc
。
static jint RegisterNatives(JNIEnv* env, jclass java_class, const JNINativeMethod* methods, jint method_count)
=>
const void* ArtMethod::RegisterNative(const void* native_method)
=>
void RuntimeCallbacks::RegisterNativeMethod(ArtMethod* method, const void* in_cur_method, /out/void** new_method)
=>
void SetEntryPointFromJni(const void* entrypoint)
=>
template
ALWAYS_INLINE void SetEntryPointFromJniPtrSize(const void* entrypoint, PointerSize pointer_size)
=>
template
ALWAYS_INLINE void SetDataPtrSize(const void* data, PointerSize pointer_size)
=>
template
ALWAYS_INLINE void SetNativePointer(MemberOffset offset, T new_value, PointerSize pointer_size)
Monitor(原来叫做DDMS),使用必须把ro.debuggable=0 需要改成1,然后界面才能显示应用的进程。
使用adb工具输入如下命令:
1 | adb shell //adb进入命令行模式 |
改成之后打开monitor便可以看到应用进程。
monitor的目录在C:\Users\xxx\AppData\Local\Android\Sdk\tools
打开之后界面如下
找到我们想要trace的进程(图中显示一堆?应该是monitor的bug,如果找不到进程名,强退几次app应该就能看到了)。
点OK
然后再重新点击那个按钮,即可看到如图所示的刚才点开始到点结束的那段时间的Java函数的运行情况。
1 | [Pixel 2 XL::com.wudaokou.hippo]-> from_method: com.alibaba.wireless.security.open.initialize.b.$init.overload('java.lang.String') |
sendControlMessage(context, buildBindApp, 1, z);
<==
iACCSManager.bindApp(mContext, this.mConfig.getAppKey(), this.mConfig.getAppSecret(), str, iAppReceiver);
<==
buildBindApp(Context context, String str, String str2, String str3, String str4, String str5, String str6)
<==
buildBindApp(context, str2, intent.getStringExtra(“appKey”), intent.getStringExtra(“app_sercet”), stringExtra, intent.getStringExtra(“ttid”), intent.getStringExtra(“appVersion”));
sessionCenter.registerSessionInfo(SessionInfo.create(str, z, true, new Auth(this, str), this.smartHeartbeat, this))
==>
public Auth(BaseConnection baseConnection, String str) {
this.TAG = baseConnection.getTag();
this.authUrl = baseConnection.buildAuthUrl(“https://“ + str + “/accs/“);
this.connectionType = baseConnection.mConnectionType;
this.connection = baseConnection;
}
==>
public static SessionInfo create(String str, boolean z, boolean z2, IAuth iAuth, IHeartbeat iHeartbeat, DataFrameCb dataFrameCb2)
==>
private SessionInfo(String str, boolean z, boolean z2, IAuth iAuth, IHeartbeat iHeartbeat, DataFrameCb dataFrameCb2) {
this.host = str;
this.isAccs = z2;
this.auth = iAuth;
this.isKeepAlive = z;
this.heartbeat = iHeartbeat;
this.dataFrameCb = dataFrameCb2;
}
1 | public String buildAuthUrl(String str) { |
1 | com.alipay.apmobilesecuritysdk.d.c // 风控设备信息参数组装处 |
github: https://github.com/virjar/sekiro
SEKIRO 是一个 android 下的 API 服务暴露框架,可以用在 app 逆向、app 数据抓取、android 群控等场景。
build.gradle
中的dependencies里添加api project(':sekiro-lib')
(若是在其他项目如Xposed项目中,以jar包形式使用sekiro,则需要添加相应的jar包到libs里,然后在build.gradle里的dependencies添加api 'com.virjar:sekiro-api:1.0.3'
,以上版本号仅是示例,请以实际jar包版本为主)build.gradle
中添加1 | packagingOptions { |
在这之前要先了解Sekiro的几个概念
用于区分一个Sekiro客户端的一个ID
用于手机跟服务器链接的IP/域名,该服务器的作用是用于单个服务器管理多个手机用的。
tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true