diff --git a/deodexerant/Android.mk b/deodexerant/Android.mk new file mode 100644 index 00000000..c1921f9b --- /dev/null +++ b/deodexerant/Android.mk @@ -0,0 +1,42 @@ +# 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. + +LOCAL_PATH:= $(call my-dir) + +include $(CLEAR_VARS) + +LOCAL_MODULE := deodexerant + +LOCAL_SRC_FILES:= deodexerant.c + +LOCAL_SHARED_LIBRARIES := libdl + +LOCAL_MODULE_TAGS := optional + +include $(BUILD_EXECUTABLE) \ No newline at end of file diff --git a/deodexerant/README b/deodexerant/README new file mode 100644 index 00000000..0589e055 --- /dev/null +++ b/deodexerant/README @@ -0,0 +1,26 @@ +usage: +adb push deodexerant /data/local +adb shell chmod +x /data/local/deodexerant +adb shell /data/local/deodexerant > inline.txt + +deodexerant is a binary that runs on a device and dumps out dalvik's inline +method table. + +This can be used in cases where a particular built of dalvik has a non-standard +inline method table for whatever reason. The output from this tool is intended +to be used with the -T option for baksmali + +deodexerant is intended to be build within the AOSP build system. Assuming +you have $MYDROID set to the root of the AOSP source tree, and $SMALI +set to the root of the smali source tree, + +1. mkdir -p $MYDROID/external/deodexerant +2. cp -r $SMALI/deodexerant $MYDROID/dalvik/deodexerant +3. cd $MYDROID +3. source build/envsetup.sh +4. lunch generic-eng +5. make deodexerant + +If all goes well, you should now have a deodexerant binary at: + +$MYDROID/out/target/product/generic/system/bin/deodexerant diff --git a/deodexerant/deodexerant.c b/deodexerant/deodexerant.c new file mode 100644 index 00000000..108db76a --- /dev/null +++ b/deodexerant/deodexerant.c @@ -0,0 +1,82 @@ +/* + * 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 +#include + +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) { + printf("Failed to load dvmGetInlineOpsTable\n"); + dlclose(libdvm); + return; + } + + dvmGetInlineOpsTableLengthPtr dvmGetInlineOpsTableLength = dlsym(libdvm, "dvmGetInlineOpsTableLength"); + + if (dvmGetInlineOpsTableLength == NULL) { + printf("Failed to load dvmGetInlineOpsTableLength\n"); + dlclose(libdvm); + return; + } + + const InlineOperation *inlineTable = dvmGetInlineOpsTable(); + int length = dvmGetInlineOpsTableLength(); + + for (i=0; i%s%s\n", item->classDescriptor, item->methodName, item->methodSignature); + } + + dlclose(libdvm); + return; +} \ No newline at end of file