iis网站的建设,北京 公司网站开发,硬盘做网站空间,深圳市城乡和住房建设局文章目录 一些资料IDA调试命令IDA调试安卓的10个技巧objection基本使用 Wallbreaker1frida源码阅读之frida-java 第一个实例EasyJNI第二个实例objection资料 art_trace2.pyart_trace2.js IDAFrida分析CTF样本和Frid源码和objection模块 一些资料
IDA调试命令
adb devices
adb… 文章目录 一些资料IDA调试命令IDA调试安卓的10个技巧objection基本使用 Wallbreaker1frida源码阅读之frida-java 第一个实例EasyJNI第二个实例objection资料 art_trace2.pyart_trace2.js IDAFrida分析CTF样本和Frid源码和objection模块 一些资料
IDA调试命令
adb devices
adb push d:\as /data/local/tmp/asadb shell
suchmod 777 /data/local/tmp/as/data/local/tmp/as
/data/local/tmp/as -p31928再开一个cmd窗口
adb forward tcp:23946 tcp:23946
adb forward tcp:31928 tcp:31928adb shell am start -D -n com.yaotong.crackme/.MainActivity
adb shell am start -D -n com.wolf.ndktest/.MainActivity
adb shell am start -D -n com.faloo.BookReader4Android/com.faloo.app.activity.LogoPageActivity
adb shell am start -D -n com.example.helloworld/com.example.helloworld.MainActivity
adb shell am start -D -n com.pingan.peanut/com.pingan.peanut.activity.GuideActivity
adb shell am start -D -n com.lalamove.huolala.driver/.main.mvp.ui.SplashActivity打开DDMS或者执行adb forward tcp:8700 jdwp:7319jdb -connect com.sun.jdi.SocketAttach:hostname127.0.0.1,port8616如果出现错误
查看serverSocket所监听的端口
netstat -naostatic main(void)
{
auto fp, dexAddress, end, size;
dexAddress 0xD9B18000;
size 0xBF000;
end dexAddress size;
fp fopen(C:\\Users\\Administrator\\Desktop\\upx.so, wb);
for ( ; dexAddress end; dexAddress )
fputc(Byte(dexAddress), fp);
}动态调式本身就是很复杂的和APP本身安卓系统IDA软件电脑环境要下断的函数等都有联系
任何一个因素都可能影响动态调试的成败。大部分错误都在JDB启动那一步网上没有好的解决或原因
分析下面就做一些小结
1.不满足动态调试条件安卓系统配置文件build.prop的ro.debugable或APP的Androidmainfest.xml中的android:debugable必须两个有1个为true。
2.使用jdb前的步骤出现错误如android_server文件权限不够没有am start启动目标程序等。
3.一般来说使用jdb连接前后都是可以下断的但确实会出现有的必须jdb连接前下断有的必须jdb连接后下断否则可能出现错误。
4.虽然说jdb连接前后都可以下断但在jdb连接前一定要先用IDA附加这个次序是一定的。
5.jdb属于电脑的JDK如果JDK出错JDB也可能出错。有关so层逆向分析的问题
问题解决
1.加密方法在一个叫libmt2.so的so文件中然后用ida动态调试附加之后
发现搜不到这个libmt2.so的so文件这种类型问题怎么解决第一步要先判断so文件是否已经加载到内存中 如果在IDA里面搜索不到第二步cat /proc/$pid/maps 执行该命令获取模块列表信息获取指定应用程序的进程pidps 获取当前存在进程信息补充|grep 特征字符串ida工具里面搜索不到 如何下段调试解决方法
b3cfe000-b3d0c000 r-xp 00000000 b3:17 521239 /data/app/bin.mt.plus-2/lib/arm/libmt2.so
b3d0c000-b3d0d000 r--p 0000d000 b3:17 521239 /data/app/bin.mt.plus-2/lib/arm/libmt2.so
b3d0d000-b3d0e000 rw-p 0000e000 b3:17 521239 /data/app/bin.mt.plus-2/lib/arm/libmt2.sob3cfe000 模块起始地址偏移地址ida静态分析时在反汇编窗口中的左边的地址栏dd if/dev/zero of/data/local/tmp/info.txt bs1 count1if 代表输入文件。如果不指定if默认就会从stdin中读取输入/dev/zero 是一个字符设备会不断返回0值字节\0。
of 代表输出文件。如果不指定of默认就会将stdout作为默认输出。
bs 代表字节为单位的块大小。
count 代表被复制的块数。 获取指定进程模块信息
cat /proc/6594/maps info.txtdex是看0x20处找大小odex是看0x32处就有
dd if/proc/7081/mem of/data/local/tmp/dump.so skip3421749248 bs1 count16384tcpdumpWireshark:
adb shell tcpdump -p -vv -s 0 -w /sdcard/capture.pcap 开始抓包
ctrlc 结束抓包
adb pull /sdcard/capture.pcap 导出文件tcpdump下载地址
https://www.androidtcpdump.com/android-tcpdump/downloads孤挺花Armariris基于LLVM的支持多平台多语言的混淆器开源工程https://github.com/GoSSIP-SJTU/ArmaririsControl Flow Flattening(-fla,控制流程平坦化)
Bogus Control Flow(-bcf,虚假控制流程)
Instructions Substitution SplitBasicBlock (-sub,指令替换)
字符串加密Pass
函数名称加密Pass分析技巧
分析被ollvm混淆的算法的时候关心的参数的加密过程以及结果的生成过程。Android源码在线阅读http://androidxref.com/http://aospxref.com/系统源码下载地址
链接https://pan.baidu.com/s/1IW-UR2UaDQaEQKB8DRa_bg 提取码n5sb seLinux安全机制:adb shell getenforce adb shell setenforce 0当系统引导程序启动Linux内核内核会加载各种数据结构和驱动程序
加载完毕之后Android系统开始启动并加载第一个用户级别的进程
即init进程。
1.启动电源以及系统启动当电源按下时引导芯片代码从预定义的地方(固化在ROM)开始执行加载引导程序BootLoader到ARM然后执行
2.引导程序bootloader引导程序BootLoader是在Android操作系统运行前的一个小程序它的主要作用是把系统OS拉起来并运行
3.Linux内核启动当内核启动时设置换成、被好好存储器、计划列表、加载驱动当内核完成系统设置时它首先在系统文件中寻找init.rc文件并启动init进程
4.init进程启动创建和挂载启动需要的文件目录初始化和启动属性服务解析init.rc配置文件并启动zygote进程
5.zygote进程启动创建AndroidRuntime并调用其start函数启动zygote进程创建java虚拟机并为java虚拟机注册JNI函数通过JNI调用ZygoteInit的main方法进入zygote的java框架层通过registerServerSocket方法创建服务器端socket并通过runSelectLoop方法等待AMS的请求来创建新的应用程序进程启动SystemServer进程该进程主要用来创建系统服务
6.systemserver进程启动启动binder线程池这样就可以与其他进程进行通信创建SystemServiceManager其用于对系统的服务进行创建、启动和生命周期管理启动各种系统方法(引导服务、核心服务、其他服务)
7.launcher启动Android 8.1.0 libart.so 32 JNI_onLoad
.text:0024F88C
.text:0024F88C loc_24F88C ; CODE XREF: .text:0024FD9Cj
.text:0024F88C ; .text:0024FE10j
.text:0024F88C MOV R0, R6
.text:0024F88E MOVS R1, #0
.text:0024F890 BLX R5
.text:0024F892 MOV R7, R0
.text:0024F894 LDR R0, [R6,#4]
.text:0024F896 LDR.W R0, [R0,#0x2D4]
.text:0024F89A CBZ R0, loc_24F8A6
.text:0024F89C CMP R0, #0x15
.text:0024F89E BGT loc_24F8A6
.text:0024F8A0 MOVS R0, #0xBAndroid 8.1.0 libart.so 64 JNI_onLoad
.text:0000000000300F68 loc_300F68 ; CODE XREF: art::JavaVMExt::LoadNativeLibrary(_JNIEnv *,std::__1::basic_stringchar,std::__1::char_traitschar,std::__1::allocatorchar const,_jobject *,_jstring *,std::__1::basic_stringchar,std::__1::char_traitschar,std::__1::allocatorchar*)FAC↓j
.text:0000000000300F68 ; art::JavaVMExt::LoadNativeLibrary(_JNIEnv *,std::__1::basic_stringchar,std::__1::char_traitschar,std::__1::allocatorchar const,_jobject *,_jstring *,std::__1::basic_stringchar,std::__1::char_traitschar,std::__1::allocatorchar*)1030↓j
.text:0000000000300F68 MOV X0, X22
.text:0000000000300F6C MOV X1, XZR
.text:0000000000300F70 BLR X27
.text:0000000000300F74 LDR X8, [X22,#8]
.text:0000000000300F78 MOV W24, W0
.text:0000000000300F7C LDR W8, [X8,#0x4A8]
.text:0000000000300F80 CBZ W8, loc_300F94
.text:0000000000300F84 CMP W8, #0x15
.text:0000000000300F88 B.GT loc_300F94
.text:0000000000300F8C MOV W0, #0xBAndroid 8.1.0 linker 32 function
.text:00013562 LDR R1, (aLinker - 0x13572)
.text:00013564 ADR R2, aCallingCTorSPF ; [ Calling c-tor %s %p for %s ]
.text:00013566 MOVS R0, #4
.text:00013568 MOV R3, R4
.text:0001356A STRD.W R6, R5, [SP]
.text:0001356E ADD R1, PC ; linker
.text:00013570 BL __dl_async_safe_format_log
.text:00013574
.text:00013574 loc_13574 ; CODE XREF: __dl__ZL13call_functionPKcPFviPPcS2_ES0_18↑j
.text:00013574 LDR R0, (__dl_g_envp_ptr - 0x1357A)
.text:00013576 ADD R0, PC ; __dl_g_envp_ptr
.text:00013578 LDR R0, [R0] ; __dl_g_envp
.text:0001357A LDR R2, [R0]
.text:0001357C LDR R0, (__dl_g_argv_ptr - 0x13582)
.text:0001357E ADD R0, PC ; __dl_g_argv_ptr
.text:00013580 LDR R0, [R0] ; __dl_g_argv
.text:00013582 LDR R1, [R0]
.text:00013584 LDR R0, (__dl_g_argc_ptr - 0x1358A)
.text:00013586 ADD R0, PC ; __dl_g_argc_ptr
.text:00013588 LDR R0, [R0] ; __dl_g_argc
.text:0001358A LDR R0, [R0]
.text:0001358C BLX R6
.text:0001358E LDR R0, (__dl_g_ld_debug_verbosity - 0x13594)
.text:00013590 ADD R0, PC ; __dl_g_ld_debug_verbosity
.text:00013592 LDR R0, [R0]Android 8.1.0 linker 64 function
.text:0000000000020838 ADRP X2, #aCallingCTorSPFPAGE ; [ Calling c-tor %s %p for %s ]
.text:000000000002083C MOV W0, #4
.text:0000000000020840 MOV X1, X23
.text:0000000000020844 ADD X2, X2, #aCallingCTorSPFPAGEOFF ; [ Calling c-tor %s %p for %s ]
.text:0000000000020848 MOV X3, X26
.text:000000000002084C MOV X4, X28
.text:0000000000020850 MOV X5, X19
.text:0000000000020854 BL __dl_async_safe_format_log
.text:0000000000020858
.text:0000000000020858 loc_20858 ; CODE XREF: __dl__ZL10call_arrayIPFviPPcS1_EEvPKcPT_mbS5_D0↑j
.text:0000000000020858 ADRP X8, #__dl_g_argc_ptrPAGE
.text:000000000002085C LDR X8, [X8,#__dl_g_argc_ptrPAGEOFF]
.text:0000000000020860 LDR W0, [X8]
.text:0000000000020864 ADRP X8, #__dl_g_argv_ptrPAGE
.text:0000000000020868 LDR X8, [X8,#__dl_g_argv_ptrPAGEOFF]
.text:000000000002086C LDR X1, [X8]
.text:0000000000020870 ADRP X8, #__dl_g_envp_ptrPAGE
.text:0000000000020874 LDR X8, [X8,#__dl_g_envp_ptrPAGEOFF]
.text:0000000000020878 LDR X2, [X8]
.text:000000000002087C BLR X28
.text:0000000000020880 LDR W8, [X25,#__dl_g_ld_debug_verbosityPAGEOFF]
.text:0000000000020884 CMP W8, #2.text:0000000000020AE0 ADRP X1, #__dl_$d.20_0PAGE ; linker
.text:0000000000020AE4 ADRP X2, #aCallingCTorSPFPAGE ; [ Calling c-tor %s %p for %s ]
.text:0000000000020AE8 ADRP X3, #aDtInitPAGE ; DT_INIT
.text:0000000000020AEC ADD X1, X1, #__dl_$d.20_0PAGEOFF ; linker
.text:0000000000020AF0 ADD X2, X2, #aCallingCTorSPFPAGEOFF ; [ Calling c-tor %s %p for %s ]
.text:0000000000020AF4 ADD X3, X3, #aDtInitPAGEOFF ; DT_INIT
.text:0000000000020AF8 MOV W0, #4
.text:0000000000020AFC MOV X4, X20
.text:0000000000020B00 MOV X5, X21
.text:0000000000020B04 BL __dl_async_safe_format_log
.text:0000000000020B08
.text:0000000000020B08 loc_20B08 ; CODE XREF: __dl__ZN6soinfo17call_constructorsEv1C0↑j
.text:0000000000020B08 ADRP X8, #__dl_g_argc_ptrPAGE
.text:0000000000020B0C ADRP X9, #__dl_g_argv_ptrPAGE
.text:0000000000020B10 ADRP X10, #__dl_g_envp_ptrPAGE
.text:0000000000020B14 LDR X8, [X8,#__dl_g_argc_ptrPAGEOFF]
.text:0000000000020B18 LDR X9, [X9,#__dl_g_argv_ptrPAGEOFF]
.text:0000000000020B1C LDR X10, [X10,#__dl_g_envp_ptrPAGEOFF]
.text:0000000000020B20 LDR W0, [X8]
.text:0000000000020B24 LDR X1, [X9]
.text:0000000000020B28 LDR X2, [X10]
.text:0000000000020B2C BLR X20
.text:0000000000020B30 LDR W8, [X23,#__dl_g_ld_debug_verbosityPAGEOFF]
.text:0000000000020B34 CMP W8, #2
IDA调试安卓的10个技巧 objection基本使用 Wallbreaker1 frida源码阅读之frida-java 第一个实例EasyJNI 发现只有32位的so 运行64位的frida 常见的ps命令及输出格式
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.1 168448 9776 ? Ss Aug28 0:03 /usr/lib/systemd/systemd --system --deserialize 19
root 2 0.0 0.0 0 0 ? S Aug28 0:00 [kthreadd]
...
第二个实例
jadx先看java代码看调用的时机
复制这个代码 找到偏移地址 因为我的手机是64位的将64位的so库放入到IDA工具中 选中我们要调试的函数 如何看64位的指令 arm64位指令集
将Graph View切换成TextView 目标要得到的结果 IDA导入头文件
步骤一点击IDA Pro 菜单项“File-Load file-Parse c header file ” 选择jni.h头文件步骤二点击IDA Pro 主界面上的“Structures”选项卡 然后按下Insert键打开“Create structure/union”对话框点击界面上的Add standard structure按钮在打开的结构体选择对话框中选择JNINativeInterface并点击OK返回同理JNIInvokeInterface结构体也导入进来步骤四在0x29C等调用env的地方右键出现jni函数 输出一个结果 使用下面的脚本
// HOOK未导出函数
function Test02() {// 绝对地址so模块起始地址(基地址)偏移地址let baseAddr Module.findBaseAddress(libcyberpeace.so);send(baseAddr: baseAddr);// 指令集 分为ARM指令、thumb指令// ARM指令地址不变 thumb指令地址1 sub_ 开头的函数 这种函数只能使用这种方式来进行Interceptor.attach(baseAddr.add(0x840), {onEnter: function (args) {send(CheckString);send(args[0]); // 第一个参数send(args[1]); // 第二个参数send(args[2]); // 第三个参数// 获取JNIEnv*let env Java.vm.tryGetEnv();// 将jstring 转换 const char*let str env.getStringUtfChars(args[2], 0);send(str.readCString());console.log(hexdump(str, {offset: 0,length: 32,header: true,ansi: false}));},onLeave: function (retval) {send(result);send(retval);// 获取JNIEnv*let env Java.vm.tryGetEnv();// 将jstring 转换 const char*let str env.getStringUtfChars(retval, 0);send(str.readCString());}});
}Java.perform(function () {Test02();
})能得到正确的结果 返回结果是0x0并不是我们想要的结果所以要使用IDA调试一下 关闭frida-server 使用64位的android_server64 选择一个进程 搜索模块 双击进入 并找到我们要找到的函数 跳转到你想要看指定寄存器的位置 老师又返回看了看静态分析的函数 拿数据 分析后的结果
objection
资料
Windows/Ubuntu安装frida和objection 原创 kali Linux 逆向环境pyenv、Frida、objection、jadx、的安装
先运行frida-sever 端口转发 跳转到指定的界面 生成Hook样例代码 监控类
art_trace2.py
# -*- coding: utf-8 -*-import os
import sys
import frida
import codecsdef message(message, data):if message[type] send:print([*] {0}.format(message[payload]))else:print(message)# process frida.get_remote_device().attach(Transformers)
# if not os.path.isfile(./art_trace2.js):
# raise TypeError(./art_trace2.js does not exist)
# with codecs.open(./art_trace2.js, r, UTF-8) as file:
# js_code file.read()
# script process.create_script(js_code)
# script.on(message, message)
# script.load()
# sys.stdin.read()
rdev frida.get_remote_device()
pid rdev.spawn([com.zhuotong.crackme])
process rdev.attach(pid)
if not os.path.isfile(art_trace2.js):raise TypeError(./art_trace2.js does not exist)
with codecs.open(art_trace2.js, r, UTF-8) as file:js_code file.read()
script process.create_script(js_code)
script.on(message, message)
script.load()
rdev.resume(pid)
sys.stdin.read()
art_trace2.js
Java.perform(function () {let symbols Module.enumerateSymbolsSync(libart.so);let addrRegisterNatives null;for (let i 0; i symbols.length; i) {let symbol symbols[i];//_ZN3art3JNI15RegisterNativesEP7_JNIEnvP7_jclassPK15JNINativeMethodiif (symbol.name.indexOf(art) 0 symbol.name.indexOf(JNI) 0 symbol.name.indexOf(RegisterNatives) 0 symbol.name.indexOf(CheckJNI) 0) {addrRegisterNatives symbol.address;console.log(RegisterNatives is at , symbol.address, symbol.name);}}if (addrRegisterNatives ! null) {Interceptor.attach(addrRegisterNatives, {onEnter: function (args) {console.log([RegisterNatives] method_count:, args[3]);let java_class args[1];let class_name Java.vm.tryGetEnv().getClassName(java_class);let methods_ptr ptr(args[2]);let method_count parseInt(args[3]);for (let i 0; i method_count; i) {let name_ptr Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3));let sig_ptr Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 Process.pointerSize));let fnPtr_ptr Memory.readPointer(methods_ptr.add(i * Process.pointerSize * 3 Process.pointerSize * 2));let name Memory.readCString(name_ptr);let sig Memory.readCString(sig_ptr);let find_module Process.findModuleByAddress(fnPtr_ptr);console.log([RegisterNatives] java_class:, class_name, name:, name, sig:, sig, fnPtr:, fnPtr_ptr, module_name:, find_module.name, module_base:, find_module.base, offset:, ptr(fnPtr_ptr).sub(find_module.base));// console.log([RegisterNatives] java_class:, class_name, name:, name, sig:, sig, fnPtr:, fnPtr_ptr);}}});}
});