网站建设服务器介绍图片网站的类型
news/
2025/10/2 4:46:36/
文章来源:
网站建设服务器介绍图片,网站的类型,grace wordpress,关键词优化除了做网站还有什么方法背景 1 工作需要#xff0c;需要修改一个java的程序逻辑#xff0c;之前都是用的frida修改的#xff0c;但是现在的工作场景#xff0c;重视效率#xff0c;所以frida这种重工具被pass了#xff0c;只能重新选其他工具#xff0c;初始的时候是想用java本身的一些修改工…背景 1 工作需要需要修改一个java的程序逻辑之前都是用的frida修改的但是现在的工作场景重视效率所以frida这种重工具被pass了只能重新选其他工具初始的时候是想用java本身的一些修改工具的上网发现了很多。比如cglib,javaassist,asm,byte buddy等
java本身hook工具的限制 1 2 3 4 5 6 7 8 9 10 11 但是发现这些都不符合我的应用场景首先我这个应用的jar包本身是加密的需要加载的过程中在自定义的classloader中进行解密才能得到最终的dex文件而这些工具大多都是通过调用默认的classloader来加载的直接就会检测当前dex文件不符合文件格式而报错 有一些可以绕过的又只能修改未加载的dex 后来redefineClass绕过了发现他只能修改部分逻辑而我要修改的变量是一个private的redefineClass不能修改函数的签名即不能增加一个方法来操作这个private变量 再后来我又绕过了可以修改了但是又发现我的判断条件位于上一层而这个类的实例中所有变量都无法判断我要执行的修改逻辑。。。。 越看问题越多要修改的逻辑也越多 同时程序中本身会打印日志我修改了字节码那他的日志中打印的行数也会有问题。。。。感觉爆炸了最后想到通过修改jdk来实现java逻辑的修改。
jdk修改 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 为了修改这个大概了解了下一个实例在内存中的分布以及jdk的实现。 首先想到jdk的类的实现主要通过两个类来实现一个是oopDesc一个是Klass我是这么理解的Klass代表一个类的结构oopDesc代表一个类的实例的结构这样把实现和实例分离开来多个类的实例oopDesc也只需要指向同一个Klass结构这样可以大幅节省空间 我计划的实现hook修改某个实例的大致流程如下 1、在实例初始化的时候获取这个实例的地址 2、通过实例指向的Klass结构找到我想修改的这个变量或方法的偏移地址 3、根据偏移获取我想要的变量地址 4、在需要修改的地方修改之前获取的变量地址中的内存数据。 下面一步步来解决 1、我想修改的是某个实例那么就在某个实例开始的地方来hook他。实例初始化的流程大概是 -加载一个类也就是把dex解析为一个klass类存储在内存中 -根据klass分配一个指定大小的内存空间 -初始化这个内存空间为一个Oop结构 -根据Klass的定义初始化成员变量 这里我是在第二步获取的空间反正实现就行后续没跟了。我是用的openjdk17修改了位于instanceKlass.cpp的allocate_instance函数其中的oop返回之后根据函数的入参获取当前的klass 的name判断是否是自己需要的klass来定位最终的oop的内存空间 1 2 3 4 看到这里的判断逻辑为什么我加了个长度判断而不是直接精准匹配某个字符串是因为这里jdk有个问题我同样新建一个a.b.c.d的类他这里klass的名字有的时候是a.b.c.d,有的时候a.b.c.d ,tmd多了一个 ,搞了我好久 2、找偏移硬核可以直接jdk里面找我反正就该一个类所以简单点通过开启java的配置启动项PrintFieldLayout来设置打印的,可以得到如下的内容:  这里就是Person在内存中的实例打个比方我要修改的是b变量位于20偏移处这里是10进制不是16进制 1 2 3 3、根据偏移地址找到数据。这里借助了工具jhsdb我从官网下载的jdk里面编译出来的都是不带这个工具的正好还下载了graal jdk,他里面是携带的。 jhsdb启动后注入进程看看上面这个变量的内存分布 1 2 3 4 5 6 7 上面是实例的结构我们想要的b发现并不是oop的地址加上20那这里是为什么呢 因为我想要获取的是一个AtomicInteger类的实例而不是简单的int实例存储的是指向相应的实例oop的指针而非简单的一个int数据。 再看看下面内存的16进制分布吧 20的16进制是0x14,我们偏移一加得到是0x8adade24这里我取了四字节是因为这里jdk采用了一个叫压缩指针的方式来存储实际的oop数据直接使用0x8adade24 * 8 0x456d6f120,就是我要去的实例地址然后再取这个AtomicInteger的数据的偏移即可得到实际我要改的那个b的地址 4 、在最终要修改的时候修改。这里就是我程序的逻辑了各不一样了
总结 1 2 这个就是最终的流程了优势就是不改java逻辑java程序无法感知应该 这个markdown不会插图呀。。。算了也懒得插了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/924553.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!