加密壳

今天看了滴水的加壳解壳项目的视频,决定动手实践一下

加壳过程的编写

这一部分比较简单,简单来说可以分为这些步骤

  • 先将壳程序和源程序加载到内存中
  • 再将源程序进行加密,放入壳程序新增的节中,并且修改壳程序中相关的数据
  • 最后生成新的程序

解壳过程的编写

这一步比较复杂,要好好记录

  • 获取壳程序的路径
  • 将加密后源程序加载到内存中,并进行解密
  • 将源程序进行拉伸
  • 调用CreateProcess函数创建壳程序,并将dwCreationFlags这一参数设置为Create_Suspended,让新创建的进程处于挂起状态
  • 创建结构Context的对象,调用GetThreadContext函数获得新进程的主线程的状态——当前寄存器的值,之后会修改
  • 调用ZwUnmapViewOfSection()函数将外壳程序卸载掉
  • 调用VirtualAllocEx()函数在ImageBase处申请SizeOfImage大小的空间
    • 如果申请成功,就将拉伸过后的ImageBuffer放入所申请的空间中
    • 如果申请失败,但文件由重定位表,就选择空余的地方申请空间,放入ImageBuffer,并且要根据重定位表进行修改
    • 如果申请失败,并且文件没有重定位表,那么就失败返回
  • 修改之前的Context的对象,主要是其中的Eax和Ebx成员,Eax记录了线程的入口点,Ebx+8为地址,指向了ImageBase的值
  • 最后调用ResumeThread恢复主线程,并且调用ExitProcess结束壳程序

今天学的只是壳的简单的一种,记录一下大概的流程,具体的实现等完成之再补上

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享