之前在微信看到一篇文章《三年了,还是VT全绿,它到底凭什么?》,里面就讲述了样本的的一些方法,前段时间值守的时候抓了2个样本就用这个手法做的马,刚好这两天星球的fdx师傅写了如何手动patch,正好复现学习一下。

准备条件

首先要找一个白文件,随便到哪里找都行,找到之后需要这个exe不能有dll依赖,如下

image-20240714162431368

找到一个可以双击没反应的就ok了,接着再看看exe是多少位的,用于后面编写shellcode,可以看出很明显是64位的

image-20240714165503630

寻找patch点

接着就用ida去找可以patch的点,打开之后看winmain函数

image-20240714162804514

接着查看里面调用了哪些函数,可以看到里面有很多的函数,需要我们去寻找

image-20240714162837373

我这边已经找到了一个函数sub_140003890

image-20240714162937406

点函数名按x查找调用,发现是sub_140003190调用

image-20240714163100135

image-20240714163133172

再接着查找谁调用的sub_140003190

image-20240714163201395

发现是sub_140004040调用的,最后就回到了winmian函数

image-20240714163244110

所以完整的调用链是winmain->sub_140004040->sub_140003190->sub_140003890,需要注意的是找的函数有几个条件

  1. 函数要尽量大一些,如果太小没办法放下我们的shellcode
  2. 尽量要让程序能触发到这个函数,不然patch也没法触发等于白整

文件定位

在得知了函数之后要找到在文件中的位置,在IDA中给的地址是VA,需要转换成FOA

image-20240714163747687

用cff explorer可以转换,得到了函数开始位置在00002C90偏移处

image-20240714163854489

接着再找一下函数结尾的偏移,在000031F7偏移处

image-20240714163952539

image-20240714164022508

然后就可以用winhex或者c32asm找到对应位置即可。

shellcode编写

接着就需要编写shellcode,shellcode是一段位置无关的代码,所以要编写shellcode就要用动态函数进行调用,读取PEB,自实现GerProAddress,还有字符串需要放在text段中,github上有很多模板,这里就CppDevShellcode来编写,按照作者的说明来就好,生成之后提取text段的内容

image-20240714164517080

开始位置在400,用c32提取出来

image-20240714164606356

image-20240714164623435

最后这里30 c3后面的00可以不用,然后写个loader测试一下shellcode能不能正常运行

image-20240714164805940

可以成功运行,说明shellcode没问题

patch替换

最后只需要在对应的文件内替换提取出来的shellcode即可

image-20240714165042733

替换之后打开就会弹出hello

image-20240714165116223

后续可以写一下加载cs的shellcode,建议使用远程加载或者使用资源读取,再配合一些反沙箱就可以达到不错的效果