diff --git a/Makefile b/Makefile index 0e17ade..5fa14a1 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ CC=go -BUILD=build -v +BUILD=build -v -trimpath GCFLAGS=-gcflags '-e' LDFLAGS=-ldflags '-s -w' PROGRAM=duckycode diff --git a/README.md b/README.md index 8013ca3..1a4c2cd 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,13 @@ # Rubber-Ducky Encoder written in Go +## Usage +Encode an example: + +``` +./duckycode -f examples/linux.txt -l de +``` + +Now copy the file `inject.bin` to your microSD card. + +Happy Hacking. diff --git a/go.mod b/go.mod index e2f085e..510970b 100644 --- a/go.mod +++ b/go.mod @@ -1 +1,3 @@ module git.giftfish.de/ston1th/duckycode + +go 1.15 diff --git a/language/ru.properties.ascii b/language/ru.properties.ascii new file mode 100644 index 0000000..1bc124f --- /dev/null +++ b/language/ru.properties.ascii @@ -0,0 +1,113 @@ +//Russian Key Map +//http://www.charset.org/charactersets.php?charset=iso-8859-5 +// Needs work likely to contain errors +// +//Example mapping the Portugeuse charset +//ISO_8859_1_E7 = KEY_SEMICOLON + +// 32 +ASCII_20 = KEY_SPACE + +//numbers +//?1234567890-? +//?!"GBP$%<<>>*()_? +ISO_8859_5_F1 = KEY_TILDE +ISO_8859_5_A1 = KEY_TILDE, MODIFIERKEY_SHIFT +ISO_8859_5_31 = KEY_1 +ISO_8859_5_21 = KEY_1, MODIFIERKEY_SHIFT +ISO_8859_5_32 = KEY_2 +ISO_8859_5_22 = KEY_2, MODIFIERKEY_SHIFT +ISO_8859_5_33 = KEY_3 +ISO_8859_5_23 = KEY_3, MODIFIERKEY_SHIFT +ISO_8859_5_34 = KEY_4 +ISO_8859_5_24 = KEY_4, MODIFIERKEY_SHIFT +ISO_8859_5_35 = KEY_5 +ISO_8859_5_25 = KEY_5, MODIFIERKEY_SHIFT +ISO_8859_5_36 = KEY_6 +ISO_8859_5_26 = KEY_6, MODIFIERKEY_SHIFT +ISO_8859_5_37 = KEY_7 +ISO_8859_5_27 = KEY_7, MODIFIERKEY_SHIFT +ISO_8859_5_38 = KEY_8 +ISO_8859_5_2A = KEY_8, MODIFIERKEY_SHIFT +ISO_8859_5_39 = KEY_9 +ISO_8859_5_28 = KEY_9, MODIFIERKEY_SHIFT +ISO_8859_5_30 = KEY_0 +ISO_8859_5_29 = KEY_0, MODIFIERKEY_SHIFT +ISO_8859_5_2D = KEY_MINUS +ISO_8859_5_5F = KEY_MINUS, MODIFIERKEY_SHIFT +ISO_8859_5_CA = KEY_EQUALS +ISO_8859_5_EA = KEY_EQUALS, MODIFIERKEY_SHIFT + +//letters - 1st row +//???????????? +//???????????? +ISO_8859_5_CF = KEY_Q, MODIFIERKEY_SHIFT +ISO_8859_5_EF = KEY_Q +ISO_8859_5_C8 = KEY_W, MODIFIERKEY_SHIFT +ISO_8859_5_E8 = KEY_W +ISO_8859_5_B5 = KEY_E, MODIFIERKEY_SHIFT +ISO_8859_5_D5 = KEY_E +ISO_8859_5_C0 = KEY_R, MODIFIERKEY_SHIFT +ISO_8859_5_E0 = KEY_R +ISO_8859_5_C2 = KEY_Y, MODIFIERKEY_SHIFT +ISO_8859_5_E2 = KEY_Y +ISO_8859_5_CB = KEY_U, MODIFIERKEY_SHIFT +ISO_8859_5_EB = KEY_U +ISO_8859_5_C3 = KEY_I, MODIFIERKEY_SHIFT +ISO_8859_5_E3 = KEY_I +ISO_8859_5_B8 = KEY_O, MODIFIERKEY_SHIFT +ISO_8859_5_D8 = KEY_O +ISO_8859_5_BE = KEY_P, MODIFIERKEY_SHIFT +ISO_8859_5_DE = KEY_P +ISO_8859_5_CE = KEY_LEFT_BRACE, MODIFIERKEY_SHIFT +ISO_8859_5_EE = KEY_LEFT_BRACE +ISO_8859_5_C9 = KEY_RIGHT_BRACE, MODIFIERKEY_SHIFT +ISO_8859_5_E9 = KEY_RIGHT_BRACE + +//2nd row +//???????????No +//???????????~ +ISO_8859_5_B0 = KEY_A, MODIFIERKEY_SHIFT +ISO_8859_5_D0 = KEY_A +ISO_8859_5_C1 = KEY_S, MODIFIERKEY_SHIFT +ISO_8859_5_E1 = KEY_S +ISO_8859_5_B4 = KEY_D, MODIFIERKEY_SHIFT +ISO_8859_5_D4 = KEY_D +ISO_8859_5_B3 = KEY_G, MODIFIERKEY_SHIFT +ISO_8859_5_D3 = KEY_G +ISO_8859_5_B9 = KEY_J, MODIFIERKEY_SHIFT +ISO_8859_5_D9 = KEY_J +ISO_8859_5_BA = KEY_K, MODIFIERKEY_SHIFT +ISO_8859_5_DA = KEY_K +ISO_8859_5_BB = KEY_L, MODIFIERKEY_SHIFT +ISO_8859_5_DB = KEY_L +ISO_8859_5_CC = KEY_COLON, MODIFIERKEY_SHIFT +ISO_8859_5_EC = KEY_COLON +ISO_8859_5_B6 = KEY_QUOTE, MODIFIERKEY_SHIFT +ISO_8859_5_D6 = KEY_QUOTE +ISO_8859_5_F0 = KEY_BACKSLASH, MODIFIERKEY_SHIFT +ISO_8859_5_7E = KEY_BACKSLASH + +//3rd row +//???????,./ +//???????;:? +ISO_8859_5_B7 = KEY_Z, MODIFIERKEY_SHIFT +ISO_8859_5_D7 = KEY_Z +ISO_8859_5_C5 = KEY_X, MODIFIERKEY_SHIFT +ISO_8859_5_E5 = KEY_X +ISO_8859_5_C6 = KEY_C, MODIFIERKEY_SHIFT +ISO_8859_5_E6 = KEY_C +ISO_8859_5_B2 = KEY_V, MODIFIERKEY_SHIFT +ISO_8859_5_D2 = KEY_V +ISO_8859_5_B1 = KEY_B, MODIFIERKEY_SHIFT +ISO_8859_5_D1 = KEY_B +ISO_8859_5_BD = KEY_N, MODIFIERKEY_SHIFT +ISO_8859_5_DD = KEY_N +ISO_8859_5_BC = KEY_M, MODIFIERKEY_SHIFT +ISO_8859_5_DC = KEY_M +ISO_8859_5_2C = KEY_COMMA, MODIFIERKEY_SHIFT +ISO_8859_5_3B = KEY_COMMA +ISO_8859_5_2E = KEY_PERIOD, MODIFIERKEY_SHIFT +ISO_8859_5_3A = KEY_PERIOD +ISO_8859_5_2F = KEY_SLASH, MODIFIERKEY_SHIFT +ISO_8859_5_3F = KEY_SLASH diff --git a/language/ru.properties b/language/ru.properties.orig similarity index 100% rename from language/ru.properties rename to language/ru.properties.orig diff --git a/main.go b/main.go index fff2ed1..13a145e 100644 --- a/main.go +++ b/main.go @@ -25,7 +25,7 @@ func fatal(v interface{}) { } func main() { - flag.StringVar(&language, "l", "de", "language (available: be, br, ca, ch, de, dk, es, fi, fr, gb, hr, it, no, pt, ru, si, sv, tr, us)") + flag.StringVar(&language, "l", "de", "language (available: be, br, ca, ch, de, dk, es, fi, fr, gb, hr, it, no, pt, si, sv, tr, us)") flag.StringVar(&inFile, "f", "", "input file") flag.StringVar(&outFile, "o", "inject.bin", "output file (use - for stdout)") flag.Parse() @@ -45,7 +45,10 @@ func main() { fatal(err) } } - e := encoder.NewEncoder(out, "de") + e, err := encoder.NewEncoder(out, language) + if err != nil { + fatal(err) + } err = e.Encode(in) if err != nil { fatal(err) diff --git a/pkg/encoder/encoder.go b/pkg/encoder/encoder.go index 24d93f6..cd1ef47 100644 --- a/pkg/encoder/encoder.go +++ b/pkg/encoder/encoder.go @@ -21,11 +21,9 @@ type Encoder struct { repeat bool } -func NewEncoder(w io.Writer, language string) *Encoder { - if language == "" { - language = "de" - } - return &Encoder{w, language, 0, false, 0, false} +func NewEncoder(w io.Writer, language string) (*Encoder, error) { + err := lang.Exists(language) + return &Encoder{w, language, 0, false, 0, false}, err } func (e *Encoder) Encode(r io.Reader) (err error) { diff --git a/pkg/encoder/encoder_test.go b/pkg/encoder/encoder_test.go index ec8f668..69fd301 100644 --- a/pkg/encoder/encoder_test.go +++ b/pkg/encoder/encoder_test.go @@ -15,7 +15,11 @@ REM Hello World `) out = new(bytes.Buffer) ) - err := NewEncoder(out, "de").Encode(in) + e, err := NewEncoder(out, "de") + if err != nil { + t.Error(err) + } + err = e.Encode(in) if err != nil { t.Error(err) } @@ -34,7 +38,11 @@ STRING Hello World 0x12, 0x0, 0x2c, 0x0, 0x1a, 0x2, 0x12, 0x0, 0x15, 0x0, 0xf, 0x0, 0x7, 0x0} ) - err := NewEncoder(out, "de").Encode(in) + e, err := NewEncoder(out, "de") + if err != nil { + t.Error(err) + } + err = e.Encode(in) if err != nil { t.Error(err) } @@ -68,7 +76,11 @@ STRING Hello World 0xf, 0x0, 0x12, 0x0, 0x2c, 0x0, 0x1a, 0x2, 0x12, 0x0, 0x15, 0x0, 0xf, 0x0, 0x7, 0x0} ) - err := NewEncoder(out, "de").Encode(in) + e, err := NewEncoder(out, "de") + if err != nil { + t.Error(err) + } + err = e.Encode(in) if err != nil { t.Error(err) } @@ -77,6 +89,18 @@ STRING Hello World } } +func TestError(t *testing.T) { + out := new(bytes.Buffer) + _, err := NewEncoder(out, "") + if err == nil { + t.Error("language '' should not be supported") + } + _, err = NewEncoder(out, "fizzbuzz") + if err == nil { + t.Error("language 'fizzbuzz' should not be supported") + } +} + func BenchmarkExample(b *testing.B) { var in = bytes.NewBufferString(` REM Type Hello World into Windows notepad. Target: Windows 95 and beyond. Author: Darren @@ -88,7 +112,10 @@ ENTER DELAY 1000 STRING Hello World `) - e := NewEncoder(ioutil.Discard, "de") + e, err := NewEncoder(ioutil.Discard, "de") + if err != nil { + b.Error(err) + } b.ReportAllocs() for i := 0; i < b.N; i++ { e.Encode(in) diff --git a/pkg/lang/lang.go b/pkg/lang/lang.go index d88fa88..66d565b 100644 --- a/pkg/lang/lang.go +++ b/pkg/lang/lang.go @@ -2,6 +2,8 @@ package lang +import "errors" + var L = make(map[string]Lang) type Lang map[string]Key @@ -10,3 +12,10 @@ type Key struct { Key byte Mod byte } + +func Exists(l string) error { + if _, ok := L[l]; !ok { + return errors.New("language '" + l + "' is not supported") + } + return nil +} diff --git a/pkg/lang/ru.go b/pkg/lang/ru.go deleted file mode 100644 index d82078d..0000000 --- a/pkg/lang/ru.go +++ /dev/null @@ -1,11 +0,0 @@ -package lang - -import "git.giftfish.de/ston1th/duckycode/pkg/keys" - -func init() { - L["ru"] = ru -} - -var ru = Lang{ - "Binary": Key{keys.K["file"], keys.K["language/ru.properties"]}, -}