Aegis is a library that allows you detect if your software is being debugged or not on Linux, FreeBSD, NetBSD, OpenBSD and Windows

Overview

Medusa by Caravaggio (1571-1610) / Public Domain

Aegis is a library that allows you detect if your software is being debugged or not on Linux, FreeBSD, NetBSD, OpenBSD and Windows. You can use it natively from C or use the Go bind.

The name is about a lousy acronym: An ELF's -g inspection signalling. If you are hooked on Greek mythology you should know that Aegis is the name of the shield gave by Athena to Perseus to help him kill Medusa. If you are using it from Windows understand as An Executable's -g inspection signalling ;)

On Windows we have plenty of ways to easily do this kind of detection. Opposingly, on Unix world we do not have any standard way. Aegis is an attempt of filling up this gap.

You can use Aegis as an anti-debugging mitigation or as a debugging facility. It just depends on you and your current requirements.

Originally, I wrote this library to use on another tool of mine called blackcat as an anti-debugging stuff.

Contents

How can I build it?

I am using a build tool of mine called Hefesto (Yes, mythology, I love it).

If you are looking for running the build in all its capabilities you need Hefesto otherwise I also supply a well-simple Makefile.

Back

How should I easily clone Aegis?

The easiest way is:

black-beard@QueensAnneRevenge:~/src# git clone https://github.com/rafael-santiago/aegis --recursive
black-beard@QueensAnneRevenge:~/src/aegis/src# _

Back

Building it by using Hefesto

After following all steps to put Hefesto to work on your system, just change to src sub-directory:

black-beard@QueensAnneRevenge:~/src/aegis# cd src
black-beard@QueensAnneRevenge:~/src/aegis/src# _

The hardest part: invoke Hefesto. Look:

black-beard@QueensAnneRevenge:~/src/aegis/src# hefesto
(...)
black-beard@QueensAnneRevenge:~/src/aegis/src# _

If all has occurred fine during your build, aegis library was built at ../lib sub-directory. Additionaly, test has ran and all samples was built at ../samples sub-directory.

Back

Poor man's build by using make

Well this will just build the library at ../lib. The clumsy idea here is: If all has compiled so all is working...

Change to src sub-directory:

black-beard@QueensAnneRevenge:~/src/aegis# cd src
black-beard@QueensAnneRevenge:~/src/aegis/src# _

Now it is just about calling make:

black-beard@QueensAnneRevenge:~/src/aegis/src# make
(...)
black-beard@QueensAnneRevenge:~/src/aegis/src# _

If you are on some BSD-like, besides make you also need gmake to run this limited alternative build.

On *BSD you can also invoke the poor man's build by running gmake.

Back

Making a distribution package

You can easily do it by invoking Hefesto passing the build option --mkdist:

black-beard@QueensAnneRevenge:~/src/aegis/src# hefesto --mkdist
black-beard@QueensAnneRevenge:~/src/aegis/src# _

Once done the distribution package will be at ../lib sub-directory. The package's name depends on your system. It will follow this nomenclature scheme: libaegis-.zip.

Back

How should I build Aegis Go stuff?

Go is a language with automagically build capabilities. Once inside package sub-directory (gopkg/vN) call go build -a or go test will do the job. For samples, once inside a sample directory run go build -a -o sample-name. It would be the poor man's build for Go.

If you are in a rush and looking for a more automated way of doing it. Inside src top-level sub-directory invoke Hefesto passing --gopkg build option:

black-beard@QueensAnneRevenge:~/src/aegis/src# hefesto --gopkg
(...)
black-beard@QueensAnneRevenge:~/src/aegis/src# _

After a successful build you will got the Go samples inside ../samples with their names prepended with golang-.

Back

Using Aegis

Aegis is a well-simple tiny library:

  • It only has one header called aegis.h.

  • It only has one library archive called libaegis.a.

Aegis brings you two features:

  • Detect debugging.

  • Protect against debugging by using our simpathetic Gorgon (yes, I know, Greek mythology again).

Remark: In order to make this anti-debug resilient against library hooking you always should link your software static. Moreover, if you want to keep eavesdroppers out as much as possible: link your software static. Otherwise there is no necessity of worrying about none of it. Because your front door is wide open or you do not have even a door! Haha!

Back

Debugging detection

In some bug hunting cases is useful to wait for debugger before continuing the program execution. Specially concurrent stuff or even event oriented processing. In this case you can use aegis_has_debugger() function.

This function returns 1 when a debugger has being attached otherwise 0.

The following program will wait for debugger before exiting:

#include <aegis.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

void sigint_watchdog(int signo) {
    printf("\nCanceled.\n");
    exit(1);
}

int main(int argc, char **argv) {
    signal(SIGINT, sigint_watchdog);
    signal(SIGTERM, sigint_watchdog);
    printf("*** Waiting for debug attachment (pid=%d)...\n", getpid());
    while (!aegis_has_debugger()) {
        usleep(1);
    }
    printf("*** Debugger is attached.\n");
    return 0;
}

The program above can be found at src/samples sub-directory under the name wait4debug.c. The manual compilation of this code is fairly simple and involves:

  • To indicate where aegis.h is found.
  • To indicate where libaegis.a is found.
  • To pass -laegis flag to linker.
  • To pass -lpthread flag if you are on Linux, FreeBSD, NetBSD or OpenBSD.

All in one compilation line:

black-beard@QueensAnneRevenge:~/src/aegis/src# cd samples
black-beard@QueensAnneRevenge:~/src/aegis/src/samples# gcc -I.. -L../../lib \
> wait4debug.c -owait4debug -laegis
black-beard@QueensAnneRevenge:~/src/aegis/src/samples# _

Back

Testing wait4debug

On a terminal run wait4debug:

black-beard@QueensAnneRevenge:~/src/aegis/src/samples# ./wait4debug
*** Wait for debug attachment (pid=29670)

wait4debug has facilitate the things for you by giving its pid. Now on another terminal run GDB as follows:

black-beard@QueensAnneRevenge:~# gdb attach 29670
(...)
(gdb)

You will attach to the wait4debug process, now let's continue on GDB:

black-beard@QueensAnneRevenge:~# gdb attach 29670
(...)
(gdb) continue
Continuing.
[Inferior 1 (process 29670) exited normally]
(gdb)

Nice, the program has exited. If you back to your wait4debug terminal you will see something like:

black-beard@QueensAnneRevenge:~/src/aegis/src/samples# ./wait4debug
*** Wait for debug attachment (pid=29670)
*** Debugger is attached.
black-beard@QueensAnneRevenge:~/src/aegis/src/samples# _

Back

Debugging mitigation

Certain programs require some debugging avoidance. Aegis features a nice and straightforward way to implement this kind of mitigation. For doing that you need:

  • To implement a exit checking function with the prototype: int(void *). A return different from zero means that gorgon should exit.
  • If necessary to implement a on debugger function with the prototype: void(void *). This function will be called when a debugger is detected.
  • To call aegis_set_gorgon() passing your exit checking function and its argument pointer, besides on debugger function and its argument pointer.

Take a look at the following code to get more details about:

/*
 * Copyright (c) 2020, Rafael Santiago
 * All rights reserved.
 *
 * This source code is licensed under the BSD-style license found in the
 * LICENSE file in the root directory of this source tree.
 */
#include <aegis.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
#include <signal.h>

int bye = 0;

void sigint_watchdog(int signo) {
    bye = 1;
}

int disable_gorgon(void *args) {
    return (*(int *)args);
}

void on_debugger(void *args) {
    fprintf(stdout, "\ninfo: debugger detected.\n");
    exit(1);
}

int main(int argc, char **argv) {
    signal(SIGINT, sigint_watchdog);
    signal(SIGTERM, sigint_watchdog);
    if (aegis_set_gorgon(disable_gorgon, &bye, on_debugger, NULL) != 0) {
        fprintf(stderr, "error: unable to set gorgon.\n");
        exit(1);
    }

    fprintf(stdout, "info: process started (pid=%d)...\n", getpid());
    while (!bye) {
        usleep(2);
    }

    fprintf(stdout, "\ninfo: gracefully exiting, no debugger was detected.\n");

    return 0;
}

You can find the presented code into src/samples/setgorgon.c.

When on debugger function was passed as NULL. It asks aegis to use its default on debugger function. This default callback is only about calling exit(1). Thus, after a debugger detection, the process will immediately exit. There are some cases that you need to do something before exiting, for those cases on debugger function would be handy. Anyway, once a debugger attached, the best action is terminate the process as soon as possible or try to kill the debugger.

Back

Testing setgorgon

On a terminal run setgorgon

black-beard@QueensAnneRevenge:~/src/aegis/src/samples# ./setgorgon
info: process started (pid=28582)...

Now let's only press ctrl + c:

black-beard@QueensAnneRevenge:~/src/aegis/src/samples# ./setgorgon
info: process started (pid=28582)...
^C
info: gracefully exiting, no debugger was detected.
black-beard@QueensAnneRevenge:~/src/aegis/src/samples# _

Nice but what about give debugging a try? Let's run it again:

black-beard@QueensAnneRevenge:~/src/aegis/src/samples# ./setgorgon
info: process started (pid=14753)...

On another terminal let's attach GDB:

black-beard@QueensAnneRevenge:~# gdb attach 14753
(...)
(gdb) _

Now, still on GDB continue the setgorgon process:

black-beard@QueensAnneRevenge:~# gdb attach 14753
(...)
(gdb) continue
Continuing.
[Thread 0x7f47880ec700 (LWP 14754) exited]
[Inferior 1 (process 14753) exited with code 01]
(gdb) _

No chance for our debugging attempt, let's go back to our setgorgon's terminal:

black-beard@QueensAnneRevenge:~/src/aegis/src/samples# ./setgorgon
info: process started (pid=14753)...

info: debugger detected.
black-beard@QueensAnneRevenge:~/src/aegis/src/samples# _

No gracefully exiting message, it was really aborted to avoid debugging. Our gorgon has done her job.

Maybe you are asking why call this feature of Gorgon. Well, Perseus myth tells that Athena gave him a shield (aegis) for help him to kill Medusa (also known as Gorgon).Perseus has killed her using aegis. By watching for her reflection in the shield he used the sword (also given by Athena) to chop off Medusa's head. After that Athena has picked aegis back and in memory of Medusa, Athena put Medusa's head in this shield.

Ancient greeks had used to sculpt or even drawn Gorgon heads at the front door of their houses in order to scare enemies, bad people, bad things and stuff. Maybe it could be the origin of the Medusa's myth, who knows...

Well, that is it, here we are using gorgon to scare debuggers! That's all folks!

;)

Back

Aegis from Go

I have decided to make an Aegis' Go bind because I am watching many applications related to information security being written mainly on Go, showing up during these years (2020). Who knows this bind can be useful for somebody somewhere over a concurrent multiplatform goroutine rainbow... Go is also my second best programming language so I have done it for fun, too. It was a good excuse for using Cgo.

Basically, you need to import aegis package from this repo:

import (
    "github.com/rafael-santiago/aegis/gopkg"
)

After you will define in your go.mod the following:

(...)
replace github.com/rafael-santiago/aegis/gopkg => github.com/rafael-santiago/aegis/gopkg/v1
(...)

You can also host it as a local package (no problem). Take a look how it can be done by taking a look at go.mod from Go samples (gopkg/samples).

This replace trick will allow you use Aegis' future releases without needing be noisy into your own related code. Renaming packages and all those MacGyver-like incantations, ready to go...

The usage of Aegis on Go is almost the same of its usage in C. Follow on reading if you are interested on it.

Back

wait4debug on Go

I am taking into consideration that you have already followed my notes about wait4debug C sample. Doing it on Go is quite straightforward, too. It is only about testing the attachment state by calling aegis.HasDebugger() oracle function, look:

//
// Copyright (c) 2020, Rafael Santiago
// All rights reserved.
//
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree.
//
package main

import (
	"fmt"
	"github.com/rafael-santiago/aegis/gopkg"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main() {
	go func() {
		sigintWatchdog := make(chan os.Signal, 1)
		signal.Notify(sigintWatchdog, os.Interrupt)
		signal.Notify(sigintWatchdog, syscall.SIGINT|syscall.SIGTERM)
		<-sigintWatchdog
		fmt.Fprintf(os.Stdout, "\rinfo: ctrl + C received. Aborted.\n")
		os.Exit(1)
	}()
	fmt.Fprintf(os.Stdout, "info: Waiting for debug attachment (pid=%d)...\n",
		os.Getpid())
	for !aegis.HasDebugger() {
		time.Sleep(1 * time.Nanosecond)
	}
	fmt.Fprintf(os.Stdout, "\rinfo: Debug detected. Go home!\n")
}

The program will wait for a user's Ctrl + c interruption or for a debugger attaching. It is always important to sleep for some time interval, otherwise you will busy the main thread and cause starvation on other threads.

Back

What about a Gopher Gorgon?

Well, if you have some artistic inclination and want to make a Medusa-like gopher to put here I would be thankful haha!

Anyway, use Aegis Gorgon in Go is pretty straightforward, too. You just call aegis.SetGorgon(). Take a look:

:P go aegis.SetGorgon(shouldExit, exit, nil, nil) // INFO(Rafael): All your sensitive instructions not suitable for // eavesdroppers would go here. On some requirements you will need // to flush some buffers, files and stuff before exiting. For those // cases you would pass your custom OnDebugger and OnDebuggerArgs // to Aegis' Gorgon. <-exit } ">
//
// Copyright (c) 2020, Rafael Santiago
// All rights reserved.
//
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree.
//
package main

import (
	"fmt"
	"github.com/rafael-santiago/aegis/gopkg"
	"os"
	"os/signal"
	"syscall"
	"time"
)

// INFO(Rafael): This function flags for aegis.SetGorgon() if it is time to stop watching and exit.
func shouldExit(exit interface{}) bool {
	exitChan := exit.(chan bool)
	var should bool = false
	timeout := time.Tick(1 * time.Nanosecond)
	select {
	case should = <-(exitChan):
	case <-timeout:
	}
	return should
}

func main() {
	exit := make(chan bool, 1)
	go func(exit chan<- bool) {
		sigintWatchdog := make(chan os.Signal, 1)
		signal.Notify(sigintWatchdog, os.Interrupt)
		signal.Notify(sigintWatchdog, syscall.SIGINT|syscall.SIGTERM)
		<-sigintWatchdog
		exit <- true
		fmt.Fprintf(os.Stdout,
			"\rinfo: ctrl + c received from the user. Exiting...\n")
	}(exit)
	fmt.Fprintf(os.Stdout, "info: process started (pid=%d)...\n", os.Getpid())
	// INFO(Rafael): Let's be less ambitious here. We will just pass our
	//               gracefully exit check function and its argument.
	//               OnDebugger and OnDebuggerArgs will be null, with this
	//               we will use the default Aegis' on debugger function
	//               that is only about a gross os.Exit(1) >:P
	go aegis.SetGorgon(shouldExit, exit, nil, nil)
	// INFO(Rafael): All your sensitive instructions not suitable for
	// eavesdroppers would go here. On some requirements you will need
	// to flush some buffers, files and stuff before exiting. For those
	// cases you would pass your custom OnDebugger and OnDebuggerArgs
	// to Aegis' Gorgon.
	<-exit
}

The program will run until detecting a debugger be attached or being asked for gracefully exiting through a ctrl + C.

Back

Contributors

The following table lists all project's contributors until now.

GitHub profile Who Contact Contributions
Rafael Santiago /dev/null Initial idea, C library, initial cgo-bind, current maintainer.

Back

You might also like...
ide-gen is a tool for development workspace prepare automation by automatic VCS repositories discovery and clone and project generation for supported IDEs.

ide-gen is a tool for development workspace prepare automation by automatic VCS repositories discovery and clone and project generation for supported IDEs.

Download, build, cache and run a Go app easily.

demand -- An easy way to install apps demand will download, build, cache and run a Go app. You can use it as an interpreter. Create a file bytes2human

A program to build, run, and restart a Go program on code change

devrun A program to build, run, and restart a Go program on code change. It also supports watching all your Go imports too. So if you change the code

  Yet another Go REPL that works nicely. Featured with line editing, code completion, and more.
Yet another Go REPL that works nicely. Featured with line editing, code completion, and more.

gore Yet another Go REPL that works nicely. Featured with line editing, code completion, and more. (Screencast taken with cho45/KeyCast) Usage gore Af

cmd tool for automatic storage and comparison of benchmarks results

prettybenchcmp prettybenchcmp is cmd tool for storage and comparison of benchmarks results. There is a standard tool benchcmp, but I don't think that

Docker For Go Application Packaging And Pushing To Docker Hub

DOCKER-FOR-GO-APPLICATION-PACKAGING-AND-PUSHING-TO-DOCKER-HUB ##DOCKER COMMANDS: (Don't forget to navigate to the directory that contains the app and

Template project to get started with a simple API skeleton in Go and Docker

A template project to create a Docker image for a Go application. The example application exposes an HTTP endpoint through a REST API packaged as a static binary.

A simple application to show how to use dd-trace-go's tracer and profiler.

dd-trace-go-demo A simple application to show how to use dd-trace-go's tracer and profiler. Usage To run this demo application, simply clone this repo

Aegis - Implementation of AEGIS-128L and AEGIS-256 AEAD algorithms.

Aegis - Implementation of AEGIS-128L and AEGIS-256 AEAD algorithms.

Aegis To KeePass - A simple tool to convert exported (and encrypted) Aegis database to standalone KeePass

ATP - Aegis to KeePass A simple tool to convert exported (and encrypted) Aegis d

Qt binding for Go (Golang) with support for Windows / macOS / Linux / FreeBSD / Android / iOS / Sailfish OS / Raspberry Pi / AsteroidOS / Ubuntu Touch / JavaScript / WebAssembly

Introduction Qt is a free and open-source widget toolkit for creating graphical user interfaces as well as cross-platform applications that run on var

A Go package for sending and receiving ethernet frames. Currently supporting Linux, Freebsd, and OS X.

ether ether is a go package for sending and receiving ethernet frames. Currently supported platform: BPF based OS X FreeBSD AF_PACKET based Linux Docu

Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices
Agent-less vulnerability scanner for Linux, FreeBSD, Container, WordPress, Programming language libraries, Network devices

Vuls: VULnerability Scanner Vulnerability scanner for Linux/FreeBSD, agent-less, written in Go. We have a slack team. Join slack team Twitter: @vuls_e

Allows you to use the magic remote on your webOS LG TV as a keyboard/mouse for your Linux machine

magic4linux Allows you to use the magic remote on your webOS LG TV as a keyboard/mouse for your PC Linux machine. This is a Linux implementation of th

The GOP Server is an open-source web server for Linux and Windows systems that handles HTTP  requests to scripts programmed in Go returning the result of the execution to the client. The  software is able to, depending on the requested path, return static files or execute Go scripts,  which are compiled on the fly and have specific functionality.
An example desktop system tray application that can launch HTML5 windows. Go source with a build process for Windows, Mac and Linux.

ExampleTrayGUI An example cross-platform (Mac, Windows, Linux) system tray application that can launch HTML5 windows, developed in Go including functi

An example desktop system tray application that can launch HTML5 windows. Go source with a build process for Windows, Mac and Linux.

ExampleTrayGUI An example cross-platform (Mac, Windows, Linux) system tray application that can launch HTML5 windows, developed in Go including functi

An example desktop system tray application that can launch HTML5 windows. Go source with a build process for Windows, Mac and Linux.

An example cross-platform (Mac, Windows, Linux) system tray application that can launch HTML5 windows, developed in Go including functional build process. This repository is intended as a quick reference to help others start similar projects using the referenced libraries and will not be actively maintained.

An example desktop system tray application that can launch HTML5 windows. Go source with a build process for Windows, Mac and Linux.

ExampleTrayGUI An example cross-platform (Mac, Windows, Linux) system tray application that can launch HTML5 windows, developed in Go including functi

Comments
  • signal arrived during external code execution

    signal arrived during external code execution

    i complied it on my PC, it working as well, but can not run on others PC

    E:\test>main2 Exception 0xc0000005 0x1 0x7ff66669e000 0x29a2fac6189 PC=0x29a2fac6189 signal arrived during external code execution

    
    runtime.cgocall(0x7ff6662355c0, 0xc000036ee0)
            runtime/cgocall.go:156 +0x4a fp=0xc0000cfd28 sp=0xc0000cfcf0 pc=0x7ff6661d472a
    syscall.Syscall(0x29a08cc0000, 0x0, 0x0, 0x0, 0x0)
            runtime/syscall_windows.go:479 +0xf4 fp=0xc0000cfd60 sp=0xc0000cfd28 pc=0x7ff666230214
    syscall.Syscall(0xc0000d97d0, 0xc00000c918, 0x3, 0x3, 0x7ff6663f9ae0)
            <autogenerated>:1 +0x2b fp=0xc0000cfdb0 sp=0xc0000cfd60 pc=0x7ff66623646b
    main.frKGmicM({0xc0001ac500, 0x4d4})
            AL2ywal3.go:1 +0x41f fp=0xc0000cff28 sp=0xc0000cfdb0 pc=0x7ff6663d9bbf
    main.main()
            qfQboakE.go:1 +0x17d fp=0xc0000cff80 sp=0xc0000cff28 pc=0x7ff6663db39d
    runtime.main()
            runtime/proc.go:255 +0x217 fp=0xc0000cffe0 sp=0xc0000cff80 pc=0x7ff666208f37
    runtime.goexit()
            runtime/asm_amd64.s:1581 +0x1 fp=0xc0000cffe8 sp=0xc0000cffe0 pc=0x7ff666233d61
    
    goroutine 9 [chan receive]:
    main.main.func2(0x0)
            GKVzJ9sN.go:2 +0xa6
    created by main.main
            EDfnoW0i.go:4 +0xea
    
    goroutine 24 [syscall]:
    os/signal.signal_recv()
            runtime/sigqueue.go:169 +0x98
    os/signal.loop()
            os/signal/signal_unix.go:24 +0x19
    created by os/signal.Notify.func1.1
            os/signal/signal.go:151 +0x2c
    
    goroutine 7 [IO wait]:
    internal/poll.runtime_pollWait(0x29a2ddea728, 0x72)
            runtime/netpoll.go:229 +0x89
    internal/poll.(*pollDesc).wait(0xb82282369d85d2ff, 0x8c52ccb7c05858db, 0x0)
            internal/poll/fd_poll_runtime.go:84 +0x32
    internal/poll.execIO(0xc0000d4f18, 0x7ff6664b0108)
            internal/poll/fd_windows.go:175 +0xe5
    internal/poll.(*FD).Read(0xc0000d4f00, {0xc0001ba000, 0x3e1c, 0x3e1c})
            internal/poll/fd_windows.go:441 +0x25f
    net.(*netFD).Read(0xc0000d4f00, {0xc0001ba000, 0x7ff66663f640, 0xc0001257a8})
            net/fd_posix.go:56 +0x29
    net.(*conn).Read(0xc000006010, {0xc0001ba000, 0x0, 0xc0001257f0})
            net/net.go:183 +0x45
    crypto/tls.(*atLeastReader).Read(0xc00009e2d0, {0xc0001ba000, 0x0, 0x7ff6661da3cd})
            crypto/tls/conn.go:777 +0x3d
    bytes.(*Buffer).ReadFrom(0xc00004a278, {0x7ff6664f6e60, 0xc00009e2d0})
            bytes/buffer.go:204 +0x98
    crypto/tls.(*Conn).readFromUntil(0xc00004a000, {0x29a2de20008, 0xc000006010}, 0x0)
            crypto/tls/conn.go:799 +0xe5
    crypto/tls.(*Conn).readRecordOrCCS(0xc00004a000, 0x0)
            crypto/tls/conn.go:606 +0x112
    crypto/tls.(*Conn).readRecord(...)
            crypto/tls/conn.go:574
    crypto/tls.(*Conn).Read(0xc00004a000, {0xc00019d000, 0x1000, 0x8010001})
            crypto/tls/conn.go:1277 +0x16f
    bufio.(*Reader).Read(0xc0001984e0, {0xc000184498, 0x9, 0xc000125d30})
            bufio/bufio.go:227 +0x1b4
    io.ReadAtLeast({0x7ff6664f6d80, 0xc0001984e0}, {0xc000184498, 0x9, 0x9}, 0x9)
            io/io.go:328 +0x9a
    io.ReadFull(...)
            io/io.go:347
    net/http.http2readFrameHeader({0xc000184498, 0x9, 0xc0000d9ec0}, {0x7ff6664f6d80, 0xc0001984e0})
            net/http/h2_bundle.go:1553 +0x6e
    net/http.(*http2Framer).ReadFrame(0xc000184460)
            net/http/h2_bundle.go:1811 +0x95
    net/http.(*http2clientConnReadLoop).run(0xc000125fa0)
            net/http/h2_bundle.go:8428 +0x165
    net/http.(*http2ClientConn).readLoop(0xc000048180)
            net/http/h2_bundle.go:8350 +0x79
    created by net/http.(*http2Transport).newClientConn
            net/http/h2_bundle.go:7302 +0xb45
    rax     0x0
    rbx     0x29a2fac603e
    rcx     0x4c000
    rdi     0x7ff66669e000
    rsi     0xcc000c
    rbp     0xbb51bff850
    rsp     0xbb51bff750
    r8      0x1e7
    r9      0x5d
    r10     0x17
    r11     0x246
    r12     0xc0000cfd10
    r13     0x0
    r14     0xbb51bff9b0
    r15     0x6
    rip     0x29a2fac6189
    rflags  0x10246
    cs      0x33
    fs      0x53
    gs      0x2b
    
    not-a-bug 
    opened by Phuong39 2
Releases(v2)
  • v2(Aug 22, 2021)

  • v1(Dec 27, 2020)

    V1

    Features:

    • General debugger detection function: aegis_has_debugger().
    • Debugging avoidance function: aegis_set_gorgon().
    • Supported platforms: Linux, FreeBSD, NetBSD, OpenBSD and Windows.
    • Golang bind.

    Bugfixes:

    • None! 🥇
    [git-tag: v1]
    Source code(tar.gz)
    Source code(zip)
Owner
Rafael Santiago
🎶"No fire, no gun, no rope, no stone BUGS won't die, ah..." 🐞
Rafael Santiago
A tool that helps you write code in your favorite IDE: your word processor!

WordIDE Have you ever wondered: How would it feel like to write code in a word processor? Me neither. But after months minutes of planning, I present

unsafecast 35 Jul 21, 2022
A node.js version management utility for Windows. Ironically written in Go.

The npm/Microsoft/Google recommended Node.js version manager for Windows. This is not the same thing as nvm. The original nvm is a completely separate

Corey Butler 25.1k Jan 2, 2023
A small tool that allows a process to ask a debugger to attach to it.

Client and server for a process to request attach by gdlv. These two packages allow a program to request that a debugger attach to it. The motivating

David Chase 0 Feb 1, 2022
Will autobuild and kill/relaunch the target when you update the code.

Use like rerun github.com/skelterjohn/go.uik/uiktest Usage: rerun [--test] [--build] [--race] [--no-run] <import path> [arg]* For any go executable in

John Asmuth 258 Jul 23, 2022
golang feature toggle library - a library to help make golang feature toggling clean and easy

toggle supports env_variable backed toggling. It can also be updated via a pubsub interface (tested w/ redis) 2 engines for toggle backing are include

John Calabrese 24 Mar 29, 2022
🔥 Continuous profiling platform — debug performance issues in your code!

Pyroscope is an open source continuous profiling platform.

Pyroscope 6.9k Jan 7, 2023
NoColor — validate the architecture of your PHP project

NoColor is an architecture validation tool based on the concept of colored functions. This concept was originally invented for KPHP and later exposed as a separate tool to be used in regular PHP projects.

VK.com 149 Nov 28, 2022
Martian is a library for building custom HTTP/S proxies

Martian Proxy Martian Proxy is a programmable HTTP proxy designed to be used for testing. Martian is a great tool to use if you want to: Verify that a

Google 1.8k Dec 31, 2022
(Experimental) Go library for multi-platform clipboard.

clipboard This is a multi-platform clipboard library in Go. Abstract This is clipboard library in Go, which runs on multiple platforms. External clipb

Tsuji Daishiro 67 Nov 20, 2022
Go structure annotations that supports encoding and decoding; similar to C-style bitfields. Supports bitfield packing, self-describing layout parameters, and alignment.

STRUCTure EXtensions structex provides annotation rules that extend Go structures for implementation of encoding and decoding of byte backed data fram

Hewlett Packard Enterprise 54 Oct 13, 2022