准备工作
- 安装msys2 对c进行编译
go里面嵌入c
- go支持在编译时对注释进行编译,支持多种语言的注释编译
- cgo 可以go代码调用c或者c调用go,如果先要使用go的垃圾回收和内存管理,需要在go中申请内存,传给c,除非使用free(), 不然不会对内存进行释放,使用defer可以确保go中引用的所有c内存都会进行垃圾回收
c调go
- 将go编译到一个归档文件中,然后c将归档文件编译到dll中
- 需要先将go编译成插件 go build -buildmode=c-archive 会生成一个.a文件
- gcc -lpthread .\main.c .\main.a 生成exe
- gcc -shared -pthread -o x.dll .\main.c .\main.a 生成dll
go-hack\cgo\shellcode> .\a.exe
go
使用sRDI(git上搜索)可以将dll转化为shellcode
使用PowerSploit实现shellcode注入
// go调用c
package main
// go调用c,会弹出一个框
/*
#include <stdio.h>
#include <windows.h>
void box(){
MessageBox(0,"ddd","aa",MB_OK);
}
*/
import "C"
func main() {
C.box()
}
// c调用go
// main.go
package main
import (
"C"
"fmt"
)
// 下面的注释代表导出一个函数叫Start
//export Start
func Start() {
fmt.Println("go")
}
// main为空即可
func main() {}
// main.c
#include "main.h"
void (*table[1]) = {Start};
void main(){
Start();
}
网友评论