今天看了滴水的加壳解壳项目的视频,决定动手实践一下
加壳过程的编写
这一部分比较简单,简单来说可以分为这些步骤
- 先将壳程序和源程序加载到内存中
- 再将源程序进行加密,放入壳程序新增的节中,并且修改壳程序中相关的数据
- 最后生成新的程序
解壳过程的编写
这一步比较复杂,要好好记录
- 获取壳程序的路径
- 将加密后源程序加载到内存中,并进行解密
- 将源程序进行拉伸
- 调用CreateProcess函数创建壳程序,并将dwCreationFlags这一参数设置为Create_Suspended,让新创建的进程处于挂起状态
- 创建结构Context的对象,调用GetThreadContext函数获得新进程的主线程的状态——当前寄存器的值,之后会修改
- 调用ZwUnmapViewOfSection()函数将外壳程序卸载掉
- 调用VirtualAllocEx()函数在ImageBase处申请SizeOfImage大小的空间
- 如果申请成功,就将拉伸过后的ImageBuffer放入所申请的空间中
- 如果申请失败,但文件由重定位表,就选择空余的地方申请空间,放入ImageBuffer,并且要根据重定位表进行修改
- 如果申请失败,并且文件没有重定位表,那么就失败返回
- 修改之前的Context的对象,主要是其中的Eax和Ebx成员,Eax记录了线程的入口点,Ebx+8为地址,指向了ImageBase的值
- 最后调用ResumeThread恢复主线程,并且调用ExitProcess结束壳程序
今天学的只是壳的简单的一种,记录一下大概的流程,具体的实现等完成之再补上
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END