ssjjdns 发表于 2021-2-10 15:57

芒果教你写壳之代码虚拟化(一)

{:5_116:}{:5_116:}{:5_116:}{:5_193:}

大家好。我是芒果,今天给大家带来一个代码虚拟化技术的入门。
所谓代码虚拟化,就是反逆向的一种技术,将正常的汇编代码将被替换成只有壳可以识别的字节码。
然后移交到壳的虚拟机来解析执行。由于壳内部解析指令的过程比较复杂。如果被分析的时间成本比较高,也比较烧脑、
从而达到程序关键算法和逻辑难以逆向的目的。

这一期我们来自己动手来创造一个属于自己的代码虚拟机,自己写一款代码虚拟化的壳!!!!
由于教程嘛。我们就先实现让自己写的壳VM掉 push ebp这个指令。
后面大家可以自己发挥,来支持VM更多的指令(丰富虚拟机的指令集)。
毕竟我也是小菜,如果有写的不对的地方还请指正。

我们这只是一个入门教程嘛。所以全程不涉及高级语言的代码实现,只是一些简单的汇编和lordpe的操作,顺便讲解一下原理。
【PS:如果后面我有时间,将出一期教程,使用易语言来实现写壳】
1.下面是普通的易语言程序,od载入,默认是断到oep这里,我选中了一个push ebp 指令。今天我们这个简单教程就先让自己的壳来VM掉这个push ebp指令



2.给原来程序添加壳代码段。我设计了两个区段,一个是vmcode,一个是vmdata,vmcode是主要存放虚拟机代码;vmdata主要是存放虚拟机要解析的指令集(就是自定义的虚拟机字节码存放的地方)【加区段的话,可以使用lordpe来加区段】
注意:区段属性的问题:vmdata区段一定是C0000040(表示可读写) vmcode区段属性一定是60000020(表示可执行代码)

然后我们来划分一下vmdata区段内存空间,由于x86下面8个常见寄存器(EAX,EBX,ECX....)每个是8字节的长度,所以我们这个vmdata的前64个字节就分别来存放这8个寄存器的值。

然后是自定义字节码。我随便定义了个,FF EE EE EE EE EE FF这个8个字节代表指令push ebp。(FFEEEEEEEEEEEEFF就属于我们自定义的字节码啦,od是不能解析的,只有我们的虚拟机知道他是push ebp)然后我们把它放到哪里呢?就放到8个虚拟机寄存器的后面吧!【其实我还耍了个小聪明:FFEEEEEEEEEEEEFF无论正着读还是倒着读都一样,就不用考虑取出的时候高位还是低位的问题了。】

**** Hidden Message *****

yuhan520 发表于 2021-2-10 22:18

谢谢分享教学

VipDongle 发表于 2021-2-10 22:25

学习下,估计难度大呀

陈冠希 发表于 2021-2-10 22:43


谢谢分享教学

zfx199879 发表于 2021-2-10 22:51

学习一下{:5_116:}

10069685351 发表于 2021-2-10 22:56

芒果教你写壳之代码虚拟化(一

pjm123456 发表于 2021-2-10 23:08

谢谢分享教学

pipi9 发表于 2021-2-10 23:20

谢谢分享教学

1421509617 发表于 2021-2-11 00:01

吃水不忘打井人

莣孒嬡沵芣蓜 发表于 2021-2-11 00:08

感谢楼主分享我拿走了
页: [1] 2 3 4 5 6 7 8 9 10
查看完整版本: 芒果教你写壳之代码虚拟化(一)