我正在编写一个简单的免费软件来编码和解码 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