20
2017-5-8 15:15
这个问题就需要来谈谈壳的架构问题了。
壳的三大架构
1.最早的壳几乎都是virus演化来的,大部分都是汇编直接写的。
好处就是直接可以把汇编代码复制出来当作壳的loader代码添加(感染)到程序上
知名的比如aspack,upx,telock,PESpin
2.随着对于反调试要求越来越高,功能越来越多,代码一多就难以维护。
于是诞生了新的壳架构,功能采用DLL开发,使用loader来加载
这里有两个变种:
ShellCode Loader + DLL ASProtect。Themida,ACProtect等等你所熟悉的加密壳绝大部分都是这样的架构
memory loader + DLL bigfoot为代表的bambam,ZProtect,eXPressor,npack,ChinaProtect等等
这种架构简单,好维护,更好调试。其实许多其他壳或多或少的都使用这两种架构
3.对于一些纯VM的保护壳,由于没有固定代码(VMProtect等)
所以对于这样的需求首先你需要一个codegen(这个东东将陪伴你写壳的一生)
而且对于codegen其实完全可以构造一个完整的壳代码(调试比较麻烦)
不管什么语言开发的加壳软件最终都要回到opcode操作上,而对于opcode其实用神马语言都差不多
这三种架构介绍完了。那么谈谈java写壳的问题吧,我没有用java写过壳,但是我用C#写过~
楼主的问题其实可以简单的从语言优势上来解答:
如果说开发第三种壳用啥其实都差不多,Java和C#说不定更有优势。
上面我们说到codegen的问题,真正不适合开发的地方其实主要是在各种地址转换上面,
反汇编引擎反汇编的都是opcode结构,然后再将这些opcode串联起来构造出AST,省下的就是mutation,vm,还是其他等等操作了,
如果单纯为了解决opcode--->AST(Abstract Syntax Tree抽象语法树)解决了地址转换这个问题的话其实汇编,C\C++还是Java都差不多。
反而由于Java和C#这些语言有很好的容器可以更好的来控制对象
opcode生成其实也不是难事,这些用Java还是C++其实都差不多。
真正的难点就在于上面所说的壳Loader的开发上,不管是汇编,C\C++,Delphi(不管在国内外特别是国外其实许多壳都是Delphi开发的)
都可以直接开发DLL,直接拿来变形后塞进原始程序当作壳的Loader Main部分。
而Java就只能从codegen来构造壳代码了。。。
这是一件很痛苦的事情(相信我~如果你用过Java写过c语言编译器-带连接器的那种你就会明白痛苦了)
综上所述~介于楼主的语言选择问题,估计多数是只会Java,或者需要在web层调用。
那么最好的办法还是壳主体ASM,C\C++来开发,然后开发成命令行版本,然后Java调用这个模块。
架构就这样了,省下的就是动手操作了~祝君好运~