标签: bytecode

用于反编译Lua字节码的最佳工具?

我真的很难找到一个好的工作Lua字节码反编译器.我正在尝试反编译我在游戏中发现的一些脚本文件,但它们似乎是编译的,但似乎无法解码.反编译Lua二进制文件的最佳工具是什么?

scripting lua decompiling bytecode

14
推荐指数
1
解决办法
4万
查看次数

14
推荐指数
2
解决办法
4281
查看次数

java字节码中的局部变量

我正在尝试学习java字节码,我偶然发现:我使用-g选项编译了这个非常简单的代码:

public class Test
{
 public static void main(String args[])
 {
  double a = 1.0;
  int b = (int)a;
 }
}
Run Code Online (Sandbox Code Playgroud)

主要代码原来是:

0 dconst_1
1 dstore_1
2 dload_1
3 d2i
4 istore_3
5 return
Run Code Online (Sandbox Code Playgroud)

此外,main的最大局部变量为4,LocalVariableTable只有3个条目(args,a,b).我很想知道为什么编译器保留4个局部变量,而显然只有3个,并且localvariable[2]没有使用.有什么我想念的吗?谢谢

java bytecode

14
推荐指数
1
解决办法
3356
查看次数

如何在Scala编译器重写原始Scala代码的[Java/Scala?]代码中看到

在Scala邮件列表之后,不同的人经常说:"编译器将此[scala]代码重写为此[java/scala ??]代码".例如,来自最新的一个主题,如果Scala看到的话

class C(i: Int = 4) { ... }
Run Code Online (Sandbox Code Playgroud)

然后编译器将其重写为(有效):

class C(i: Int) { ... }
object C {
  def init$default$1: Int = 4
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能找到代码的编译器输出?我应该为此生成的字节码反编译吗?

java compiler-construction scala bytecode

14
推荐指数
2
解决办法
3518
查看次数

如何静态分析传递给每个字节码指令的引用类型?

我已经重写了这个问题(问题仍然是相同的,只是背景噪音较小),希望能够减少针对所有错误事物的混淆 - 由于这一点,下面的一些评论似乎脱离了背景.

分析Java字节码,找到作为给定Java字节码指令的参数给出的所有可能的引用类型的最简单方法是什么?我对引用的类型感兴趣,也就是说,给定的putfield指令将接收一个Integer,或者它可能会收到一个Integer或Float等.

例如,考虑以下代码块:

   0:   aload_1
   1:   invokestatic    #21; //Method java/lang/Integer.valueOf:(Ljava/lang/String;)Ljava/lang/Integer;
   4:   astore_2
   5:   aload_2
   6:   ifnull  17
   9:   aload_0
   10:  aload_2
   11:  putfield    #27; //Field value:Ljava/lang/Number;
   14:  goto    25
   17:  aload_0
   18:  iconst_0
   19:  invokestatic    #29; //Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer;
   22:  putfield    #27; //Field value:Ljava/lang/Number;
   25:  return
Run Code Online (Sandbox Code Playgroud)

我们可以推断pc 11上的putfield指令将接收ref类型的Integer.

0: aload pushes ref type of String (the method param)
1: invokestatic pops the ref type and pushes a ref type of Integer (invoked method return type)
4: astore …
Run Code Online (Sandbox Code Playgroud)

java static-analysis bytecode

14
推荐指数
1
解决办法
582
查看次数

在源代码,字节代码,机器代码等上执行静态分析有哪些权衡?

在各种代码级别上执行静态分析的各种权衡是什么?例如对于Java,为什么有人会对Java源代码与Jasmin代码与Java字节码进行静态分析?选择是否限制或扩展了可以进行的各种类型的分析?选择是否会影响分析的正确性?谢谢.

java bytecode static-code-analysis

14
推荐指数
1
解决办法
1295
查看次数

将所有内容保存在单个lua字节码块中?

我已将lua与字节码块一起嵌入到用C编写的项目中.现在,当我通过添加.lua文件扩展我的lua代码库时,有没有办法将此代码保存在单个字节码块中?

(我知道如何加载多个字节码块.但是加载一个块然后忘记粘合代码似乎很舒服.)

我尝试使用文本包含,但似乎在Lua中没有关键字."Require"和"dofile"在运行时查看文件,因此运行"lua -b ..."后生成的字节码将不包含这些文件的代码.

并且没有办法组合字节码文件,是吗?我的意思是,在创建字节码文件时,"require"命令会将所有这些文件的代码添加到一个字节码文件中.

PS:Michal Kottman的答案适用于Lua,这就是我的要求.我以为Lua和LuaJIT会以同样的方式工作.他们没有.要将多个.lua文件组合到一个LuaJIT字节码文件中,应该是一个

  • 使用"LuaJIT -b"(似乎不起作用)
  • 用LuaJIT源代码编译Lua的luac.c.
  • 用lua命令模拟luac.c(没有C API)?

embed lua bytecode

14
推荐指数
1
解决办法
6245
查看次数

开发一种启发式方法来测试简单的匿名Python函数的等价性

我知道函数比较在Python 3中是如何工作的(只是比较内存中的地址),我理解为什么.

我也理解"真正的"比较(对于任何参数,给定相同参数的函数fg返回相同的结果吗?)实际上是不可能的.

我正在寻找介于两者之间的东西.我希望比较能够处理相同函数的最简单的情况,并且可能是一些不那么简单的函数:

lambda x : x == lambda x : x # True
lambda x : 2 * x == lambda y : 2 * y # True
lambda x : 2 * x == lambda x : x * 2 # True or False is fine, but must be stable
lambda x : 2 * x == lambda x : x + x # True or False is fine, but must be stable …
Run Code Online (Sandbox Code Playgroud)

python bytecode function python-3.x

14
推荐指数
2
解决办法
1380
查看次数

Java Classloader是否可以重写(仅限其副本)System类的字节码?

所以我有一个类加载器(MyClassLoader),它在内存中维护一组"特殊"类.这些特殊类是动态编译的,并存储在MyClassLoader内的字节数组中.当MyClassLoader被要求提供类时,它首先检查它的specialClasses字典是否包含它,然后再委托给System类加载器.它看起来像这样:

class MyClassLoader extends ClassLoader {
    Map<String, byte[]> specialClasses;

    public MyClassLoader(Map<String, byte[]> sb) {
        this.specialClasses = sb;
    }

    @Override
    public Class<?> loadClass(String name) throws ClassNotFoundException {
        if (specialClasses.containsKey(name)) return findClass(name);
        else return super.loadClass(name);
    }

    @Override
    public Class findClass(String name) {
        byte[] b = specialClasses.get(name);
        return defineClass(name, b, 0, b.length);
    }    
}
Run Code Online (Sandbox Code Playgroud)

如果我想在其上执行转换(例如检测)specialClasses,我可以简单地通过修改byte[]之前调用defineClass()它来实现.

我还想转换由System类加载器提供的类,但是System类加载器似乎没有提供任何方式来访问byte[]它提供的类的原始类,并Class直接给我提供了对象.

我可以使用一个-javaagent仪器加载到JVM中的所有类,但这会增加我不想检测的类的开销; 我只是想要MyClassLoader加载的类进行检测.

  • 有没有办法检索byte[]父类加载器提供的类的原始,所以我可以在定义自己的副本之前检测它们?
  • 或者,有没有任何方法可以模拟System类加载器的功能,从它抓取它的位置byte[],以便MyClassLoader可以检测和定义自己的所有System类(Object,String等)的副本?

编辑:

所以我尝试了另一种方法:

  • 使用a -javaagent,捕获 …

java bytecode metaprogramming class classloader

14
推荐指数
2
解决办法
5647
查看次数

我可以在同一个Maven项目的源文件中动态生成和引用类吗?

在Maven Build中,我使用字节代码生成库(Byte Buddy)动态生成一些Java类型.当然,这些类文件没有相应的源文件.这种方式只能生成几个类.该项目的大部分代码都是Java源代码.理想情况下,Java源代码将以静态方式引用生成的类型,而不是使用反射或运行时代码生成,这意味着类需要位于javac的编译类路径上.我是否可以在同一个Maven项目的编译类路径上获取生成的类,即没有单独的Maven项目和工件来保存包含源代码的Maven项目引用的生成的字节代码?

更新:我已经尝试将生成的类直接放入target/classesie project.build.outputDirectory,在Maven Build Lifecycle的早期,但它似乎不在类路径上.Maven编译器插件或 IDE 无法解析生成的类型.我还尝试使用Build Helper Maven插件在target包含生成的类的情况下添加一个额外的资源目录,然后自动将其复制到该目录中target/classes.该配置表现出相同的问题.

更新:我在GitHub上创建了一个完整的公共回购:https://github.com/mches/so-42376851

这是项目的Maven POM,我希望有静态类引用字节码增强类:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>demo</groupId>
        <artifactId>demo</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../pom.xml</relativePath>
    </parent>

    <artifactId>demo-enhanced</artifactId>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>generate-resources</phase>
                        <goals>
                            <goal>unpack</goal>
                        </goals>
                        <configuration>
                            <artifactItems>
                                <artifactItem>
                                    <groupId>demo</groupId>
                                    <artifactId>demo-original</artifactId>
                                    <version>${project.version}</version>
                                    <overWrite>true</overWrite>
                                    <outputDirectory>${project.build.outputDirectory}</outputDirectory>
                                    <includes>**/*.class</includes>
                                    <excludes>META-INF/</excludes>
                                </artifactItem>
                            </artifactItems>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>net.bytebuddy</groupId>
                <artifactId>byte-buddy-maven-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>process-resources</phase>
                        <goals>
                            <goal>transform</goal>
                        </goals>
                        <configuration> …
Run Code Online (Sandbox Code Playgroud)

java bytecode intellij-idea maven byte-buddy

14
推荐指数
1
解决办法
1616
查看次数