没有源代码,如何修改别人的类
作为一个流氓程序猿,打劫放火的时候,经常需要修改别人已经编译的类,在一些,没有源代码,隔离内网,破解注册码,等特殊场景下。
1. 显而易见
想办法把源代码弄过来,导入项目,凑齐Jar包,然后。。没有了
2. 祭出神器
招式:使用字节码工具,比如 javassist,jbe 直接对class文件进行修改。屠龙宝刀在手,迎刃而解。
场景:修改hive-jdbc中文乱码问题的时候,当时在隔离内网,没法弄到源代码。
适用:密界最喜欢用的工具之一了吧,适合各种破解游戏,注册,验证一类的。俗称爆破
缺点:需要一点内功,要耍的动Java字节码。当然javassist要容易点。
代码:
import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.expr.ExprEditor;
import javassist.expr.MethodCall;public class HivePatch {/*** DESC :fix about jdbc utf-8* * @param jarPath hive-jdbc-jar path* */public void patch(String jarPath){try{ClassPool pool = ClassPool.getDefault();pool.insertClassPath(jarPath) ;CtClass cc = pool.get("org.apache.hadoop.hive.jdbc.HiveQueryResultSet"); CtMethod ms=cc.getDeclaredMethod("next");ms.instrument(new ExprEditor() {public void edit(MethodCall m) throws CannotCompileException{if (m.getClassName().equals("java.lang.String")&& m.getMethodName().equals("getBytes")){m.replace("{$_=rowStr.getBytes(\"UTF-8\");}");System.out.println("line "+m.getLineNumber()+" change .");}}});cc.writeFile(jarPath);}catch(Exception e){e.printStackTrace();}}public static void main(String[] args) {new HivePatch().patch("/home/hive-jdbc-0.9.0.jar");}
}
3. 返璞归真
招式:不用神功,手里也没有神器,一片叶子也能破敌,从没见过这么修改类的,颇有返璞归真的境界。
场景:修改elasticsearch-hadoop-1.3.0.M1 日期类型格式问题的时候,还在隔离内网,没法弄到源代码。
适用:实在字节码工具没有,源代码也没有的时候,空手套白狼吧。
缺点:要修改的类的依赖关系复杂的时候,工作量倍增。
代码:
public class HiveValueReader extends WritableValueReader {@Overrideprotected Object date(String value) {return new TimestampWritable(new Timestamp(DatatypeConverter.parseDateTime(value).getTimeInMillis()));}@Overrideprotected Class<? extends Writable> dateType() {return TimestampWritable.class;}
}
这里的date方法在格式化 yyyy-MM-dd HH:mm:ss.SSS 的时候会有问题,我们要修改date方法的时候,可以创建个项目,把这个类的依赖都创建空类
然后把所有的依赖方法都,创建空方法,如图
这样,我们就可以修改编译,我们的HiveValueReader类了
转载于:https://my.oschina.net/naqin/blog/298792
没有源代码,如何修改别人的类相关推荐
- java 修改源码_再谈给应用程序diy启动画面和java源代码补丁修改
再谈给应用程序diy启动画面和java源代码补丁修改 2006-8-21 16:18 6365 再谈给应用程序diy启动画面和java源代码补丁修改 2006-8-21 16:18 6365 搞diy ...
- 2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出“方法 method() 被
2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出"方法 metho ...
- Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 3:核心类 (CMainFrame)(2)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- Media Player Classic - HC 源代码分析 2:核心类 (CMainFrame)(1)
===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...
- java编译类代码_Java的源代码中定义几个类,编译结果就生成几个以“.class”后缀的字节码。...
[填空题]一个类实现某个接口时必须实现接口中声明的所有方法,否则该类必须定义为(__); [单选题]若有定义int a = 2;则执行完语句a += a -= a * a; 后,a的值是( ) [填空 ...
- 如何修改别人的GHO作品
如何修改别人的GHO作品 软件准备 1 UltraISO 2 GHOST镜像浏览器V8.3.EXE(在光盘里可以提取到) 3 EasyBoot 4 ghostxp ISO文件 详 ...
- 【git】拉取修改别人pr与代理设置
前言 有些git不常用操作稍微记录下 代理 设置代理: git config --global http.proxy http://127.0.0.1:7890 取消代理 git config --g ...
- idea svn的项目无法标识修改新增的类_是时候让你的 IDEA 飞起来啦!
1.设置maven 1.在File->settings->搜索maven 2.Mavan home directory--设置maven安装包的bin文件夹所在的位置 3.User set ...
最新文章
- Go 语言编程 — defer 关键字
- LPSTR LPCSTR LPWSTR LPCWSTR区别
- 【学习笔记】6、标准数据类型—数字类型
- 快排算法的Java实现
- 2018年第九届蓝桥杯C/C++ C组国赛 —— 第四题:约瑟夫环
- VS.NET C#视频教学
- java 按钮 监听_Button的四种监听方式
- 全球第三大芯片制造商GlobalFoundries透露上市计划 或在2022年
- Python入门(基本概念一)
- linux下vim的安装与配置(centos)
- cvs导入oracle缺失逗号,pandas教程:使用read_csv()导入数据
- 父与子的python之旅_《父与子的编程之旅:与小卡特一起学Python》作者:Warren Sande - kindle电子书下载 - 我的书库...
- Python实现多线程并发下载大文件(断点续传支持)
- matlab之产品大全
- 亿图图示(试用版)无水印导出流程图【2021最新】
- 统计学中p值计算公式_统计学 z值 p值 问题 计算问题 在线急等
- AD13 整个pcb旋转任意角度
- SpringBoot生成条形码
- 电类专业(自动化、电气、电子、电力、通信等)的大学四年应该怎么过呢_史蒂文森sun_新浪博客
- 测试OTA升级时uboot是否会更新