FormBook是一种非常活跃的商业窃密木马,可从各种 Web 浏览器中获取凭证、收集截图、监控和记录击键次数,并按照其 C&C 命令下载和执行文件。具备一定的对抗检测、对抗分析和反溯源能力。
最近看了个formbook的木马,整理了一下笔记作为学习使用。我将formbook分成两个部分,上半部分是C#部分(可以看作他的壳),下半部分是后门部分。我用2种方法获取到最终的后门,记录一下。

反着找,这个样本藏得很深,一眼没找到,就先给invoke下断点,然后从调用invoke的地方反着往回找调用处 一层一层往上回溯发现调用关系是InitializeComponent-this.nnn()-this.sss()-Form1.SponsorState()-Form1.smethod_54((Assembly)Form1.RefreshCode(array))[1]-创建对象

找到了关键位置,创建新对象

最后发现这个位置并不是真正的调用第二层的地方,作用是load函数加载资源和解密资源。



出来之后继续跟:
在invoke里面可以看到调用的模块的函数

进入模块内断下来:





然后dump下来 就是后门部分
assembly:加载pe的地方
在解密完资源之后直接在内存中用去混淆后的pe进行替换
InitializeComponent里面会对资源进行解密,然后加载资源,找到被解密的资源:


method_12:


这里涉及到一个知识点,如何在C#中使用内嵌资源文件(d81K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4c8Q4x3X3g2*7L8%4g2C8j5h3&6C8j5h3&6Q4x3X3g2U0L8$3#2Q4x3V1k6$3K9h3y4Q4y4h3k6D9N6g2)9J5k6s2m8Q4x3X3b7J5x3o6f1#2y4U0p5K6i4K6u0W2K9s2c8E0L8q4!0q4c8W2!0n7b7#2)9^5z5b7`.`.
由于这个样本中的资源名是加密的,需要解密后才能看到,所以需要对c#中使用资源的部分很熟悉才能快速找到关键点:
替换方法:



创建好的空白资源Rara3

接下来就是寻找解密函数的地方
思路是加载完资源后紧跟着就会进行解密 所以从加载资源的地方往后找
将资源加载进来后放到array这个数组里

解密函数

右键-编辑类-删除解密部分,直接返回数组 让他怎么进来就怎么出去

然后文件-保存模块!这步很重要 不然就白操作一通了

这么做的目的是因为c#不能直接调dll,而第二层是带混淆的,如果想调没有混淆的dll就需要进行资源替换。
然后开始调试,在第二层入口下了断点之后发现可读性更强了


解密资源名:


保存好后重新调试,进入第二层dll:
第二层的目的依旧是加载并解密资源,调用第三层


第二层各个函数的含义如下

我一开始如法炮制先dump第三层,再更换资源,然后删除解密资源部份,但是发现产生了异常,原因是第三层待解密的资源是bitmap图像形式的,而我dump出来的第三层模块是byte字节形式的。对资源的十六进制进行替换,也失败了。这一层有很多的switch case形式的垃圾语句,BabelDeobfuscator和de4dot对他都不起作用,除了硬着头皮调找invoke,没找到别的办法。
至此上半部分就结束了。
附件解压密码:pediy
1
、常用方法:pictureBox1.Image
=
Properties.Resources.Correct;
2
、使用 ResourceManager 类的方法(该样本中使用的就是此种方法):
1
)首先获取一个 ResourceManager 类的实例:
①ResourceManager resourceManager
=
newResourceManager(
"资源名称"
, Assembly.GetExecutingAssembly());
②ResourceManager resourceManager
=
newResourceManager(typeof(About));
/
/
此样本所采取的方法
③ResourceManager resourceManager
=
Properties.Resources.ResourceManager;
2
)通过 ResourceManager 类的 GetObject() 方法:
Object
target
=
resourceManager.GetObject(
"资源文件名"
);
3
、反射法
4
、资源文件读取类
1
、常用方法:pictureBox1.Image
=
Properties.Resources.Correct;
2
、使用 ResourceManager 类的方法(该样本中使用的就是此种方法):
1
)首先获取一个 ResourceManager 类的实例:
①ResourceManager resourceManager
=
newResourceManager(
"资源名称"
, Assembly.GetExecutingAssembly());
②ResourceManager resourceManager
=
newResourceManager(typeof(About));
/
/
此样本所采取的方法
[培训]科锐逆向工程师培训第53期2025年7月8日开班!