0

我正在编写一个简单的免费软件来编码和解码 bash 脚本,主要是。

目标是获得可执行的脚本文件,其中没有人可以读取其中的源代码,包括 root 和所有者。为了编码/解码文件,我选择使用带有 3DES 算法的 gcrypt 库。但不幸的是,唯一可用的文档是为已经使用该库的人提供的(例如参考指南)。

你可以在以下地址找到我的代码: wScriptObfuscator.c

目前我停在两步中的第一步:编码脚本文件。您可以在以下代码行中阅读此步骤的核心:

char secKey[(WSO_KEYSIZE + 1)];
char inVector[(WSO_KEYSIZE + 1)];

memcpy(secKey, WSO_SYMKEY, WSO_KEYSIZE);
secKey[WSO_KEYSIZE] = '\0';
memcpy(inVector, WSO_INIVECTOR, WSO_KEYSIZE);
inVector[WSO_KEYSIZE] = '\0';
#if __DEBUG__ > 0
printf("Key:    %s\nVector: %s\n", secKey, inVector);
#endif

resData = malloc(st.st_size + sizeof(char));

// End initialization process
gcry_control(GCRYCTL_INITIALIZATION_FINISHED, 0);

// This function creates the context handle required for most of the other cipher functions
if (gcry_cipher_open(&hd, GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_ECB, 0) == GPG_ERR_NO_ERROR) {

  // Set the key used for encryption or decryption operations
  if (gcry_cipher_setkey(hd, secKey, gcry_cipher_get_algo_keylen(GCRY_CIPHER_3DES)) == GPG_ERR_NO_ERROR) {

    // Set the initialization vector used for encryption or decryption
    if (gcry_cipher_setiv(hd, inVector, WSO_KEYSIZE) == GPG_ERR_NO_ERROR) {

      // Encription
      if (
        gcry_cipher_encrypt(
          hd,
          resData, (st.st_size + sizeof(char)),
          data, (st.st_size + sizeof(char))
        ) == GPG_ERR_NO_ERROR
        ) {

        // Encripted data saving...
        fd = open(sFileName, O_WRONLY);
        idx = 0;
        t = 1;
        if (fd > 0) {
          while (idx < st.st_size && t > 0) {
            t = write(fd, (data + idx), (st.st_size - idx));
            if (t > 0) idx = idx + t;
          }
        }
        close(fd);

      }
      else {
        fprintf(stderr, "ERROR! Encription procedure failed\n");
        err = WSO_ERROR_ENCRIPTFAILURE;
      }
    }
    else {
      fprintf(stderr, "ERROR! gcry_cipher_setiv() failed\n");
      err = WSO_ERROR_ENCRIPTFAILURE;
    }
  }
  else {
    fprintf(stderr, "ERROR! Key initialization failed\n");
    err = WSO_ERROR_ENCRIPTFAILURE;
  }

  gcry_cipher_close(hd);

}
else {
  fprintf(stderr, "ERROR! Encripted channel opening procedure failed\n");
  err = WSO_ERROR_ENCRIPTFAILURE;
}

if (resData != NULL) free(resData);

一切看起来都很好,但不是最后一个编码器处理函数 gcry_cipher_encrypt()。这很奇怪,因为它需要良好初始化的 gcry_cipher_hd_t 结构、一个编码数据缓冲区、它的大小、一个源数据缓冲区、它的大小,仅此而已。它看起来很容易....但它不起作用。

不幸的是,我还没有找到有关返回的错误代码的文档。

您也可以通过 sourceforge 下载代码:

svn checkout https://svn.code.sf.net/p/linuxwoodo/code/trunk linuxwoodo-code

wScriptObfuscator.c 文件位于以下文件夹中:trunk/prj__wScriptObfuscator/b1/src

4

0 回答 0