项目作者: kaftejiman

项目描述 :
A modular Go source code level control flow obfuscator, made in Go.
高级语言: Go
项目地址: git://github.com/kaftejiman/ejja.git
创建时间: 2021-02-22T17:35:01Z
项目社区:https://github.com/kaftejiman/ejja

开源协议:MIT License

下载


ejja

A modular Go source code level control flow obfuscator, made in Go.

Runs the selected module on the target project.

Demonstration

quickstart

Quick Start

Usage:

  1. λ ejja run --project "samples" --module "flattener" --functions "main","fibonacci"
  2. [+] Running flattener..
  3. [+] Found function `main` in `test.go` ..
  4. [+] Emitting transformed function..
  5. func main(){
  6. a := []int{2, 212, 3001, 14, 501, 7800, 9932, 33, 45, 45, 45, 91, 99, 37, 102, 102, 104, 106, 109, 106}
  7. i := 0
  8. var c13qkfjm9cj2a64v7a10 string
  9. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a1g"
  10. for c13qkfjm9cj2a64v7a10 != "c13qkfjm9cj2a64v7a20" {
  11. switch(c13qkfjm9cj2a64v7a10){
  12. case "c13qkfjm9cj2a64v7a1g":
  13. a = []int{2, 212, 3001, 14, 501, 7800, 9932, 33, 45, 45, 45, 91, 99, 37, 102, 102, 104, 106, 109, 106}
  14. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a2g"
  15. break
  16. case "c13qkfjm9cj2a64v7a2g":
  17. fmt.Println(sort(a))
  18. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a30"
  19. break
  20. case "c13qkfjm9cj2a64v7a30":
  21. if (len(a) >= 1) {
  22. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a40"
  23. }else{
  24. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a4g"
  25. }
  26. break
  27. case "c13qkfjm9cj2a64v7a40":
  28. fmt.Println("yes")
  29. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a3g"
  30. break
  31. case "c13qkfjm9cj2a64v7a4g":
  32. fmt.Println("no")
  33. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a3g"
  34. break
  35. case "c13qkfjm9cj2a64v7a3g":
  36. i = 0
  37. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a60"
  38. break
  39. case "c13qkfjm9cj2a64v7a60":
  40. if i < 5 {
  41. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a5g"
  42. }else{
  43. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a50"
  44. }
  45. break
  46. case "c13qkfjm9cj2a64v7a6g":
  47. i++
  48. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a60"
  49. break
  50. case "c13qkfjm9cj2a64v7a5g":
  51. fmt.Println(i)
  52. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a6g"
  53. break
  54. case "c13qkfjm9cj2a64v7a50":
  55. fmt.Println(fibonacci(30))
  56. c13qkfjm9cj2a64v7a10 = "c13qkfjm9cj2a64v7a20"
  57. break
  58. }
  59. }
  60. }
  61. [+] Emitting transformed function..
  62. func fibonacci(n int) int{
  63. var c13qksrm9cj2kg5kgif0 string
  64. c13qksrm9cj2kg5kgif0 = "c13qksrm9cj2kg5kgifg"
  65. for c13qksrm9cj2kg5kgif0 != "c13qksrm9cj2kg5kgig0" {
  66. switch(c13qksrm9cj2kg5kgif0){
  67. case "c13qksrm9cj2kg5kgifg":
  68. if (n <= 1) {
  69. c13qksrm9cj2kg5kgif0 = "c13qksrm9cj2kg5kgih0"
  70. }else{
  71. c13qksrm9cj2kg5kgif0 = "c13qksrm9cj2kg5kgigg"
  72. }
  73. break
  74. case "c13qksrm9cj2kg5kgih0":
  75. return n
  76. break
  77. case "c13qksrm9cj2kg5kgigg":
  78. return fibonacci(n-1) + fibonacci(n-2)
  79. break
  80. }
  81. }
  82. return n
  83. }
  84. [+] Done.
  85. λ ejja run --project "C:\Users\kaftejiman\sampleGolangProject" --module "analyser"
  86. [+] Running analyser..
  87. === Object Summary ===
  88. basic objects : 2
  89. array objects : 2
  90. slice objects : 13
  91. struct objects : 5
  92. pointer objects : 2
  93. tuple objects : 1
  94. signature objects : 29
  95. interface objects : 3
  96. map objects : 0
  97. chan objects : 1
  98. [+] Done.

Available Modules

Flattener

Flattens the target function’s control flow graph.

Implementation of the flattener algorithm in “OBFUSCATING C++ PROGRAMS VIA CONTROL FLOW FLATTENING” by T. L ́aszl ́o and ́A. Kiss.

  • Name: flattener
  • Usage: ejja --project="example/project" --module="flattener" --function="main"
  • Description: The idea behind control flow flattening is to transform the structure of the source code in such a way that the targets of branches cannot be easily determined by static analysis, thus hindering the comprehension of the program.

Before/After source code level

before/after source code level

Before/After binary level (IDA 7.0)

Before/After binary level (IDA 7.0)

Analyser

Displays object metrics about the target project codebase, returns summary of object analysis.

  • Name: analyser
  • Usage: ejja --project="example/project" --module="analyser"
  • Description: Runs an analysis on the target project’s codebase, returns summary of object analysis.

Install

How to contribute your own module

Each module should export two required methods:

  • Manifest() — Module manifestation with a unique name and description.
  • Run() — The entry point of the module.

You can use helper functions found in utils. They provide basic ast operations.

You can find a sample module in samples folder, move the sample module to modules folder for actually running.

Known issues

Flattener module is lacking a lot as of now, I will be supporting more statements asap, feel free to PR.

Supported statements:

  • ExprStatements
  • IfStatements
  • ForStatements
  • ReturnStatements
  • AssignmentStatements

    Release Notes

CHANGELOG