1. 用汇编编译
Android.mk1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := asm
LOCAL_ARM_MODE := arm
TARGET_CFLAGS += -mthumb-interwork
TARGET_CFLAGS += -std=gnu11
TARGET_CFLAGS += -O3
ifeq ($(TARGET_ARCH_ABI),armeabi-v7a) #depends on Application.mk
LOCAL_CFLAGS := -DHAVE_NEON=1
LOCAL_SRC_FILES += asm.s.neon #use neon mode for asm
LOCAL_ARM_NEON := true
endif
<!--more-->
#shellcode.s
LOCAL_LDLIBS += -L$(SYSROOT)/usr/lib -llog
#LOCAL_FORCE_STATIC_EXECUTABLE := true
#include $(BUILD_EXECUTABLE)
include $(BUILD_SHARED_LIBRARY)
Application.mk1
APP_ABI := armeabi-v7a # build for arm-v7
asm.s1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21.text @code section
.align 4 @align for 2^4 bytes
.thumb
.globl my_real_arm @global symbol my_real_arm
my_real_arm:
push {r1,lr} @将r1,lr入栈
push {r0-r7} @将r0至r7入栈
LDR R7, [R4,#0x14] @基址寻址,将R4的值+0x14(十进制20)作为地址,然后将该地址的值给R7
ldr r3,=10013 @赋值10013给r3
CMP R7, R3 @比较r3与r7
pop {r0-r7}
BEQ loc_ret_1
LDR R3, [R0]
LDR R2, [R4]
pop {r1,pc}
loc_ret_1:
mov r3, #0
mov r2, #1
pop {r1,pc}
然后,使用ndk-build即可。
2. 获取汇编指令对应的十六进制
因为ptrace要写入的代码不能是直接的汇编指令,而是指令对应的十进进制,故需要先用IDA找出汇编代码对应的十六进制代码才行。
然后使用HEX的视图(需要与反汇编出来的代码进行同步,右键),然后就可以知道每一个指令对应的十六进制:
3. trace