处于种种原因,很多提供的jar包中的class都是混效过的,有些时候,可能处于参考,或者其他某些可告人,不可告人的目的,需要查看某些class的运行逻辑或者制作补丁等等什么的,就需要将class进行反编译了,在某些情况下,一些内容可能是动态的,或者想看修改之后出的效果,由于一个jar中往往有很多个class,但通过反编译,修改的可能仅仅只有一到两个文件,这样就需要将修改后的文件重新编译,添加到原始的jar中,来运行了。
我前两天刚好碰到了这个问题,在网上找java的反编译器,看到了一本关于java反编译与修复的书籍(竟然出书了),具体名字没记住,后来简单的思考一下,也不是什么太大的问题,于是制订了下计划,试试看自己的思路是否是正确的:
1、解压缩jar,获得class文件
2、反编译感兴趣的class文件
3、修改反编译后的class文件的源代码,使之没有语法问题
4、按需要修改上一步骤的源代码
5、编译单个java文件到class
7、将编译后的class重新放到jar中
jar使用的是zip的压缩算法,所以,不管是解压缩还是压缩都没有问题。
java有编译器jad,这一步也没有问题。
修改java代码,任何一款编辑器都没有问题。
修改后的代码能否进行编译?考虑到java代码都是单个单个的编译成class,这一步也没有问题。
编译后的class能否和原来的class配合很好的运行?从C/C++编译的角度来说,函数,变量等地址的整合在link的部分进行,而java没有这一部分,仅仅将class压缩成一个压缩包,从这个角度上来说,没有问题。如果class代码中地址已经固定死了?从理论上来说,这是可能的,但我觉得,这种可能性比较小,这次的测试也没有体现到这一点。改天再测试。
继续阅读一步一步:java文件的反编译与修补
月度归档: 2010年2月
BREW中关于__rt_sdiv和__rt_udiv的错误
昨天,同事碰到的问题,我第一眼看了说用了除法,他问,难道不能用除法么。除法当然可以用。据他介绍,原来可以编译通过的,没有修改任何配置的脚本。我记得很早之前碰到过这个问题,但忘了要修改什么地方了,看来已经老了。
于是,就按照最原始的办法,看代码什么地方调用了可能引发这两个问题的函数,用IDA进行反编译,找到__rt_sdiv,然后看什么地方调用了该函数,一下子就看到了:
int fun(int a, int b)
{
if (b == 0)
return ((1<<16)>>1);
return a/b;
}
当然,上面的写法什么的完全没有问题,那为什么编译不过呢。于是,我看了下他的脚本,link的命令中没有使用-libpath $(ARMLIB),我记得这个是有用的,对比下我的makefile,有这一项,就加上试试,果然是这个问题。
好记性不如烂笔头啊。
BREW使用命令行上传程序
最近的项目只能在手机上运行,稍微修改一下都要在手机上看看,绝大多数手机都会重启的,每次都要在BREW AppLoader中点连接手机,选择程序目录,拖文件,选择确定,等待上传,重启手机,一天的宝贵时间,这个要占大约一半,实在让人无聊透顶。看了下Apploader的帮助,发现可以通过命令行上传,我的文件又都是makefile控制的,将makefile和命令行程序结合,时间非常不错的主意。
关于BREWAppLoader的使用办法可以看程序自带的文档。
当程序中已经存在相同文件的时候,我需要默认的都是覆盖,而apploader每次都会询问,因为我在cygwin下运行,所以很自然的想到了yes命令,结果使用下面的语句:
yes | BREWAppLoader.com QCOMOEM.dll COM1 -copy bin/test.mod /mod/test
每次都一样问是否要覆盖,使用yes y或者yes a,完全没有效果,但是yes n却有效果,非常奇怪的事情,没有办法,只好复杂一些,绕个圈子:
BREWAppLoader.com QCOMMON.dll COM1 -del /mod/test/test.mod
BREWAppLoader.com QCOMOEM.dll COM1 -copy bin/test.mod /mod/test
这下子终于可以不用像之前那样劳累了,使用emacs,配合之前提到的程序设置,一键搞定所有事情,在程序的编译,上传,重启设备的空余之间,还可以做点别的事情。
语言陷阱:mnesia中关于index的选择
erlang使用mnesia进行数据库操作的时候出现的bad_type错误。
对于下面的数据结构:
-record(info, {name, id}).
使用下面的语句来创建表:
case mnesia:create_table(info, [
{disc_copies, Nodes},
{index, [name]},
{type, set},
{attributes, record_info(fields, info)}
]) of
{atomic, ok} ->
ok;
Any ->
error_logger:error_report([
{message, "Cannot install table"},
{table, info},
{error, Any},
{nodes, Nodes}])
end.
编译的时候不会有任何问题,但运行的时候,会出现{aborted,{bad_type,info,{index,[2]}}}的错误,原因在于使用record的第一个元素来做index,如果不是第一个的话则没有任何问题。
linux下通过wine使用ie
我使用的是ubuntu,虽然从开发的角度来说,比较喜欢fedora,不过,一直无法忍受其更新的速度,所以一直放弃不用。今天突然想给手机充值,但又实在不愿意切换到windows下,就安装了一下wine和ie,有一些小小的感受。
安装的步骤没什么可说的,就是按照教程来走。
在运行./ies4linux的时候,在我这边,不知道是我网络的问题,或者服务器的问题,会在下载的过程中突然失去响应,不过,幸好还可以通过多点几下关闭窗口,将程序强制中止,我这边尤其在DCOM98的时候,总是失败,没办法,只能用firefox在微软的官方下载,试了将近一个小时,终于算是下载下来了。
网上有人说需要删除.wine目录,修改.ies4linux目录什么的,在我这边倒是不需要,只是ie6工作基本上正常,ie7显示连接上网络,然后就没反应了,貌似无法下载,不过,ie7是beta版,有一个可以用,倒也无所谓了。
ie6在打开flash多的情况下,系统负载会慢慢的往上升,有没有极限没有注意,有时候,会超载到屏幕基本上只能看,没有响应(准确的来说,响应非常非常的慢,远远超过人类极限)。
wine的配置在linux下显示方块,可以通过下面的办法来解决:
运行wine regedit,打开注册表,找到HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\FontSubstitutes,删除MS Shell Dlg和MS Shell Dlg2。
ie6里面有些文字也是不正常的,显示方块,修改ie6中的system.reg文件,和上面的修改一样,ie7可能也是一样的,因为我这边ie7不正常,所以没看。
上述奇怪的卡的问题,说不定是我系统的事情,我用的是ubuntu 9.10 x86_64,windows程序吗,地球人都知道,基本上是32位的。