首页
社区
课程
招聘
[求助]逆向分析Java
发表于: 2007-5-10 10:26 10808

[求助]逆向分析Java

2007-5-10 10:26
10808
现有一个软件,很大,混合了好几种语言来编写各个组成部分。
我想找到它的注册算法。
千山万水,终于把目标定位到一个类的一个方法里面,但是似乎这个方法不能完全反编译。
代码如下:
    public void save(byte abyte0[], byte abyte1[])
        throws IOException
    {
        FileOutputStream fileoutputstream = new FileOutputStream(filename);
        ObjectOutputStream objectoutputstream = new ObjectOutputStream(fileoutputstream);
        objectoutputstream.writeObject(abyte0);
        objectoutputstream.writeObject(abyte1);
        fileoutputstream.close();
        break MISSING_BLOCK_LABEL_49;
        Exception exception;
        exception;
        fileoutputstream.close();
        throw exception;
    }
跟踪发现,输入注册码的时候,它会简单处理一下,然后写入文件中,而这里就是最后一步了。调用这个方法的外部方法中,通过判断是否抛出异常来判断注册是否成功。我试过,输入错误注册码是提示出错的。
但是,上面代码似乎没有明显的注册算法,不知道是不是因为break MISSING_BLOCK_LABEL_49;这一句。
麻烦各位了^_^

[课程]Android-CTF解题方法汇总!

收藏
免费 0
支持
分享
最新回复 (12)
雪    币: 328
活跃值: (39)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
2
代码如下:
    public void save(byte abyte0[], byte abyte1[])
        throws IOException
    {
        FileOutputStream fileoutputstream = new FileOutputStream(filename);
        ObjectOutputStream objectoutputstream = new ObjectOutputStream(fileoutputstream);
        objectoutputstream.writeObject(abyte0);
        objectoutputstream.writeObject(abyte1);
        fileoutputstream.close();
        break MISSING_BLOCK_LABEL_49;
        Exception exception;
        exception;
        fileoutputstream.close();
        throw exception;
    }

还以为是什么嫩

就是简单的异常处理,不用惊慌

    public void save(byte abyte0[], byte abyte1[]) throws IOException
    {
        FileOutputStream fileoutputstream = null;
        ObjectOutputStream objectoutputstream = null;
        try{
           fileoutputstream=new FileOutputStream(filename);
           objectoutputstream=new ObjectOutputStream(fileoutputstream);
           objectoutputstream.writeObject(abyte0);
           objectoutputstream.writeObject(abyte1);
           fileoutputstream.close();
        }catch(Exception exception){
             try{
               fileoutputstream.close();
             }catch(Exception e){
                 System.err.println("Shit Why happend Exception");
             }
        }
    }

关于上面代码的处理可以猜到。
你的数据信息通过 对象序列化I/O了。
重要的是 abyte0 和 abyte1两个数组的内容,我也经发邮件给你关于
break MISSING_LABEL_xxx
的原因。就不写下了。

给你提的意见:
1、不用研究文件的存储格式,因为是使用对象序列化的,标准的,可以使用对象输入输出流处理。
2、详细的分析 abyte0、abyte1的生成、数据格式

目前就这么些,如果有进展可以继续。
最好对反编译后的代码 处理一下  比如 fileoutputstream -> fout 这样可以免去他人在回复时
的换行的烦恼

author: vhly[FR]
Date: 2007/05/10
2007-5-10 17:59
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
3
郁闷,昨天收到发帖限制,最多10个回复。
憋了好久,好不容易等到12点,马上上来发。

vhly看我给你的邮件
2007-5-11 00:28
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
4
你的意思是说,代码的功能已经全部反编译了,只是一些花指令罢了,是么?
我才说,从十六进制都看不到代码了,我原来以为那里面隐含着最重要的代码。

如果是这样的话,那就太神奇了,我跟踪注册算法,就跟到这里了,我可以肯定,这里是验证注册码的地方。如果注册失败,会抛出异常,然后外部调用者提示注册失败。

这又是怎么回事呢?我怀疑,还有一些可能:
1,它重写了那个对象流的WriteObject方法
2,别的类库修改了这个方法的代码。不熟悉Java,呵呵,PE中这是常有的事情。因为我发现,和这个jar包一起加载的,还有另外一个jar包,但是没有发现他们互相调用的痕迹。
2007-5-11 09:37
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
5
这是我破解这个软件的第二条线索,可不能断了呀。大家帮帮忙
2007-5-11 23:14
0
雪    币: 150
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
根据我对java的学习,简单的看这就是一个写文件的方法:把两个对象写进文件.
两个参数是已经被序列化成byete[]的对象

不过你说的重写,是有可能的,跟进那方法试试
2007-5-13 08:21
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
7
是的,不管谁看,都知道,这是写文件的代码而已。

但是,奇怪的就是,调用这个方法的地方,根据异常判断注册是否成功,并且非常准。所以,这里就应该有注册的验证代码才对。
2007-5-14 09:59
0
雪    币: 195
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
在这里面:这个jar包一起加载的,还有另外一个jar包,但是没有发现他们互相调用的痕迹。
2007-5-17 19:44
0
雪    币: 328
活跃值: (39)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
9
一定要注意 异常的堆栈调用方式,虽然是写文件,但是也有一种可能是在别的地方出现了异常,一定要处理好异常的层次,你再试试。要不写出异常的层次,让我们看吓
2007-5-18 08:49
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
10
在别的地方出现异常?你的意思是,有可能在另外一个jar包?因为当前的这个jar,我全部看过了,确定没有相关代码了。

在启动用的批处理文件中,就提到了这两个jar包。

我不熟悉Java,不知道这个异常层次是……
2007-5-19 23:29
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
11
这次分析,有了新的进展。

我找了了验证注册信息的一个jar包,核心校验就在其中一个class里面。
请问,我可否只反那个class,然后别jar包中其它的class一起编译?
如果整个jar包都反成java编译,会有很多很多一楼中提到的那种代码,而通不过编译。

怎么办?
2007-6-7 11:46
0
雪    币: 328
活跃值: (39)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
12
高兴有了进展,可以将以个类进行反编译,之后使用jar当作classpath进行编译就可以了
2007-6-13 09:14
0
雪    币: 79
活跃值: (35)
能力值: ( LV2,RANK:150 )
在线值:
发帖
回帖
粉丝
13
你这个主意非常好!
但是,我还有个不明白的地方。
jar中有类A,我反编译它,引用jar,编译。会不会因为有两个类A而无法编译呢?
2007-6-13 11:24
0
游客
登录 | 注册 方可回帖
返回
//