使用Appveyor构建VS项目-快速编译

倾旋
倾旋
技术分享|2023-7-23|最后更新: 2023-7-23|
type
status
date
slug
summary
tags
category
icon
password
URL

前言

📋
在工作中经常会看到一些做的比较好的C++开源项目,但是作者没有编写CI/CD去构建项目,发布Release版本的二进制文件,因此需要自己手动编译,但有时候又是临时的环境,还需要安装Visual Studio之类的IDE来构建,比较麻烦,因此appveyor可以支持各类语言的构建环境,只需要在网页上就可以发布二进制程序,解决了本地安装开发环境的痛点。

Appveyor简介

💡
AppVeyor是一家成立于2011年的私人持有的加拿大公司。
我们为Windows开发人员提供持续集成工具。该服务是免费提供给开源项目使用的,我们为私有项目提供订阅服务,并在客户现场提供AppVeyor企业安装服务。
迄今为止,已有超过50,000名开发人员使用了AppVeyor,并运行了超过1000万次构建。AppVeyor受到微软、谷歌、Facebook、Mozilla、Slack、GitHub等公司的信任。

构建Github项目

AppVeyor提供了它特有的配置文件用于声明构建动作,开发者可以通过编写AppVeyor配置文件来控制程序的发布流程。
 
这里只讨论没有AppVeyor配置文件的项目,以
etrace
goldshtnUpdated Aug 29, 2023
为例,etrace是一个命令行工具,用于实时跟踪 ETW 事件和 处理现有的 .etl 录制文件。它的灵感来自Microsoft ELT工具。
notion image
该项目没有AppVeyor配置文件,首先Fork这个项目到自己账户名下,然后访问https://www.appveyor.com/,以Github账户登录,并且授权读取此仓库。
notion image
在Github这一栏可以看到授权的仓库,点击 +ADD 就可以进入项目的构建配置界面:
notion image
由于这个项目是采用C#开发的,所以我们着重关注C#相关的配置:
notion image
在Before build script中输入如下命令,会在开始编译之前去下载这个项目所依赖的库:
💡
"nuget restore" 是NuGet命令行工具中的一个命令。它用于还原(restore)一个项目(project)所依赖的所有NuGet包(NuGet packages)。
在开发.NET应用程序时,通常会使用NuGet来管理项目所依赖的第三方库和组件。NuGet是.NET生态系统中最受欢迎的包管理器之一,它提供了一个中央存储库,开发人员可以从中获取各种软件包和库。
"nuget restore"命令会读取项目文件(.csproj或.vbproj)中的依赖关系,并下载或还原所需的NuGet包,以确保项目可以成功编译和构建。这个命令通常在CI/CD(持续集成/持续交付)过程中使用,以确保在构建项目之前,所有的依赖关系都被正确地还原和安装。
除此之外,还可以在环境配置中设置安装开发库的命令:
notion image
最后一步就是设置二进制文件打包了,点击artifacts,可以配置要打包的路径,必须是相对路径,C#的程序一般会将二进制文件生成到bin目录下,所以我这里就写:etrace\bin
notion image
保存后,回到项目页面,点击Start New Build就开始构建了:
notion image
稍微等待一下,就可以看到构建好的程序了,直接下载就可以使用。
notion image

使用AppVeyor构建Mimikatz

Mimikatz是gentilkiwi使用C语言开发的Windows安全工具,该工具有着丰富的功能,能过从内存中提取明文密码,哈希,PIN码和kerberos票据、哈希传递等等,随着越来越多的黑客滥用此工具进行一些非法活动,因此gentilkiwi每发布一个Release,Release中的Mimikatz样本就会被标记为黑客工具,这对红队带来了一些小麻烦,通过AppVeyor我们可以自动化的做一些静态特征处理,然后自动构建产生新的工具。
 
gentilkiwi已经在Mimikatz项目中内置了一个AppVeyor的配置文件,这个配置文件会随着项目改动自动触发AppVeyor的构建流程。
notion image
我们要做的就是先Fork一份Mimikatz到自己的项目中,然后开始修改AppVeyor配置文件:
notion image
这里我只是做了一个工作,就是将代码中的所有Mimikatz字符串替换为aabbcc,当然还可以做很多其它的替换操作。
其中替换图标的操作可以改为从互联网下载某个地址的图标,这里就不赘述了。
 
编译好的成品如下:
notion image
 
notion image

🥪总结

通过在线的CI/CD工具可以省去搭建环境的时间,由于CI/CD是事件触发的,每次改动都可以生成新的样本,相当于可以无限次的使用,若是有一些工具实在是非常敏感、静态特征多,可以像我这样写一个类似的批处理加入到CI/CD中做一些简单的对抗处理,本文仅仅是抛砖引玉,我相信还有更节约时间、更高效的方式。
 
©2021-2024 倾旋. All rights reserved.