Android调试反调试概括笔记

adb install -r 重新安装
adb pull /data/local/tmp/xxx   下载
adb push xxx /data/local/tmp   上传
adb shell pm list packages  列举安装的包名
aapt dump badging apk  查看包名(区分app的标志)
adb shell pm list packages -f com.hello 
 查看包名所在的路径
adb logcat  显示日志
adb devices 显示本机所有连接的设备

adb -s emulator-5554 shell  操作指定设备
 adb uninstall 包名  卸载apk
 cd /data/app  ls查看目录下的文件,然后用
 rm *.apk  卸载删除apk(切目录要有root权限)
adb shell su -c "mount -o remount rw /system"

签名方式

两种签名方式
java -jar "SignApk.jar" "media.x509.pem" "media.pk8" "getinfoed.apk" "getinfoed.apk.Signed"
jarsigner.exe -verbose -keystore D:\test.keystore -storepass “12341234” -keypass “12341234” -signedjar “签名后的文件路径”  “待签名的文件” “keystore的文件路径“

对齐优化命令
zipalign.exe -f -v 4 D:\DeskTop\signed.apk D:\DeskTop\1234signedAligned.apk

生成KeyStore

keytool -genkey -alias test.keystore -keyalg RSA -validity 40000 -keystore test.keystore
最后是否正确输入”Y”   回车即可生成

证书私钥导出

生成私钥和证书
keytool -importkeystore -srckeystore test.keystore -destkeystore tmp.p12 -srcstoretype JKS -deststoretype PKCS12
openssl pkcs12 -in tmp.p12 -nodes -out tmp.rsa.pem
openssl pkcs8 -topk8 -outform DER -in tmp.rsa.pem -inform PEM -out private.pk8 -nocrypt
java -jar signapk.jar cert.x509.pem private.pk8 unsigned.apk signed.apk

上传
adb push %1 /data/local/tmp
adb shell chmod 777 /data/local/tmp/%~nx1
反编译
java -jar apktool.jar d -f %1 -o  "%~dp1De_%~n1"
Pause
编译
java -jar apktool.jar b -f %1 -o "%~dp1%~n1.apk"
pause

ApkTool集成工具

核心调用命令
用apk解压
java -jar  apktool.jar d -f -s getinfo.apk tmp
反编译
"java -jar "baksmali.jar" -b -m -o "smali" "classes.dex"
编译
"java -jar "smali.jar" -o "classes.dex" "smali""
生成apk
java -jar "apktool.jar" b -f -a "aapt.exe" "extract" "getinfoed.apk"
签名
java -jar "SignApk.jar" "media.x509.pem" "media.pk8" "getinfoed.apk" "getinfoed.apk.Signed"

查看apk进程信息

/proc/N pid为N的进程信息
/proc/N/cmdline 进程启动命令
/proc/N/cwd 链接到进程当前工作目录
/proc/N/environ 进程环境变量列表
/proc/N/exe 链接到进程的执行命令文件
/proc/N/fd 包含进程相关的所有的文件描述符
/proc/N/maps 与进程相关的内存映射信息
/proc/N/mem 指代进程持有的内存,不可读
/proc/N/root 链接到进程的根目录
/proc/N/stat 进程的状态
/proc/N/statm 进程使用的内存的状态
/proc/N/status 进程状态信息,比stat/statm更具可读性
/proc/self 链接到当前正在运行的进程

动态调试APK

NetBeans+Apktool动态调试Apk
1.通过Apktool反编译
    java -jar apktool.jar d -d test.apk -o test.debug
2.在Mainfest中的Application中添加android:debuggable="true“

3.在MainActivity.java 中找到invoke-super {p0, p1}, Landroid/app/Activity;>onCreate(Landroid/os/Bundle;)V
后添加:
    invoke-static {}, Landroid/os/Debug;->waitForDebugger()V

4. 用apktool打包回去
    java -jar apktool.jar b -d test.debug -o test.debug.apk

5.  签名安装
    签名命令:
    java -jar SignApk.jar x509.pem media.pk8 getinfoed.apk getinfoed.apk.Signed

Android studio + smalidea 动态调试smali

使用说明
https://github.com/JesusFreke/smali/wiki/smalidea
相关文件下载
https://bitbucket.org/JesusFreke/smali/downloads/

安装smalidea
打开Android Studio,按Alt+Ctrl+S打开设置界面,点击Plugins——Install plugin from disk…——选择下载好的smalidea-0.0.5.zip。 启Android Studio

baksmali
使用baksmali反编译apk得到smali代码。java -jar baksmali.jar getinfo.apk -o projects/getinfo/src
或者直接用AndroidKiller反汇编
创建新的工程并导入smali
File---New---Import Project

打开DDMS或者monitor.bat
Run/Debug Configurations
创建一个”Remote” debug configuration (Run->Edit Configurations), 设置Port为8700

在smali代码中你需要的地方打上断点
运行应用,查看ddms的端口号是否是8700
点击Debug按钮,开始调试,当运行到断点时应用就会被暂停

 

 

Android相关反调试

ptrace
PTRACE_TRACEME

127|root@hammerhead:/ # ps |gerp get
sush: gerp: not found
127|root@hammerhead:/ # ps |grep cctf
u0_a84    4615  308   896492 46564 sys_epoll_ b6d65894 S com.example.cctf
root@hammerhead:/ # cat /proc/4615/status
Name:   om.example.cctf
State:  S (sleeping)
Tgid:   4615
Pid:    4615
PPid:   308
TracerPid:      0//被调试的话这里是父进程pid
Uid:    10084   10084   10084   10084
Gid:    10084   10084   10084   10084
FDSize: 256
Groups: 9997 50084
VmPeak:  1520516 kB
VmSize:   881120 kB
VmLck:         0 kB
VmPin:         0 kB
VmHWM:     47580 kB
VmRSS:     46564 kB
VmData:   123432 kB
VmStk:      8192 kB
VmExe:        20 kB
VmLib:     68636 kB
VmPTE:       226 kB
VmSwap:        0 kB
Threads:        13
SigQ:   0/12270
SigPnd: 0000000000000000
ShdPnd: 0000000000000000
SigBlk: 0000000000001204
SigIgn: 0000000000000000
SigCgt: 00000002000094f8
CapInh: 0000000000000000
CapPrm: 0000000000000000
CapEff: 0000000000000000
CapBnd: fffffff000000000
Cpus_allowed:   f
Cpus_allowed_list:      0-3
voluntary_ctxt_switches:        179
nonvoluntary_ctxt_switches:     235
root@hammerhead:/ #

. /proc/pid/stat

root@hammerhead:/ # cat /proc/4615/stat
4615 (om.example.cctf) S 308 308 0 0 -1 1077936448 13985 0 0 0 19 9 0 0 20 0 13 0 38030162 918007808 11641 4294967295 3070197760 3070215568 3196119888 3196117032 3067500692 0 4612 0 38136 4294967295 0 0 17 0 0 0 0 0 0 3070221528 3070222336 3089809408
root@hammerhead:/ #

被调试这不是s是T

/proc/pid/wchan

1|root@hammerhead:/ # cat /proc/4615/wchan
sys_epoll_waitroot@hammerhead:/ //被调试这里显示是ptrace_stop

/proc/net/tcp

3: 0100007F:5D8A 0100007F:EBA1 01

被调试这里端口就是23946,16进制就是5D8A。

hook read write

anti dump

inotify(inotify_add_watch)

/proc/pid/mem
/proc/pid/pagem

就是防止读写设置了回调,不让读写。

signal

ARM程序下断点,调试器完成两件事:
1)保存目标地址处指令
2)将目标地址处指令替换成断点指令
指令集    指令
Arm    0x01, 0x00, 0x9f, 0xef
Thumb    0x01, 0xde
Thumb2    0xf0, 0xf7, 0x00, 0xa0

3)当命中断点时,系统产生SIGTRAP信号,调试器收到信号后完成下面操作:
恢复断点处原指令
回退被跟踪进程的当前PC
这时当控制权回到被调试程序时,正好执行断点位置指令.
断点是通过处理 SIGTRAP 信号来实现的,假如我们自己注册 SIGTRAP 的信号处理函数,并在程序中主动执行中断指令触发中断。
在中断处理函数中,NOP 掉断点指令,程序可正常执行。
但在调试状态下,调试器遇到断点指令时,会去恢复原先指令,由于不是调试器下的断点,所以恢复会失败,
而调试器会回退PC寄存器,程序会在此处无限循环。就跟自己给自己设个单步调试型号,干扰调试器。

rtld_db_dlactivity

调试断点相关处理函数。

extern void __attribute__((noinline)) rtld_db_dlactivity(void);
static struct r_debug _r_debug = {1, NULL, &rtld_db_dlactivity,     RT_CONSISTENT, 0};
bionic\linker\rt.c
void __attribute__((noinline)) rtld_db_dlactivity(void)
{
// 70 47    BX LR
}
// 10 DE    UND #0x10
rtld_db_dlactivity---> Thumb 0x01, 0xde(brk)

软件断点检测

Arm    0x01, 0x00, 0x9f, 0xef
Thumb    0x01, 0xde
Thumb2    0xf0, 0xf7, 0x00, 0xa0

DvmGlobals 调试字段检测

bool dvmDbgIsDebuggerConnected()
{
    return gDvm.debuggerActive;
}

时间戳检测

 

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值