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调用这个模块。

架构就这样了,省下的就是动手操作了~祝君好运~