[转帖]Jar深度修改 - 修改QQ2009登录图片

2010/12/4 11:11:00  人气 2925    怀旧国机论坛  
首先,虽然这种修改只是显示变化了,修改也不复杂,但是涉及一点点代码分析,所以这个教程可能会比较烦琐、难懂。
----
修改图片,自然要先把login图片替换进去,运行试试
画面仍是那么小、需要修改class参数才行。。。
我们现找到login.png所在的位置,用Halo打开QQ,切换至类编辑器,全文查找“login.png”,真是爽哉哉~结果只有一个,在ay.class里面,好的,用DJ反编译ay.class,按crlt f查找到login.png的位置
关键代码:ct.a(io.a(“/login.png“), (((lq) (g1)).f.c() - 54) / 2, i2 8, 54 * ((ay) (g1)).af, 0, 54, 54, 20, g3);
很头晕吧?
(((lq) (g1)).f.c() - 54) / 2的意思是,让login图片显示在离屏幕左边的屏幕宽度减去login的宽度,除以2的位置,就是是x坐标,不用管
i2 8的意思是把图片顶部定位在i2 8的位置上,即y坐标 还有后面的两个54,意思是每次显示图片的54个宽度,然后后移54个宽度再显示54个宽度。。。
好的,先把这两个54改为160先
点DJ反编译的Setting下拉菜单,选择第一个,钩上第一个钩
点OK,再关闭DJ反编译,双击ay.class,会自动打开DJ反编译,这次,DJ会把代码反编译成与Halo相同的代码,我们在DJ中用ctrl f查找功能找到ct.a(io.a(“/login.png“), (((lq) (g1)).f.c() - 54) / 2, i2 8, 54 * ((ay) (g1)).af, 0, 54, 54, 20, g3);的位置,然后向上翻页至0行代码处
看到了这行代码:public finalvoid a(Graphics g1)
它的意思是声明那句代码的方法名为a,现在回到那句代码的地方,看下面的
关于54的代码在第357行、364行、369行和第370行,我们需要的是后两个54,它们在Halo中就是第370行和第371行,因为DJ是从0开始数的,而Halo是从1开始数的,所以Halo比DJ里面多一个数。现在用Halo打开QQ,找到ay.class,右键点击,选择Edit Class,找到a方法,并翻页至370行,双击,把54修改为160,第371行的也要改为160、图片的位置也要改,现在要把图片显示在中间,那么就是屏幕宽度-图片宽度的差除以2,那么把第358行的也修改为160,还有第365行的,也改为160
然后点保存方法,编译,打包,运行试试。。。
好的,图是成功了,还有那些文字,太碍眼了,得删除它们,登录状态提示文字的位置得下移,颜色也不对。。。先从登录状态的提示文字下手吧。。。
Halo全文查找“正在登录”,结果在lr.class里面,双击之,发现这里只是界面文字的集合类,也就是说某个地方是通过调用这里来达到显示的目的的。
这种调用的代码为“类名.代号(排名)”这样的形式,那么这个代码应该是lr.a(157),这样,我们就得找到哪里有lr.a(157)这几个字符了,用XJAD反编译整个jar文件,再打开Findstr批量查找工具,把路径指向XJAD反编译的文件夹,把*.*改为*.java,在中间输入“lr.a(157)”,点查找,结果出来了,还是在ay.class里面
打开ay看看
关键代码:D = lr.a(157);
这句代码的意思是:用D代表lr里面的第157句,那么,得再找到哪里用到了D,按ctrl f打开查找,输入D,钩上匹配大小写,回车之,结果
关键代码:eo.a(((ay) (g1)).D, ((lq) (g1)).f.c() / 2, k2, 17, g3);
eo.a表示eo.class里面的a,那么a到底是什么呢?反编译eo看看
关键代码:public Font a = Font.getFont(0, 0, 8);
这是一个表示调用系统小字体的代码,那么,eo.a(((ay) (g1)).D, ((lq) (g1)).f.c() / 2, k2, 17, g3);的意思就是:以手机自带的小字体在屏幕的((lq) (g1)).f.c() / 2, k2位置显示出“正在登录”的字样,根据常规,((lq) (g1)).f.c() / 2是横坐标,我们的目标是向下移动那几个字符,那么k2才是关键代码,那么k2到底是什么意思呢?我们往上看。。。
关键代码:int k2 = i2 8 54 5;
那么这个就是登录提示字符的竖坐标了,那么,在DJ反编译里找到代码:int k2 = i2 8 54 5; 的位置,看下面的。。找到它所在行数。。。
现在到Halo里面找到相同的位置,然后把378行的54修改为160,试试
呃、、过了。。都跑屏幕下面去了。。得小一点,经过调试115才是最合适的位置
现在再来干掉登录提示的字符,Halo全文查找“QQ使用提示”,结果多啊。。都在bv里面。这里有两种方法,一种是把字改成空格,另一种就是删除代码。改成空格的方法简单一些,所以,双击结果,再到具体位置双击,把框里的文字全部删除,确定,全部删除掉后,保存方法,编译,打包,运行试试
还有一条杠杠。。它是用drawRGB绘图函数绘制的,那么在DJ反编译ay.class的对话框里按ctrl f查找drawRGB,结果有3处
关键代码:g3.drawRGB(ag, 0, 202, k1 2, l2 51, 202, 1, false);等~
它们的开头还有一个if (ag != null),估计也是关于那条杠杠的,也一并删除之,对应的方法还是a,在第440行到第493行,好的,那么就在Halo中找到那里,选中第441行到第494行之间的代码,点右边的删除按钮,保存方法,编译,打包,运行。。。
还有颜色,login.png的颜色与背景颜色不对,需要修改成相同的颜色才能完美,可以修改login的颜色,或者修改登录背景的颜色,我选择修改软件登录背景颜色,因为我不大会改图片,嘿、
先用模拟器运行软件,并操作至登录界面,用吸管获取登录背景的颜色,再粘贴到进制转换的十六进制框里,右边的十进制框里会自动把十六进制转成十进制,转换后为14737632,夊制它,在Halo中以14737632为关键字全文查找,结果有几个,但都在同一个类里面,双击结果,在左边找到常量池并点击它前面的十字按钮,在里面找到14737632,然后点击它,左边出现了一个输入框,里面有14737632的字符,现在我们用吸管获取login.png背景颜色的十六进制,并转换为十进制,夊制它,粘贴到那个输入框里面
点保存常量,编译,打包,测试运行
这下真的完美了。
不过,运行一两次后,会发现QQ登录提示的文字又出现了
这是因为QQ自动更新导致的,只要去掉更新即可,全文查找“http://conf”,结果只有一个,双击之,再双击具体位置,把所有字符全部删除之,保存方法,编译,打包,这样QQ就被我们改得“绿色”无广告、登录界面更大方了,可以告诉别人,我用的是最新版的QQ哦~哈哈!
这个教程的难点在于修改登录状态提示字符的位置,需要找到几个条件才能确定要修改的地方。关于绘制图片的函数,可以无视的,只要把54修改成160就OK啦~
之前我那个修改颜色的教程里面说是修改代码,这里又是修改常量池,怎么回事呢?其实,常量池就是类里面常量的集合,要是类里面有多个相同常量,修改可能比较繁琐,那么直接修改常量池,就相当于修改了全部的常量。
最后,也许有必要解释一下,类,就是指class文件。

发表回复

   


  通知楼主

11楼

殇情Sc、.12-04 19:41
游客54485,看懂了吗?这个似乎很有意思啊

回复只看TA

10楼

神~~~『解、版』.12-04 18:24
游客54485,看懂了吗?这个似乎很有意思啊

回复只看TA

9楼

流水苍颜★超管.12-04 14:39
游客54485,看懂了吗?这个似乎很有意思啊

回复只看TA

8楼

丿vIp丨贵族>宅男℡灬.12-04 12:50
绝客域名:jkmrp.com!

回复只看TA

7楼

我是巴黎欧莱雅你值得拥有.12-04 11:51
绝客域名:jkmrp.com!

回复只看TA