安卓反调试笔记

USB调试模式检测
int adb = Settings.Secure.getInt(context.getContentResolver(), Settings.Secure.ADB_ENABLED, 0);

Settings.Secure.ADB_ENABLED was deprecated in API level 17. Instead, use

Settings.Global.getInt(context.getContentResolver(), Settings.Global.ADB_ENABLED, 0)  

Read More

Arm 标志位与条件判断

EQ(等于,Equal) == Z set
NE(不等于,Not Equal) != Z clear
CS(高于或同于,进位设置,Carry Set) = C set
CC(低于,进位清除,Carry Clear) < C clear

MI(负号,MInus) < 0 N set
PL(正号,PLus) =0 N clear
VS(溢出设置,oVerflow Set) V set
VC(溢出清除,oVerflow Clear) V clear

HI(高于,HIgher) C set and Z clear (unsigned higher,无符号大于)
LS(低于或同于,Lower or Same) <= C clear … Read More

安卓调试常用ADB命令

有多个设备时选择其中的某设备
adb -s H066982 shell

//========================================
安装APK
adb install -r r:\1.apk

//========================================
以调试模式启动APP
adb shell am start -D -n hw.helloworld/hw.helloworld.MainActivity

//========================================

列出所有安装应用的包名
adb shell pm list packages

过滤显示
adb shell pm list packages | grep 431

找到apk的位置
adb shell pm path com.tence01.mm

pull出来
adb pull /data/app/com.tence01.mm-1.apk d:\

pull 整个目录
adb … Read More

Arm memcpy 汇编代码

MODULE  ARM_MEMORY

        PUBLIC  ARM_MEMCPY
        PUBLIC  ARM_MEMSET
        PUBLIC  ARM_MEMSET8
        PUBLIC  ARM_MEMSET16
        PUBLIC  ARM_MEMSET32

        SECTION .text:CODE:NOROOT(2)
        CODE32

;-------------------------------------------------------------------------------
; void ARM_MEMCPY(void* pDest, void* pSrc, U32 NumBytes)
;
; Function description
;   Copy data in memory from source address to destination address.
;
; Register usage:
;
;   R0    pDest
;   R1    pSrc
Read More

Arm汇编中!和^的作用

如果加上!,表明先根据寻址规则修改寄存器,然后根据寄存器中的值访问内存;如果不加!,表示直接根据寻址规则访问内存。

看个例子

ldmia r0, {r2-r3}  把r0指向的内存中的数据读入到r2中,然后内存地址+4,
再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值不变。
ldmia r0!, {r2-r3}  把r0指向的内存中的数据读入到r2中,然后内存地址+4,
再将+4后地址中的数据读入到r3中。指令执行完毕后r0中的值变化(为r3内容的地址)。

感叹号的作用就是r0的值在ldm过程中发生的增加或者减小最后写会到r0中。

^的作用

ldmfd sp!, {r0-r6, pc}  (操作了八个寄存器)
ldmfd sp!, {r0-r6, pc}^ (此项操作实际操作了9个寄存器,spsr->cpsr)
^:在目标寄存器中有pc时,会同时将spsr写入到cpsr,一般用在异常返回的时候。… Read More

ARM 堆栈方式

满堆栈(Full Stack,“F”)是指Sp指向堆栈最后一个压入的数据(也就是sp指向堆栈最后一个数据项位置)。

空堆栈(Empty Stack,"E")是指sp指向堆栈下一个将要放入数据的空位置时(也就是说sp指向堆栈最后一个数据项的下一个位置)。

存储器堆栈可以分为两种:

一种是向上生长,就是向着高地址方向生长,称为递增堆栈。
一种是向下生长,就是向着低地址方向生长,称为递减堆栈。

这样,就有四种组合:满递增(FA)、空递增(EA)、满递减(FD)、空递减(ED)。

入栈规律:

(1)满堆栈操作先调整SP,然后存入数据。

(2)空堆栈操作先存入数据,然后调整SP。

(3)递增堆栈调整SP时,执行SP=SP+4

(4)递减堆栈调整SP时,执行SP=SP-4

出栈规律 正好与入栈相反,也就是入栈的逆操作。

(1)空堆栈操作先调整SP,然后存入数据。

(2)满堆栈操作先存入数据,然后调整SP。

(3)递减堆栈调整SP时,执行SP=SP+4

(4)递增堆栈调整SP时,执行SP=SP-4

 

例1:

PRE
r1 = 0x00000002
r4 = 0x00000003
sp = 0x00080014

STMFD sp!, {r1, r4}

POST
r1 = 0X00000002
r4 = 0x00000003
sp = … Read More