一个简单的 IDA f5插件问题分析

有人提出问题,以下汇编f5结果缺失代码:

.text:00000C18 Java_com_a_b_c
.text:00000C18                 PUSH    {R3,LR}
.text:00000C1A                 CMP     R2, #2
.text:00000C1C                 BEQ     loc_C38
.text:00000C1E                 CMP     R2, #3
.text:00000C20                 BEQ     loc_C2C
.text:00000C22                 CMP     R2, #1
.text:00000C24                 BNE     loc_C32
.text:00000C26                 LDR     R1, =(aGoldVip - 0xC2C)
.text:00000C28                 ADD     R1, PC          ; "Gold Vip"
.text:00000C2A                 B       loc_C3C
.text:00000C2C ; ---------------------------------------------------------------------------
.text:00000C2C
.text:00000C2C loc_C2C                                 ; CODE XREF: Java_com_a_b_c+8 j
.text:00000C2C                 LDR     R1, =(aCopperVip - 0xC32)
.text:00000C2E                 ADD     R1, PC          ; "Copper Vip"
.text:00000C30                 B       loc_C3C
.text:00000C32 ; ---------------------------------------------------------------------------
.text:00000C32
.text:00000C32 loc_C32                                 ; CODE XREF: Java_com_a_b_c+C j
.text:00000C32                 LDR     R1, =(aNormalUser - 0xC38)
.text:00000C34                 ADD     R1, PC          ; "Normal User"
.text:00000C36                 B       loc_C3C
.text:00000C38 ; ---------------------------------------------------------------------------
.text:00000C38
.text:00000C38 loc_C38                                 ; CODE XREF: Java_com_a_b_c+4 j
.text:00000C38                 LDR     R1, =(aSilveryVip - 0xC3E)
.text:00000C3A                 ADD     R1, PC          ; "Silvery Vip"
.text:00000C3C
.text:00000C3C loc_C3C                                 ; CODE XREF: Java_com_a_b_c+12 j
.text:00000C3C                                         ; Java_com_a_b_c+18 j ...
.text:00000C3C                 LDR     R2, [R0]
.text:00000C3E                 MOVS    R3, #0x29C
.text:00000C42                 LDR     R3, [R2,R3]
.text:00000C44                 BLX     R3              ; NewStringUTF
.text:00000C46                 POP     {R3,PC}
.text:00000C46 ; End of function Java_com_a_b_c

很容易从汇编看出,这是个简单的 switch…case{} 代码块。在break时,跳转到 loc_C3C 处。

但f5,其结果如下,明显代码缺失:

int __fastcall Java_com_a_b_c(int a1)
{
  return (*(int (**)(void))(*(_DWORD *)a1 + 668))();
}

下面分析,为什么代码缺失。

由于 Java_com_a_b_c 是一个 jni 函数,所以 r0 为 JNIEnv*, r1 为 jobject。loc_C3C 位置有个blx r3的跳转,分析一下这是个什么调用。

首选将 r0 指向地址内容即 JNIEnv 赋值 r2,接着 ldr r3, [r2, r3] 将 r3 指向 JNIEnv + 0x29c 偏移的位置(JNINativeInterface 中第167个函数)。

通过查看 jni.h,此时 r3 实际指向的是 NewStringUTF 函数,这个函数有2个变量,分别是 r0:JNIEnv* 和 r1:char* 。其返回值是一个jstring类型。

也就是上面汇编代码大致伪C是这样:

jstring Java_com_a_b_c(JNIEnv *env, jobject thiz, jint x)  {
        char *str = NULL;
        switch(x) {
                case 1:
                        str = "Gold Vip";
                        break;
                case 2:
                        str = "Silvery Vip";
                        break;
                case 3:
                        str = "Copper Vip";
                        break;
                default:
                        str = "Normal User";
                        break;
        }
        return (*env)->NewStringUTF(env, str);
}

switch…case {} 结构去哪儿了? 其实这是ida f5插件的一个特性:***代码优化***。由于使用了 blx r3寄存器跳转,ida并不知道r3即NewStringUTF函数的原型,参数情况。也就不知道str参数会被NewStringUTF函数所使用。因此它认为switch…case {}中对str的赋值(如str = “Copper Vip”;)并没有用,可以优化掉。

因此f5就找不到这段汇编对应的C了。

验证一下f5是否存在代码优化(与-O3编译选项类似):

[email protected]:~/Android_prj/re/jni_test$ cat test.c
int main()
{
        int x = a();
}
int a()
{
        int a = 123;
        int b = 22;

        return 123;
}

对应汇编:

.text:00008304                 EXPORT a
.text:00008304 a                                       ; CODE XREF: main+C p
.text:00008304
.text:00008304 var_C           = -0xC
.text:00008304 var_8           = -8
.text:00008304 var_s0          =  0
.text:00008304
.text:00008304                 STR     R11, [SP,#-4+var_s0]!
.text:00008308                 ADD     R11, SP, #0
.text:0000830C                 SUB     SP, SP, #0xC
.text:00008310                 MOV     R3, #0x7B    #### int a = 123;
.text:00008314                 STR     R3, [R11,#var_8]
.text:00008318                 MOV     R3, #0x16        ### int b = 22; 明显存在2个变量赋值代码
.text:0000831C                 STR     R3, [R11,#var_C]
.text:00008320                 MOV     R3, #0x7B
.text:00008324                 MOV     R0, R3
.text:00008328                 SUB     SP, R11, #0
.text:0000832C                 LDR     R11, [SP+var_s0],#4
.text:00008330                 BX      LR
.text:00008330 ; End of function a

f5:

signed int a()
{
  return 123;
}

那怎么办呢?其实很简单,首先导入 JNINativeInterface 结构的函数原型信息。然后在f5窗口里面, 重新设置 NewStringUTF 函数参数。

在函数上右键 ,*** Force call type ***:

原文地址:https://www.cnblogs.com/gm-201705/p/9863956.html

时间: 2024-10-10 22:37:53

一个简单的 IDA f5插件问题分析的相关文章

一个简单的页面弹窗插件 jquery.pageMsgFrame.js

页面弹窗是网站中常用的交互效果,它可以强提示网站的某些信息给用户,或者作用于某些信息的修改等等功能. 这几天在做一个项目的时候,就顺捎把这个插件写一下,栽棵树,自己乘凉吧. 原创博文,转载请注明出处:http://www.cnblogs.com/dereksunok/p/3724764.html html代码: 1 <!doctype html> 2 <html> 3 <head> 4 <meta charset="utf-8" /> 5

Arachnid包含一个简单的HTML剖析器能够分析包含HTML内容的输入流

Arachnid是一个基于Java的web spider框架.它包含一个简单的HTML剖析器能够分析包含HTML内容的输入流.通过实现Arachnid的子类就能够开发一个简单的Web spiders并能够在Web站上的每个页面被解析之后增加几行代码调用. Arachnid的下载包中包含两个spider应用程序例子用于演示如何使用该框架. http://sourceforge.net/projects/arachnid/

一个简单的MariaDB认证插件demo

代码地址如下:http://www.demodashi.com/demo/13076.html 一.前言 众所周知(其实可能很多人不知道)MariaDB支持插件认证.在MariaDB中新建用户,常见的语句是: CREATE USER 'username'@'host' IDENTIFIED BY 'password'; 这样创建的用户,登录时的认证方式是密码.其实创建用户的语句还可以是: CREATE USER 'username'@'host' IDENTIFIED VIA 'pluginna

Spring Aop 实现一个简单的memcached小插件

memcached我就不多做介绍了,也就是一个分布式缓存系统!是一个典型的NOSQL. 下面我将用spring aop来实现一个简单的插件,来实现annotation方式,简单方便的取得缓存 一.首先我们得定义一个annotation. <strong>package org.xiezhaodong.spring.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType

基于mykernel的一个简单的时间片轮转多道程序内核代码分析

学号023作品 本实验资源来源: https://github.com/mengning/linuxkernel/ 一.观察简易操作系统 此处使用实验楼的虚拟机打开终端 cd LinuxKernel/linux-3.9.4 rm -rf mykernel patch -p1 < ../mykernel_for_linux3.9.4sc.patch make allnoconfig make #编译内核请耐心等待 qemu -kernel arch/x86/boot/bzImage 在QEMU窗口

一个简单的时间片轮转多道程序内核代码分析 (学号后三位418)

一.基于mykernel的基本Linux内核分析 1.我们按照老师在github上给出的步骤在实验楼上启动最高小内核,可以看到如下现象 在窗口中我们可以看到一个内核以及运行起来了,比较简单的内核,只时不停的输出一些字符串,>>>>>>my_time_handler here<<<<<<<和my_start_kernel here和一些计数.这时因为我们并没有加入其他的代码,再次基础上我们可以加入我们主机要实现的功能. 在myin

一个简单web系统的接口性能分析及调优过程

在测试一个简单系统接口性能压力时,压到一定数量,程序总是崩溃,查看相关机器相关数据时,CPU.内存.IO占用均不高,问题自然出现在其它地方先介绍下系统部件架构 Resin版本为:[[email protected] lib]# java -classpath ./resin.jar com.caucho.VersionResin-3.2.1 (built Fri, 17 Oct 2008 04:11:01 PDT)Copyright(c) 1998-2008 Caucho Technology.

一个简单进程调度器的实现和分析

主体代码文件有三个,mypcb.h,myinterupt.h, mymain.h,mypcb定义了进程控制块结构,myinterupt实现了中断处理程序,mymain是实际入口点,以下代码省去了头文件部分,并有详细注释,下面的分析中只挑选关键部分进行分析 1 /* A simply process control block */ 2 3 #define MAX_TASK_NUM 10 //max number of tasks 4 #define KERNEL_STACK_SIZE 1024*

一个简单的时间片轮转内核代码的分析(课程作业)

高参原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 进程之间的切换通过定时器的中断来实现的,在一个进程的时间片时间长短又中断程序控制,在一个进程的时间片用完时中断发生切换到下一个进程.mykernel程序有mypcb.h,mymain.c和myinterrupt.c,mymain.c包含多个进程运行的函数,myinerrupt.c中有中断的函数. 1.mypcb.h文件 定义了两个进本的