手动patch白程序到VT全绿
本篇文章是对 wondeekun 大佬文章《三年了,还是VT全绿,它到底凭什么?》的学习,文中提到直接 patch原始二进制,保留原文件的字符串、统计特征、资源等,防止被杀软识别
的方法吸引了我的注意,最近抽出时间搞了一下,发现效果很好,轻轻松松就可以 vt 全绿,下面是对手动 patch 一些要点的记录。
首先我们要找一个白程序,在 qq,微信,浏览器,腾讯会议等等常见的软件安装目录下随便找一个就行,但是要注意,我们这里要找的白 exe 是不能依赖于其他 dll 的,比如我这里找了一个百度网盘的 exe,把它单独拉出来之后双击直接报错:
那我们就要换一个 exe 了,找到任意一个双击之后无反应的 exe 即可。
接下来我们把 exe 放到 cff explorer 或者任意一个 pe 查看工具中,看一下是多少位的程序,这关乎我们后面写的 shellcode,很显然,下面的程序是 64 位
接下来我们给它丢到 ida 里面寻找 patch 点
看到 winmain 最后跳转到另外一个函数里面,跟进
我们直接在这里进行 patch 即可,当然也可以继续往后跟,但是有几点是要注意的,在进入到这个函数之前的程序执行流经过的所有字节我们是不能动的,同时 patch 的字节也不能超过 text 段位置,所以我们要找的函数应该有以下几点要求:
- 函数尽量大
- 尽量靠近 text 段段首的位置
- 编写的 shellcode 尽量小
接下来就要定位函数在磁盘中的位置了,ida 给我们的是 va,我们要将其转换成 foa
利用 cff 工具即可轻松转化
再去 ida 里面看一下对应的二进制值,没问题
接下来在 010 或者其他 hex 编辑器中找到对应位置即可
然后就可以开始编写 shellcode 了,我们尽量不要用 pe_to_shellcode 这样的工具将 exe 转成 shellcode,这类工具的原理大多是在原来的 exe 中添加 stub 来引导 exe 自己在内存中展开自己,原理和 rdi 一样的,然后在返回到 entrypoint,这样做的缺点是 shellcode 有点大,所以我们可以自己写 shellcode 然后提取 text 段字节即可,关于编写 shellcode 的内容就不多说了,可以参考https://github.com/clownfive/CppDevShellcode 这个项目来进行开发,一些注意事项作者也都进行了说明。
另外尽量不要直接将 cs 的 shellcode 写进去,太大了,很容易出问题,因此这种 patch 的方法尽量采取远程拉取的策略,或者也可以利用一些资源修改工具将 cs 的 shellcode 写到资源中,然后我们自己写一段从资源中加载 shellcode 的 shellcode 即可,这里不再展开。
我们这里直接修改对应字节,然后保存文件即可
这样
此种 patch 手法仅仅是在静态上进行一定的规避效果,需要配合一定的动态规避手段才能达到较好的效果。
最后看一下效果: