【问题标题】:Convert Java Applet CAP file to *.class for decompilation将 Java Applet CAP 文件转换为 *.class 以进行反编译
【发布时间】:2019-01-10 15:22:03
【问题描述】:

这是一个 CAP 文件,可能包含恶意软件代码,没有源代码,也没有导出文件。

旧平台版本的CAP文件,即GP211

我在 Classic JVM 和 Dalvik 中拥有丰富的 Java 逆向工程经验。但是 Java Card 是不太流行和更接近的平台。大多数工具适用于 CLASS/JAR 或 DEX,而不是 CAP。

我发现有几个工具(包括一些模拟 JCOP 的 VM)可以反汇编一个 CAP 文件,但是 CAP 相当大,使用汇编代码太复杂且速度慢我。

而且我们不能简单地执行“CAP 文本字节码 -> Notepad++ -> 一些 Java 字节码编辑器 -> Java 字节码”。
CAP 字节码和 Java 字节码之间的差异太多。不仅仅是方法表,还有大量不同的操作码。
只需反编译Java Card Kit的converter.jar(它是一个转换CLASS -> CAP的工具),看到转换是一个相当复杂的过程。

我需要一些自动转换器。

同时,我正在开发一套智能卡解决方案,“CAP反编译器”将是其中的佼佼者。
是的,我要写它。
我计划从一侧构建它在 Javassist 之上,从第二个构建一些 CAP 反汇编库,从第三个构建一些标准 Java 反编译器(-s)。

但我应该确定没有类似物。

问题在这里:
地球上有没有工具可以将 Java Card *.cap 转换为 Java *.class(或直接反编译 *.cap)或没有?
我不是要图书馆(我发现了一些图书馆),我要的是工具。可运行。

(另外,如果您知道此字节码转换中的一些陷阱,如果您能向我描述它们,我将不胜感激。现在我认为它只是将一个操作码列表复制到另一个带有巨大 if...else if...else if...else if... 或 @987654322 的操作码列表@tree(以及一些杂项人员,即访问修饰符、字段等的转换)。

【问题讨论】:

  • 嗯,是的,哇,在所有文本之后,您没有在正文中重复问题。正确的。因此,对于 StackOverflow 来说,它显然是题外话,因为它要求软件:“要求工具或库推荐的问题对于 Stack Overflow 来说是题外话”是一个密切的原因。但一般来说,如果您最喜欢的搜索引擎找不到它,那么在 SO 上要求它几乎没有用处。
  • @MaartenBodewes 轻描淡写 :) “要求工具或库建议的问题对于 Stack Overflow 来说是题外话,因为 它们往往会吸引固执己见的答案和垃圾邮件”我不是在要求推荐哪种工具更好,即“A vs B”,我只是在询问有关 ANY 此类工具存在的信息。只有一个。

标签: reverse-engineering smartcard javacard jcop


【解决方案1】:

要从.cap 文件中生成.class 文件,请使用normalizer 工具,它是最近Java Card SDK 的一部分(“Classic-3.0.4”对我有用)。

例如,要从 gpshell 源转换 helloworld.cap,请使用以下命令(您必须将 api_export_files 路径调整到适当的目录):

normalizer.bat normalize -i helloworld.cap -p /path/to/api_export_files

然后你可以使用你最喜欢的java反编译器反编译输出文件(net/sourceforge/globalplatform/jc/helloworld/AAA.class),例如:

package net.sourceforge.globalplatform.jc.helloworld;

import javacard.framework.APDU;
import javacard.framework.Applet;
import javacard.framework.Util;

public class AAA
  extends Applet
{
  private static final byte[] sfield_token255_descoff10_staticref0 = { 72, 101, 108, 108, 111, 32, 87, 111, 114, 108, 100, 33 };

  public void process(APDU paramAPDU)
  {
    byte[] arrayOfByte = paramAPDU.getBuffer();
    paramAPDU.setIncomingAndReceive();
    Util.arrayCopyNonAtomic(sfield_token255_descoff10_staticref0, (short)0, arrayOfByte, (short)0, sfield_token255_descoff10_staticref0.length);
    paramAPDU.setOutgoingAndSend((short)0, sfield_token255_descoff10_staticref0.length);
  }

  public static void install(byte[] paramArrayOfByte, short paramShort, byte paramByte)
  {
    new AAA();
  }

  private AAA()
  {
    register();
  }
}

一些额外的(随机的)注释:

  • 这种方法并不直接适用于所有小程序(我之前编写的小程序的一些输出 .class 文件被反编译器拒绝为无效,但 YMMV)

  • 您需要为所有小程序的导入包提供导出文件,包括:

    • Java Card API(最新版本一直对我有用,但 YMMV)

    • 全球平台 API、SIM 工具包相关 API、卡供应商扩展或任何其他公开可用的包(如果使用其中任何一个)

    • 其他非公共包(可能/将会造成麻烦——我从未处理过,所以帮不上忙)

  • 1234563查找导入包的导出文件“用于丢失的导出文件)
  • .cap 本身的导出包不是必需的

  • 从逆向工程源重新编译小程序可能比桌面 java 更难(部分取决于使用的反编译器功能)

  • 1234563 ) 并比较 cleansuspicious cap 文件的反编译器输出
  • 检查你所做的任何事情的合法性

祝你好运!

【讨论】:

  • 考虑到问题的第一句,这项工作是否有效:“这是一个可能包含恶意软件代码的 CAP 文件,没有源代码,也没有 导出文件”?是您的小程序命名为 AAA 还是由于转换工具找不到导出文件?
  • 我有一个 java_card_kit-2_2_2(是的,旧版本,我的目标是 GP211,只有它),我在这里找不到 normalizer.bat... 我应该安装 Java Card SDK 3.0 吗?会有帮助吗?
  • @SmInc:使用来自最近的 SDK(我使用 3.0.4)的规范化器和来自 2.2.2 的 api_export_files(我使用了 2.2.1,但 3.0.4 也可以)。
  • @MaartenBodewes:使用这种方式不需要目标小程序的导出文件(gpshell 存储库中没有 .exp 文件)。 AAA 类名是由规范器生成的(恕我直言),如果提供了给定 .cap 的 .exp 文件,则将替换为有效标识符。查看更新的答案。
  • 我试图用已知的.exp 文件为.cap 生成.class 文件,但没有得到有效的名称(此信息不在此处)
【解决方案2】:

对于那些尝试执行逆向工程并在运行规范化程序时遇到错误的人:

找不到导入包 a0:0:0:0:62:0:1 的导出文件

请提供正确的导出文件

Java Card JDK api 导出文件丢失。 -p /Users/user/etc/jcard-sdk-3.0.5u3/api_export_files/

找不到导入包 a0:0:0:0:9:0:3:ff:ff:ff:ff:89:10:71:0:2 的导出文件

请提供正确的导出文件

Sim Toolkit JDK 导出文件丢失 -p /Users/user/etc/etc/43019-560/Annex_B_Export_Files

Here是Sim Toolkit JDK安装的详细信息

这是在 linux 变体上运行 normalizer 的命令行脚本:

java -server -Djc.home=/Users/user/etc/jcard-sdk-3.0.5u3 -cp .:../lib/* com.sun.javacard.normalizer.Main normalize -i /Users/user/test.cap -p /Users/user/etc/jcard-sdk-3.0.5u3/api_export_files/ -p /Users/user/etc/43019-560/Annex_B_Export_Files/

【讨论】:

    猜你喜欢
    • 2014-03-31
    • 1970-01-01
    • 2013-09-01
    • 1970-01-01
    • 2014-06-06
    • 2020-03-01
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多