现阶段,shellcode编写门槛高,大多需要有较深的汇编功底,而Metersploit上的Shellcode开源生成框架,功能单一,扩展性差,大多只能在demo中测试使用,难以在实战中发挥作用。
我的这个版本用纯C语言实现了Windows平台下自己的Shellcode生成器,能在实战中根据现实情况,自动生成所需功能的Shellcode。
整个项目大致如下:后面会讲解每一个文件的作用
首先来说一下自己的这个项目的设置,本项目使用VS2013编译
我的这个框架分为两个部分,一个是ShellCode的生成部分,还有一个是ShellCode部分
之所以采用这样的文件命名的方式是为了方便计算ShellCoede的大小。文件的编译顺序就是编译后的exe函数的排列顺序。具体来说这个项目的文件编译顺序是0.entry.cpp->a.start.cpp->b.work.cpp->z.end.cpp(main.cpp是另外一个工程),那么代码段中的函数排列顺序也会和文件的编译顺序一致 下面说一下每个文件的作用
首先我在a.start.cpp中放了一个ShellCodeStart函数,用于标记ShellCode的开始位置
然后在z.end中放了一个ShellCodeEnd函数,用来标记ShellCode的结束位置,然后将真正的ShellCode放在a和z之间
那么根据文件的编译顺序,只需要用ShellCodeEnd函数的位置减去ShellCodeStart函数的位置,就能得到ShellCode的大小
首先来说明ShellCode的生成部分,这个部分在0.entry.cpp中,同时将入口点修改为EntryMain,也就是说这是整个工程的main函数
这个ShellCode生成函数会计算ShellCode的大小,然后将ShellCode写到一个二进制文件,可以省去在OD中提取ShellCode的步骤
真正的ShellCode代码存放在a.start中的ShellCodeEntry函数里
首先我定义了一个结构体Functions,这个结构体存放所有需要用到的函数指针
接着通过计算哈希的方式获取到需要的函数地址并将所需要的模块加载进来
接着调用MessageBox函数 !
另外我还写了一个ShellCodeLoader用于测试写好的ShellCode,代码相对来说比较简单
就是将ShellCode读取到内存然后执行
如果你所编写的ShellCode没有文件,当双击ShellCodeLoader时,就会执行生成的ShellCode.bin文件
如果执行成功,说明ShellCode没有问题
在编写好ShellCode之后点击ShellCodeFrame.exe会生成ShellCode.bin,然后用二进制文件打开ShellCode.bin,复制所有代码即可
我的这个框架并只写了一个示例的MessageBox函数,具体扩展的步骤如下:
在api.h中定义所需要的函数指针,并将函数指针存放到结构体
在hash.h中定义需要用的到函数的哈希值
在b.work的Initfunctions函数中获取函数指针和加载需要的模块
在ShellCodeEntry中调用函数
《Windows平台高效Shellcode编程技术实战》
PIC_BINDSHELL(Github):582K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6E0j5i4c8@1K9h3k6W2M7%4c8S2N6r3W2G2L8W2)9J5c8W2m8u0b7#2)9#2k6V1u0A6L8X3c8K6K9r3g2D9L8l9`.`.
2fbK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6f1L8$3&6&6b7$3S2W2L8U0f1$3i4K6u0r3f1$3S2W2L8r3I4o6L8$3c8W2c8Y4u0S2L8h3f1`.
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
如果shellcode运行时连loadlabrary和getprocessaddr的地址都不知道的话,怎么开始呢?