- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在研究 Java,特别是字节码编辑时,我偶然发现了 this tutorial ,它指导您完成使用十六进制编辑器编辑已编译的 Java .class
文件的步骤。出于好奇,我尝试了一下。
我确保我输入的所有内容都正确,检查并再次检查,在我的十六进制编辑器中替换了正确的字节,等等。一切正常。
我注意到的第一件事是我的十六进制转储与他的不同,但是,我预料到了这一点,因为不同的 Java 版本会产生不同的结果。
输入正确的字节后(将 Hacking Java Bytecode!
替换为 l33t hax0r bro
,以及 00 16
的三个匹配项> with 00 0E
), 我保存了文件,然后运行它。然而,我并没有像本教程的作者那样得到 l33t hax0r bro
的输出,而是得到了一个相当难看的错误:
Error: A JNI error has occurred, please check your installation and try again
Exception in thread "main" java.lang.ClassFormatError: Unknown constant tag 116 in class file User
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:760)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:467)
at java.net.URLClassLoader.access$100(URLClassLoader.java:73)
at java.net.URLClassLoader$1.run(URLClassLoader.java:368)
at java.net.URLClassLoader$1.run(URLClassLoader.java:362)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:361)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:495)
这是我使用的 Java 源代码:
public class User {
protected int status = 0;
public boolean setStatusTrue() {
return this.status == 1;
}
public static void main(String[] args) {
System.out.println("Hacking Java Bytecode!");
}
}
未编辑 User.class
文件的 hexdump:
00000000: cafe babe 0000 0034 0029 0700 0201 0004 .......4.)......
00000010: 5573 6572 0700 0401 0010 6a61 7661 2f6c User......java/l
00000020: 616e 672f 4f62 6a65 6374 0100 0673 7461 ang/Object...sta
00000030: 7475 7301 0001 4901 0006 3c69 6e69 743e tus...I...<init>
00000040: 0100 0328 2956 0100 0443 6f64 650a 0003 ...()V...Code...
00000050: 000b 0c00 0700 0809 0001 000d 0c00 0500 ................
00000060: 0601 000f 4c69 6e65 4e75 6d62 6572 5461 ....LineNumberTa
00000070: 626c 6501 0012 4c6f 6361 6c56 6172 6961 ble...LocalVaria
00000080: 626c 6554 6162 6c65 0100 0474 6869 7301 bleTable...this.
00000090: 0006 4c55 7365 723b 0100 0d73 6574 5374 ..LUser;...setSt
000000a0: 6174 7573 5472 7565 0100 0328 295a 0100 atusTrue...()Z..
000000b0: 0d53 7461 636b 4d61 7054 6162 6c65 0100 .StackMapTable..
000000c0: 046d 6169 6e01 0016 285b 4c6a 6176 612f .main...([Ljava/
000000d0: 6c61 6e67 2f53 7472 696e 673b 2956 0900 lang/String;)V..
000000e0: 1800 1a07 0019 0100 106a 6176 612f 6c61 .........java/la
000000f0: 6e67 2f53 7973 7465 6d0c 001b 001c 0100 ng/System.......
00000100: 036f 7574 0100 154c 6a61 7661 2f69 6f2f .out...Ljava/io/
00000110: 5072 696e 7453 7472 6561 6d3b 0800 1e01 PrintStream;....
00000120: 0016 4861 636b 696e 6720 4a61 7661 2042 ..Hacking Java B
00000130: 7974 6563 6f64 6521 0a00 2000 2207 0021 ytecode!.. ."..!
00000140: 0100 136a 6176 612f 696f 2f50 7269 6e74 ...java/io/Print
00000150: 5374 7265 616d 0c00 2300 2401 0007 7072 Stream..#.$...pr
00000160: 696e 746c 6e01 0015 284c 6a61 7661 2f6c intln...(Ljava/l
00000170: 616e 672f 5374 7269 6e67 3b29 5601 0004 ang/String;)V...
00000180: 6172 6773 0100 135b 4c6a 6176 612f 6c61 args...[Ljava/la
00000190: 6e67 2f53 7472 696e 673b 0100 0a53 6f75 ng/String;...Sou
000001a0: 7263 6546 696c 6501 0009 5573 6572 2e6a rceFile...User.j
000001b0: 6176 6100 2100 0100 0300 0000 0100 0400 ava.!...........
000001c0: 0500 0600 0000 0300 0100 0700 0800 0100 ................
000001d0: 0900 0000 3c00 0200 0100 0000 0a2a b700 ....<........*..
000001e0: 0a2a 03b5 000c b100 0000 0200 0e00 0000 .*..............
000001f0: 0e00 0300 0000 0100 0400 0200 0900 0100 ................
00000200: 0f00 0000 0c00 0100 0000 0a00 1000 1100 ................
00000210: 0000 0100 1200 1300 0100 0900 0000 3f00 ..............?.
00000220: 0200 0100 0000 0c2a b400 0c04 a000 0504 .......*........
00000230: ac03 ac00 0000 0300 0e00 0000 0600 0100 ................
00000240: 0000 0500 0f00 0000 0c00 0100 0000 0c00 ................
00000250: 1000 1100 0000 1400 0000 0300 010a 0009 ................
00000260: 0015 0016 0001 0009 0000 0037 0002 0001 ...........7....
00000270: 0000 0009 b200 1712 1db6 001f b100 0000 ................
00000280: 0200 0e00 0000 0a00 0200 0000 0900 0800 ................
00000290: 0a00 0f00 0000 0c00 0100 0000 0900 2500 ..............%.
000002a0: 2600 0000 0100 2700 0000 0200 28 &.....'.....(
编辑 User.class
文件的 hexdump:
00000000: cafe babe 0000 0034 0029 0700 0201 0004 .......4.)......
00000010: 5573 6572 0700 0401 0010 6a61 7661 2f6c User......java/l
00000020: 616e 672f 4f62 6a65 6374 0100 0673 7461 ang/Object...sta
00000030: 7475 7301 0001 4901 0006 3c69 6e69 743e tus...I...<init>
00000040: 0100 0328 2956 0100 0443 6f64 650a 0003 ...()V...Code...
00000050: 000b 0c00 0700 0809 0001 000d 0c00 0500 ................
00000060: 0601 000f 4c69 6e65 4e75 6d62 6572 5461 ....LineNumberTa
00000070: 626c 6501 0012 4c6f 6361 6c56 6172 6961 ble...LocalVaria
00000080: 626c 6554 6162 6c65 0100 0474 6869 7301 bleTable...this.
00000090: 0006 4c55 7365 723b 0100 0d73 6574 5374 ..LUser;...setSt
000000a0: 6174 7573 5472 7565 0100 0328 295a 0100 atusTrue...()Z..
000000b0: 0d53 7461 636b 4d61 7054 6162 6c65 0100 .StackMapTable..
000000c0: 046d 6169 6e01 000e 285b 4c6a 6176 612f .main...([Ljava/
000000d0: 6c61 6e67 2f53 7472 696e 673b 2956 0900 lang/String;)V..
000000e0: 1800 1a07 0019 0100 106a 6176 612f 6c61 .........java/la
000000f0: 6e67 2f53 7973 7465 6d0c 001b 001c 0100 ng/System.......
00000100: 036f 7574 0100 154c 6a61 7661 2f69 6f2f .out...Ljava/io/
00000110: 5072 696e 7453 7472 6561 6d3b 0800 1e01 PrintStream;....
00000120: 000e 6c33 3374 2068 6178 3072 2062 726f ..l33t hax0r bro
00000130: 0a0a 0020 0022 0700 2101 0013 6a61 7661 ... ."..!...java
00000140: 2f69 6f2f 5072 696e 7453 7472 6561 6d0c /io/PrintStream.
00000150: 0023 0024 0100 0770 7269 6e74 6c6e 0100 .#.$...println..
00000160: 1528 4c6a 6176 612f 6c61 6e67 2f53 7472 .(Ljava/lang/Str
00000170: 696e 673b 2956 0100 0461 7267 7301 0013 ing;)V...args...
00000180: 5b4c 6a61 7661 2f6c 616e 672f 5374 7269 [Ljava/lang/Stri
00000190: 6e67 3b01 000a 536f 7572 6365 4669 6c65 ng;...SourceFile
000001a0: 0100 0955 7365 722e 6a61 7661 0021 0001 ...User.java.!..
000001b0: 0003 0000 0001 0004 0005 0006 0000 0003 ................
000001c0: 0001 0007 0008 0001 0009 0000 003c 0002 .............<..
000001d0: 0001 0000 000a 2ab7 000a 2a03 b500 0cb1 ......*...*.....
000001e0: 0000 0002 000e 0000 000e 0003 0000 0001 ................
000001f0: 0004 0002 0009 0001 000f 0000 000c 0001 ................
00000200: 0000 000a 0010 0011 0000 0001 0012 0013 ................
00000210: 0001 0009 0000 003f 0002 0001 0000 000c .......?........
00000220: 2ab4 000c 04a0 0005 04ac 03ac 0000 0003 *...............
00000230: 000e 0000 0006 0001 0000 0005 000f 0000 ................
00000240: 000c 0001 0000 000c 0010 0011 0000 0014 ................
00000250: 0000 0003 0001 0a00 0900 1500 0e00 0100 ................
00000260: 0900 0000 3700 0200 0100 0000 09b2 0017 ....7...........
00000270: 121d b600 1fb1 0000 0002 000e 0000 000a ................
00000280: 0002 0000 0009 0008 000a 000f 0000 000c ................
00000290: 0001 0000 0009 0025 0026 0000 0001 0027 .......%.&.....'
000002a0: 0000 0002 0028 .....(
The answer to this question表明 ClassFormatError
是 Java 8 编译器中的错误。我正在使用 Java 8,但是,答案还指出该错误已在 8u60+ 中修复。我正在使用 8u65。
最后,如何使用十六进制编辑器编辑 .class
文件以获得所需的输出?
其他系统规范:
javac -version
: javac 1.8.0_65
java -version
:
java version "1.8.0_65"
Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
最佳答案
您只应该替换您修改的字符串的长度字段。那是您修改的字符串前面的两个字节, 00 16
的其他实例是类文件的不相关部分,编辑它们会将所有内容变成垃圾。
附带说明一下,我强烈建议使用汇编器。我以前直接在十六进制编辑器中创建和修改类,这是一个非常痛苦的过程,即使您知道自己在做什么,也很容易搞砸。此外,现在它几乎毫无意义,因为 Krakatau 汇编器和反汇编器允许您以人类可读的格式创建和修改任意类文件。 (如果你发现 JVM 支持 Krakatau 不支持的东西,请提交错误)
关于java - 十六进制编辑 Java 字节码抛出 ClassFormatError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34823167/
我添加了编辑按钮 self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButto
我试图在运行时“干净地”更改 UIBarButtonItem 文本,以便可以切换编辑/完成模式。然而,每次我在运行时更改 title 属性时,动画看起来都很笨拙。我正在寻找模拟联系人应用程序中“编辑/
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
我想更改 INI 文件中的一些值。不幸的是,我在 2 个不同的部分有键,它们共享相同的名称但需要不同的值。我的代码使用 Get-IniContent函数来自 PsIni . 示例 INI 文件: [P
是否有通知或委托(delegate)方法可用于检测表格 View 何时进入编辑状态? 我想要做的是检测表正在编辑,然后显示一个额外的行,上面写着“添加新项目”或类似的东西。 我尝试在加载 View C
例如,我试图从 svg 读取样式块,我可以获取类型但不能获取字符串。 $svgTemplate = new SimpleXMLElement($_POST['SvgTemplateImport']);
我可以使用 self.navigationItem.leftBarButtonItem = self.editButtonItem; 通过按下导航面板上的编辑按钮让 UITableViewContro
我正在使用markitup!作为 Markdown 编辑器( example )。 目前,我需要按预览按钮(绿色勾号)来显示预览面板。 我希望自动显示预览 - 我怎样才能实现这一点? 最佳答案 我没有
我的处境非常糟糕。我丢失了源代码,客户需要在应用程序中进行一些更改。想想一个编辑程序集的例子:Test.dll,然后添加代码行,最后重新编译它 所以我的问题是: -可以这样做吗? -如果可能的话,什么
我使用了一些 JavaScript 来通过按钮更改段落元素的内容。它工作正常,但我还想让按钮控制标题和附图。给我指明正确的方向吗? 这是我用来更改段落的代码 .... 谢谢! 最佳答案 尝试将 Ja
是否有任何 Emacs lisp 插件可以让我轻松地在 yaml 文件中编辑或输入数据。 例如: --- sample yaml file ---Name : Addr :City :State:Zi
新手Java问题,我确定已经解决了,但是在任何地方都找不到解决方案:( 我想使用这里包含的java程序http://sourceforge.net/projects/ant-tibco/files/
在我的网页中,我使用了 gridview。在这个 GridView 中,它显示了一组用户信息。我刚刚从智能标签菜单中添加了一个按钮。我的要求是当我点击每个用户对应的按钮时,它会重定向到另一个页面并显示
我想在没有任何框架的情况下直接在 JS 中编辑一个 SVG 文件。 基本上我有一个 SVG 主文件,其中应该包含一些子 SVG。 我已经在 Ajax 中检索了这些子项的内容,但我想将它们插入到 SVG
我有我的 ViewModel,我有我的 Controller 可以从 ViewModel 正确显示,但是我不确定如何使 ViewModel 可编辑,以便将编辑后的数据发送回模型。我只想编辑 Order
我不确定我的做法是否正确。 IplImage *dog_1 = cvCreateImage(cvGetSize(oriImg), oriImg->depth, oriImg->nChannels);
我有一个创建二维码的网络服务器。在此过程中,我得到一个 BarcodeQRCode 对象,我可以从中获取图像 (.getImage())。 我不确定如何将这张图片发回给客户。我不想将它保存在文件中,而
已编辑:我的第一个问题解决了,但又出现了另一个问题,只提供了一个用户 ID。这是修改后的代码的屏幕截图。 回到表格,用户将按下编辑按钮,这样他就可以编辑问题并给出适当的操作.. 我的上表代码是这样的:
据我了解,我无法通过重新启动服务器来清除 MySQL 查询缓存。 每次运行 sql 时,我都试图获得与第一个代码块类似的结果 1-这是在重新启动 Apache 和 MySQL 之前(第一次使用这些查询
我正在创建一个页面来搜索项目,然后能够编辑/更新它。当它只返回一个结果时我能够做到这一点,但当它给我多个结果时我只能编辑最后一项。下面是我的代码: ....... $dj =$_POST[djnum]
我是一名优秀的程序员,十分优秀!