将Java Applet CAP文件转换为*.class以进行反编译

SmI*_*Inc 6 reverse-engineering smartcard javacard jcop

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

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

我在Classic JVM和Dalvik中拥有丰富的Java逆向工程经验.但Java Card是较不受欢迎且更接近的平台.大多数工具用于CLASS/JAR或DEX,而不是CAP.

我找到了几个可以反汇编 CAP文件的工具(包括一些模拟JCOP的虚拟机),但是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)或不?
我不是要求一个库(我发现了一些),我要求一个工具.Runnable接口.

(如果你知道这个字节码转换中的一些陷阱,我将不胜感激,如果你将它描述给我.现在我把它看作只是一个复制一个操作码列表到另一个有巨人if...else if...else if...else if...switch...case...case...case树(和一些misc员工,即转换)访问修饰符,字段等).

vlp*_*vlp 5

要从.class文件中生成文件,请.cap使用归一化工具,该工具是最近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
Run Code Online (Sandbox Code Playgroud)

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

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();
  }
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

    • 其他非公共软件包(可能/会引起麻烦——我从来没有处理过,所以无济于事)

  • 要获取导入包 AID 的列表,您可以检查 CAP 文件中的适当结构(我不知道有任何公开可用的工具,抱歉)或者只是逐步尝试(规范化程序给出错误消息,例如“找不到导入包的导出文件” " 用于缺少导出文件)

  • .cap本身的导出包不是必需的

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

  • 如果您只需要检查是否有人没有在二进制.cap文件中引入后门,那么.cap从可信来源构建干净的文件(最好使用相同的编译器)并比较干净可疑cap 文件的反编译器输出会简单得多

  • 检查你正在做的任何事情的合法性

祝你好运!