wucuoym 发表于 2024-1-11 00:24

手握go源码,硬是找不到无法启动的原因,真的很灵异

在别的语言还没有碰到过这种情况。

一份Go的源码,会在启动的时候找一个 key.bin 文件,如果找不到,就无法启动。

打了断点在main里边,根本没有进到main。 那应该是在init() 方法里边。于是我在所有的init()方法里边打断点,还是没有进。

最后调试是在以下的代码会异常退出。而且退出是毫无征兆的退出。

                firstFunc := add(unsafe.Pointer(t), 8)
                for i := uint32(0); i < t.nfns; i++ {
                        p := add(firstFunc, uintptr(i)*goarch.PtrSize)
                        f := *(*func())(unsafe.Pointer(&p))
                        f()
                }

但是从源码中,找死了也没找到是在哪里做这个事情的。

甚至加断点加到了go源码里边也没找出来。

源码下载: https://vvpp.cc/s/aNcg

大佬们看看这个程序是如何做到这种限制的。

wucuoym 发表于 2024-1-11 23:31

下面是我处理下的代码,但是还是启动不起来。

package bootstrap

import (
      "bytes"
      "crypto/aes"
      "crypto/cipher"
      "fmt"
      "github.com/cloudreve/Cloudreve/v3/bootstrap/constant"
      "github.com/cloudreve/Cloudreve/v3/pkg/conf"
      "github.com/cloudreve/Cloudreve/v3/pkg/vol"
      "github.com/gin-gonic/gin"
      "io/ioutil"
      "log"
      "strconv"
)

var matrix []byte
var APPID string

// InitApplication 初始化应用常量
func InitApplication() {
      fmt.Print(`
   Cloudreve Application Information
   Version: ` + conf.BackendVersion + `Commit: #` + conf.LastCommit + `Pro: ` + conf.IsPro + `
================================================
`)
      pic, err := ioutil.ReadFile("bg.png")
      if err != nil {
                log.Fatalf("Failed to read bg.png: %v", err)
      }

      // Your data
      table := mapinterface{}{
                "id":      "2018110303550773058",
                "pic":   pic,
                "secret":"C3E8E7FDB44F866A29309FAF91242343",
                "version": "3.3.1",
                "date":    "1111111111111111111",
                "domains": "dd.cc",
                "table":   make([]int, 15),
      }
      // 使用解密和解码后的数据初始化全局变量
      constant.HashIDTable = table["table"].([]int)
      APPID = table["id"].(string)
      matrix = table["pic"].([]byte)
      vol.ClientSecret = table["secret"].(string)
}

// InitCustomRoute 初始化自定义路由
func InitCustomRoute(group *gin.RouterGroup) {
      // 定义一个返回 PNG 图片的路由
      group.GET("bg", func(c *gin.Context) {
                c.Header("content-type", "image/png")
                c.Writer.Write(matrix)
      })

      // 定义一个返回 APPID 的路由
      group.GET("id", func(c *gin.Context) {
                c.String(200, APPID)
      })
}

func seed() []byte {
      res := []int{8}
      s := "20210323"
      m := 1 << 20
      a := 9
      b := 7
      for i := 1; i < 23; i++ {
                res = append(res, (a*res+b)%m)
                s += strconv.Itoa(res)
      }
      return []byte(s)
}

func decode(cryted []byte, key []byte) []byte {
      block, _ := aes.NewCipher(key[:32])
      blockSize := block.BlockSize()
      blockMode := cipher.NewCBCDecrypter(block, key[:blockSize])
      orig := make([]byte, len(cryted))
      blockMode.CryptBlocks(orig, cryted)
      orig = pKCS7UnPadding(orig)
      return orig
}

func pKCS7UnPadding(origData []byte) []byte {
      length := len(origData)
      unpadding := int(origData)
      return origData[:(length - unpadding)]
}

func encode(orig []byte, key []byte) []byte {
      block, _ := aes.NewCipher(key[:32])
      blockSize := block.BlockSize()
      orig = pKCS7Padding(orig, blockSize)
      blockMode := cipher.NewCBCEncrypter(block, key[:blockSize])
      crypted := make([]byte, len(orig))
      blockMode.CryptBlocks(crypted, orig)
      return crypted
}

func pKCS7Padding(origData []byte, blockSize int) []byte {
      padding := blockSize - len(origData)%blockSize
      padtext := bytes.Repeat([]byte{byte(padding)}, padding)
      return append(origData, padtext...)
}

go4399 发表于 2024-1-11 21:39

bootstrap\app.go

        data, err := ioutil.ReadFile(util.RelativePath(string([]byte{107, 101, 121, 46, 98, 105, 110})))


107, 101, 121, 46, 98, 105, 110 正好就是key.bin

wucuoym 发表于 2024-1-11 00:27

吐槽一下,代码高亮里边居然没有Go语言

go4399 发表于 2024-1-11 13:25

go编译器版本,1.21.5及以上无法在Win7及以下系统启动

wucuoym 发表于 2024-1-11 17:50

go4399 发表于 2024-1-11 13:25
go编译器版本,1.21.5及以上无法在Win7及以下系统启动

不是版本问题,我把key.bin文件放进去就可以运行了。
我是win10。
主要是我没有找到读取文件的地方。而且这种直接exit一般是什么情况下会出现呢。

wucuoym 发表于 2024-1-11 17:52

另外go编译器有没有办法打出所有的运行堆栈。这样我才能找到是哪里退出的,现在完全没头绪。

go4399 发表于 2024-1-11 20:37

查一下go.mod里面的包的源代码,有没有读key.bin的地方
C:\Users\xxxx\go\pkg\mod下面的源代码

wucuoym 发表于 2024-1-11 23:28

go4399 发表于 2024-1-11 21:39
bootstrap\app.go

        data, err := ioutil.ReadFile(util.RelativePath(string([]b ...

谢谢帮忙查看源码。{:1_893:}

这个地方我也找到了,然后我根据key.bin给几个变量都赋值了。

也就是这段代码已经屏蔽了。可以后面还是启动不起来。

wucuoym 发表于 2024-1-11 23:32

而且问题是我在这个方法里边打断点使用Goland调试根本走不到这里来。。。
页: [1] 2
查看完整版本: 手握go源码,硬是找不到无法启动的原因,真的很灵异