查看: 1130|回复: 0
收起左侧

[软件] 求会c/c++的大神帮个小忙 从文件导出函数表

[复制链接]
沧海ふ无涯
发表于 2014-10-26 14:13:11 | 显示全部楼层 |阅读模式
本帖最后由 沧海ふ无涯 于 2014-10-26 14:45 编辑
就是用dlopen 将 libdvm.so 打开,然后得到 dvmGetInlineOpsTable 这个导出表

这个操作不难吧?   当然名字应该不是dvmGetInlineOpsTable 而是类似的


我本身是学csharp的   准备反编译MT6592的rom deodex出错了  目前网上没有相关资料  
dvmGetInlineOpsTablePtr dvmGetInlineOpsTable = dlsym(libdvm, "dvmGetInlineOpsTable");  这行代码无法执行导出  
换成_Z26dvmGetInlineOpsTableLengthv也不行
还有,请尝试打开art的库文件  导出一下  


http://pan.baidu.com/s/1gdh8TfP

导出结果类似于:

Lorg/apache/harmony/dalvik/NativeTestTarget;->emptyInlineMethod()V

Ljava/lang/String;->charAt(I)C

Ljava/lang/String;->compareTo(Ljava/lang/String;)I

Ljava/lang/String;->equals(Ljava/lang/Object;)Z

Ljava/lang/String;->fastIndexOf(II)I

Ljava/lang/String;->isEmpty()Z

Ljava/lang/String;->length()I

Ljava/lang/Math;->abs(I)I

Ljava/lang/Math;->abs(J)J

Ljava/lang/Math;->abs(F)F

Ljava/lang/Math;->abs(D)D

Ljava/lang/Math;->min(II)I

Ljava/lang/Math;->max(II)I

Ljava/lang/Math;->sqrt(D)D

Ljava/lang/Math;->cos(D)D

Ljava/lang/Math;->sin(D)D

Ljava/lang/Float;->floatToIntBits(F)I

Ljava/lang/Float;->floatToRawIntBits(F)I

Ljava/lang/Float;->intBitsToFloat(I)F

Ljava/lang/Double;->doubleToLongBits(D)J

Ljava/lang/Double;->doubleToRawLongBits(D)J

Ljava/lang/Double;->longBitsToDouble(J)D

Ljava/lang/StrictMath;->abs(I)I

Ljava/lang/StrictMath;->abs(J)J

Ljava/lang/StrictMath;->abs(F)F

Ljava/lang/StrictMath;->abs(D)D

Ljava/lang/StrictMath;->min(II)I

Ljava/lang/StrictMath;->max(II)I

Ljava/lang/StrictMath;->sqrt(D)D

Ljava/lang/Math;->log(D)D

Ljava/lang/Math;->atan(D)D

Ljava/lang/Math;->exp(D)D


有问题的代码源码

[mw_shl_code=shell,true]/*
* Copyright 2011, Google Inc.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are
* met:
*
*     * Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*     * Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following disclaimer
* in the documentation and/or other materials provided with the
* distribution.
*     * Neither the name of Google Inc. nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#include <stdio.h>
#include <dlfcn.h>

typedef struct InlineOperation {
    void *          func;
    const char*     classDescriptor;
    const char*     methodName;
    const char*     methodSignature;
} InlineOperation;

typedef const InlineOperation* (*dvmGetInlineOpsTablePtr)();
typedef int (*dvmGetInlineOpsTableLengthPtr)();

void main(int argc, char **argv) {
        int i;

        void *libdvm = dlopen("libdvm.so", RTLD_LAZY);

        if (libdvm == NULL) {
                printf("Failed to load libdvm\n");
                return;
        }

        dvmGetInlineOpsTablePtr dvmGetInlineOpsTable = dlsym(libdvm, "dvmGetInlineOpsTable");

        if (dvmGetInlineOpsTable == NULL) {
                dvmGetInlineOpsTable = dlsym(libdvm, "_Z20dvmGetInlineOpsTablev");
        }

        if (dvmGetInlineOpsTable == NULL) {
                printf("Failed to load dvmGetInlineOpsTable\n");
                dlclose(libdvm);
                return;
        }

        dvmGetInlineOpsTableLengthPtr dvmGetInlineOpsTableLength = dlsym(libdvm, "dvmGetInlineOpsTableLength");

        if (dvmGetInlineOpsTableLength == NULL) {
                dvmGetInlineOpsTableLength = dlsym(libdvm, "_Z26dvmGetInlineOpsTableLengthv");
        }

        if (dvmGetInlineOpsTableLength == NULL) {
               printf("Failed to load dvmGetInlineOpsTableLength\n");  //实际上 只会输出这句  上面的两个参数应该是表的名字? 难道442中已经没了? 或者名字又变了?
                dlclose(libdvm);
                return;
        }

        const InlineOperation *inlineTable = dvmGetInlineOpsTable();
        int length = dvmGetInlineOpsTableLength();

        for (i=0; i<length; i++) {
                InlineOperation *item = &inlineTable;

                printf("%s->%s%s\n", item->classDescriptor, item->methodName, item->methodSignature);
        }

        dlclose(libdvm);
        return;
}[/mw_shl_code]




https://code.google.com/p/smali/issues/detail?id=226
这是我在谷歌code提出的BUG
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

手机版|杀毒软件|软件论坛| 卡饭论坛

Copyright © KaFan  KaFan.cn All Rights Reserved.

Powered by Discuz! X3.4( 沪ICP备2020031077号-2 ) GMT+8, 2025-1-11 20:41 , Processed in 0.120875 second(s), 16 queries .

卡饭网所发布的一切软件、样本、工具、文章等仅限用于学习和研究,不得将上述内容用于商业或者其他非法用途,否则产生的一切后果自负,本站信息来自网络,版权争议问题与本站无关,您必须在下载后的24小时之内从您的电脑中彻底删除上述信息,如有问题请通过邮件与我们联系。

快速回复 客服 返回顶部 返回列表