作为一个流氓程序猿,打劫放火的时候,经常需要修改别人已经编译的类,在一些,没有源代码,隔离内网,破解注册码,等特殊场景下。

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

没有源代码,如何修改别人的类相关推荐

  1. java 修改源码_再谈给应用程序diy启动画面和java源代码补丁修改

    再谈给应用程序diy启动画面和java源代码补丁修改 2006-8-21 16:18 6365 再谈给应用程序diy启动画面和java源代码补丁修改 2006-8-21 16:18 6365 搞diy ...

  2. 2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出“方法 method() 被

    2.在某应用软件中需要记录业务方法的调用日志,在不修改现有业务类的基础上为每一个类提供一个日志记录代理类,在代理类中输出日志,例如在业务方法 method() 调用之前输出"方法 metho ...

  3. Media Player Classic - HC 源代码分析 4:核心类 (CMainFrame)(3)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  4. Media Player Classic - HC 源代码分析 3:核心类 (CMainFrame)(2)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  5. Media Player Classic - HC 源代码分析 2:核心类 (CMainFrame)(1)

    ===================================================== Media Player Classic - HC 源代码分析系列文章列表: Media P ...

  6. java编译类代码_Java的源代码中定义几个类,编译结果就生成几个以“.class”后缀的字节码。...

    [填空题]一个类实现某个接口时必须实现接口中声明的所有方法,否则该类必须定义为(__); [单选题]若有定义int a = 2;则执行完语句a += a -= a * a; 后,a的值是( ) [填空 ...

  7. 如何修改别人的GHO作品

    如何修改别人的GHO作品 软件准备   1 UltraISO   2 GHOST镜像浏览器V8.3.EXE(在光盘里可以提取到)   3 EasyBoot   4 ghostxp ISO文件    详 ...

  8. 【git】拉取修改别人pr与代理设置

    前言 有些git不常用操作稍微记录下 代理 设置代理: git config --global http.proxy http://127.0.0.1:7890 取消代理 git config --g ...

  9. idea svn的项目无法标识修改新增的类_是时候让你的 IDEA 飞起来啦!

    1.设置maven 1.在File->settings->搜索maven 2.Mavan home directory--设置maven安装包的bin文件夹所在的位置 3.User set ...

最新文章

  1. Go 语言编程 — defer 关键字
  2. LPSTR LPCSTR LPWSTR LPCWSTR区别
  3. 【学习笔记】6、标准数据类型—数字类型
  4. 快排算法的Java实现
  5. 2018年第九届蓝桥杯C/C++ C组国赛 —— 第四题:约瑟夫环
  6. VS.NET C#视频教学
  7. java 按钮 监听_Button的四种监听方式
  8. 全球第三大芯片制造商GlobalFoundries透露上市计划 或在2022年
  9. Python入门(基本概念一)
  10. linux下vim的安装与配置(centos)
  11. cvs导入oracle缺失逗号,pandas教程:使用read_csv()导入数据
  12. 父与子的python之旅_《父与子的编程之旅:与小卡特一起学Python》作者:Warren Sande - kindle电子书下载 - 我的书库...
  13. Python实现多线程并发下载大文件(断点续传支持)
  14. matlab之产品大全
  15. 亿图图示(试用版)无水印导出流程图【2021最新】
  16. 统计学中p值计算公式_统计学 z值 p值 问题 计算问题 在线急等
  17. AD13 整个pcb旋转任意角度
  18. SpringBoot生成条形码
  19. 电类专业(自动化、电气、电子、电力、通信等)的大学四年应该怎么过呢_史蒂文森sun_新浪博客
  20. 测试OTA升级时uboot是否会更新

热门文章

  1. java中iterable_java-如何实现Iterable接口?
  2. B站百万up主,分享软件测试学习宝典,数万测试人员3连(附系列学习视频)
  3. 探探快滑——自动滑动软件
  4. workload选择
  5. 64位和32位各个数据类型大小
  6. Qt之按钮左边图标右边文字
  7. Android Studio运行手机框很大 屏幕很小的解决办法
  8. 浙江大学又有人跳楼了
  9. npm 不是内部命令
  10. android 计算行间距,android – 如何减少TextView行间距