我真的很难找到一个好的工作Lua字节码反编译器.我正在尝试反编译我在游戏中发现的一些脚本文件,但它们似乎是编译的,但似乎无法解码.反编译Lua二进制文件的最佳工具是什么?
我正在尝试学习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]没有使用.有什么我想念的吗?谢谢
在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字节码,找到作为给定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,为什么有人会对Java源代码与Jasmin代码与Java字节码进行静态分析?选择是否限制或扩展了可以进行的各种类型的分析?选择是否会影响分析的正确性?谢谢.
我已将lua与字节码块一起嵌入到用C编写的项目中.现在,当我通过添加.lua文件扩展我的lua代码库时,有没有办法将此代码保存在单个字节码块中?
(我知道如何加载多个字节码块.但是加载一个块然后忘记粘合代码似乎很舒服.)
我尝试使用文本包含,但似乎在Lua中没有关键字."Require"和"dofile"在运行时查看文件,因此运行"lua -b ..."后生成的字节码将不包含这些文件的代码.
并且没有办法组合字节码文件,是吗?我的意思是,在创建字节码文件时,"require"命令会将所有这些文件的代码添加到一个字节码文件中.
PS:Michal Kottman的答案适用于Lua,这就是我的要求.我以为Lua和LuaJIT会以同样的方式工作.他们没有.要将多个.lua文件组合到一个LuaJIT字节码文件中,应该是一个
我知道函数比较在Python 3中是如何工作的(只是比较内存中的地址),我理解为什么.
我也理解"真正的"比较(对于任何参数,给定相同参数的函数f并g返回相同的结果吗?)实际上是不可能的.
我正在寻找介于两者之间的东西.我希望比较能够处理相同函数的最简单的情况,并且可能是一些不那么简单的函数:
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) 所以我有一个类加载器(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[]父类加载器提供的类的原始,所以我可以在定义自己的副本之前检测它们?byte[],以便MyClassLoader可以检测和定义自己的所有System类(Object,String等)的副本?编辑:
所以我尝试了另一种方法:
-javaagent,捕获 …在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) bytecode ×10
java ×7
lua ×2
byte-buddy ×1
class ×1
classloader ×1
decompiling ×1
embed ×1
function ×1
jvm ×1
maven ×1
python ×1
python-3.x ×1
scala ×1
scripting ×1