从逆向又转回来谈谈链表和数引出来的问题StringBuilder内部原理以及手写StringBuilder
简书链接:从逆向又转回来谈谈链表和数引出来的问题StringBuilder内部原理以及手写StringBuilder
文章字数:905,阅读全文大约需要3分钟
为什么要手写?
有这么一个需求,我在开发逆向工具的时候,做了一个功能叫hook stringBuilder,和hook stringBuffer,另外我也需要打印堆栈,也需要调试数据,我发现使用字符串”xx”+”xx”进行打印的时候内部实际上使用stringbuffer进行添加的,那么我如果hook了又要知道到底hook了什么,那么就陷入了一个死循环 ,而且还需要逃避toString 也就想所有toString
hook 但是hook了又不知道到底哪里调用了,这就麻烦了,
解决堆栈死循环问题就 为了解决这2个问题,我不得不探索如何避开toString以及避开自动使用StringBuffer,那么我之前最死的办法是使用str.concat()进行拼接就可以避开StrignBuffer的使用,然后调用内部的toString也避开了另外一个toString,效率比array还低,最后参考StringBuffer做了一个
最后,再说一下,实际上我还需要根据打印堆栈转字符串类手写一个打印堆栈的,因为又陷入死循环了,t他内部还是调用的系统的StrignBuffer而我恰恰需要hook他。
ok扯那么多,说正题,观察源码发现arraylist和stringbuilder对数组的处理都做了一些优化,就是默认分配多少,然后当容量不足的时候就把空间提升为之前的几分之几,这样避免反复申请,也避免创建过大的空间。
想要源码的看官方源码,想要现成源码打个赏,因为我怀疑你正想用我的思路搞逆向,我已经分享给你思路了,哈哈,这个网上的逆向教程可是不会说的,我的逆向工具还开发了很多的攻破思路这只是其中一个,但是这个是重量级杀手锏,只要在ui界面能看到任何字符串,或者log控制台有关键信息,杜能轻松找到,除非是跨进程通跨线程通讯,那可能需要时间了,另外,实际上我告诉你这个问题,等于是帮你打开逆向思路又铺平了一些道路,有些东西不是牛逼不牛逼的问题,再聪明的人没想到这些东西也是徒劳,我承认我数学不好,有些东西也不行,但是我每次发布文章分享的创意虽然简单,但是每一个都值得惊叹,这都是有价值的技巧!
最后,我在想有没有可能用链表实现StringBuffer,不过官方都没有这么搞,一定有它的道理