首页
社区
课程
招聘
[讨论]arm汇编中的函数调用
发表于: 2015-8-3 23:42 7903

[讨论]arm汇编中的函数调用

2015-8-3 23:42
7903
自己写的一个非常简单的hell.c的程序,用ndk编译成可执行文件
#include <stdio.h>
int Add(int a,int b);
int main(int argc,int **argv[])
{

  printf("Hello ARM\r\n");
  int a = 3;
  int b = 4;
  int c = Add(a,b);
  printf("%d\n",c);
  return 0;
}
int Add(int a,int b)
{
  return a+b;
}

下面是Android.mk的内容:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_ARM_MODE := arm
LOCAL_MODULE := hello
LOCAL_SRC_FILES := hello.c
include $(BUILD_EXECUTABLE)

然后就出现了一个问题,对于main函数的调用

很明显sub_84A8就是main函数,但是在start中对main的调用却是这样的

LDR     R2, [R12,R3] 也能调实现函数的调用吗
附上生成的可执行文件 :  hello.zip

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

上传的附件:
收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 648
活跃值: (4322)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
main函数是由你IDA截图里的linc_init函数所调用,LDR R2, [R12, R3] 只是在给libc_init函数传递参数,然后由libc_init调用main
2015-8-4 07:40
0
雪    币: 22
活跃值: (242)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
3
[QUOTE=Lnju;1384789]main函数是由你IDA截图里的linc_init函数所调用,LDR R2, [R12, R3] 只是在给libc_init函数传递参数,然后由libc_init调用main[/QUOTE]
谢谢,懂了,函数地址作为参数传递
__noreturn void __libc_init(uintptr_t *elfdata,
                       void (*onexit)(void),
                       int (*slingshot)(int, char**, char**),
                       structors_array_t const * const structors)
{
    int  argc;
    char **argv, **envp;

    /* Initialize the C runtime environment */
    __libc_init_common(elfdata);

    /* Several Linux ABIs don't pass the onexit pointer, and the ones that
     * do never use it.  Therefore, we ignore it.
     */

    /* pre-init array. */
    call_array(structors->preinit_array);

    /* .ctors section initializers, for non-arm-eabi ABIs */
    call_array(structors->ctors_array);

    // call static constructors
    call_array(structors->init_array);

    argc = (int) *elfdata;
    argv = (char**)(elfdata + 1);
    envp = argv + argc + 1;

    /* The executable may have its own destructors listed in its .fini_array
     * so we need to ensure that these are called when the program exits
     * normally.
     */
    if (structors->fini_array)
        __cxa_atexit(__libc_fini,structors->fini_array,NULL);

    exit(slingshot(argc, argv, envp));
}
2015-8-4 10:00
0
雪    币: 4554
活跃值: (2186)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
我想问下你这个arm汇编是怎么生成的 具体环境怎么配置的 有相关的教程不 谢谢
2015-8-4 10:24
0
雪    币: 76
活跃值: (206)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
5
Makefile文件内容:
ANDROID_NDK_ROOT=$(ANDROID_NDK_HOME)

PREFIX=$(ANDROID_NDK_ROOT)/toolchains/arm-linux-androideabi-4.6/prebuilt/windows-x86_64/bin/arm-linux-androideabi-

SYSROOT=--sysroot=$(ANDROID_NDK_ROOT)/platforms/android-9/arch-arm

CFLAGS := -g -Wall -c

LDFLAGS := -g -Wall

CC := $(PREFIX)gcc $(SYSROOT)

###################################
INJECTSO :=        inject

INJECT_DIR := Injectso

INJECT_SOURCES := $(wildcard $(INJECT_DIR)/*.c)

INJECT_OBJECTS := $(patsubst %.c,%.o,$(INJECT_SOURCES))

####################################
LIBHOOK := libhook.so

LIBTEST_DIR := HookLibrary

LIBTEST_SOURCES := $(wildcard $(LIBTEST_DIR)/*.cpp)

LIBTEST_OBJECTS := $(patsubst %.cpp,%.o,$(LIBTEST_SOURCES))

####################################
LIBHELLO := libhello.so

LIBHELLO_DIR := ./

####################################

all:$(INJECTSO) $(LIBHOOK) $(LIBHELLO)

$(INJECTSO):$(INJECT_OBJECTS)
$(CC) $(LDFLAGS) $(INJECT_OBJECTS) -L$(SYSROOT)/usr/lib -llog -o $@

$(INJECT_OBJECTS):%.o:%.c
$(CC) $(CFLAGS) $< -I$(INJECT_DIR) -o $@

$(LIBHOOK):$(LIBTEST_OBJECTS)
$(CC) $(LDFLAGS) -shared -fPIC $(LIBTEST_OBJECTS) -L$(LIBTEST_DIR) -llog -ldl -landroid_runtime -lTKHooklib -ldvm -o $@

$(LIBTEST_OBJECTS):%.o:%.cpp
$(CC) $(CFLAGS) $< -I$(LIBTEST_DIR) -o $@

$(LIBHELLO):hello.o
$(CC) $(LDFLAGS) -shared $^ -o $@

hello.o:hello.c
$(CC) $(CFLAGS) $<

.PHONY:clean pushobj

clean:
rm -f $(INJECT_DIR)/*.o
rm -f $(LIBTEST_DIR)/*.o
rm -f *.o
rm -f $(LIBHOOK)
rm -f $(INJECTSO)
rm -f $(LIBHELLO)

pushobj:
adb push $(INJECTSO) data/local/tmp/
adb push $(LIBHOOK) data/local/tmp/
adb push $(LIBHELLO) data/local/tmp/
adb shell chmod 777 data/local/tmp/$(INJECTSO)
adb shell chmod 777 data/local/tmp/$(LIBHOOK)
adb shell chmod 777 data/local/tmp/$(LIBHELLO)
2015-8-4 10:38
0
雪    币: 22
活跃值: (242)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
6
非虫的那本书上有http://pan.baidu.com/s/1mgGLDJa只是将ndk编译so文件的Android.mk的BUILD_SHARED_LIBRARY改成BUILD_EXECUTABLE,再加一个LOCAL_ARM_MODE := arm,具体看第七章
2015-8-4 11:00
0
雪    币: 4554
活跃值: (2186)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
2015-8-4 11:02
0
游客
登录 | 注册 方可回帖
返回
//