静态免杀之patch白文件
之前在微信看到一篇文章《三年了,还是VT全绿,它到底凭什么?》,里面就讲述了样本的的一些方法,前段时间值守的时候抓了2个样本就用这个手法做的马,刚好这两天星球的fdx师傅写了如何手动patch,正好复现学习一下。
准备条件
首先要找一个白文件,随便到哪里找都行,找到之后需要这个exe不能有dll依赖,如下
找到一个可以双击没反应的就ok了,接着再看看exe是多少位的,用于后面编写shellcode,可以看出很明显是64位的
寻找patch点
接着就用ida去找可以patch的点,打开之后看winmain函数
接着查看里面调用了哪些函数,可以看到里面有很多的函数,需要我们去寻找
我这边已经找到了一个函数sub_140003890
点函数名按x查找调用,发现是sub_140003190
调用
再接着查找谁调用的sub_140003190
发现是sub_140004040
调用的,最后就回到了winmian函数
所以完整的调用链是winmain->sub_140004040->sub_140003190->sub_140003890,需要注意的是找的函数有几个条件
- 函数要尽量大一些,如果太小没办法放下我们的shellcode
- 尽量要让程序能触发到这个函数,不然patch也没法触发等于白整
文件定位
在得知了函数之后要找到在文件中的位置,在IDA中给的地址是VA,需要转换成FOA
用cff explorer可以转换,得到了函数开始位置在00002C90
偏移处
接着再找一下函数结尾的偏移,在000031F7
偏移处
然后就可以用winhex或者c32asm找到对应位置即可。
shellcode编写
接着就需要编写shellcode,shellcode是一段位置无关的代码,所以要编写shellcode就要用动态函数进行调用,读取PEB,自实现GerProAddress,还有字符串需要放在text段中,github上有很多模板,这里就CppDevShellcode来编写,按照作者的说明来就好,生成之后提取text段的内容
开始位置在400,用c32提取出来
最后这里30 c3后面的00可以不用,然后写个loader测试一下shellcode能不能正常运行
可以成功运行,说明shellcode没问题
patch替换
最后只需要在对应的文件内替换提取出来的shellcode即可
替换之后打开就会弹出hello
后续可以写一下加载cs的shellcode,建议使用远程加载或者使用资源读取,再配合一些反沙箱就可以达到不错的效果