aboutsummaryrefslogtreecommitdiffstats
path: root/obfuscator/obfuscator.cpp
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--obfuscator/obfuscator.cpp139
1 files changed, 121 insertions, 18 deletions
diff --git a/obfuscator/obfuscator.cpp b/obfuscator/obfuscator.cpp
index a76ff13..2cbbd73 100644
--- a/obfuscator/obfuscator.cpp
+++ b/obfuscator/obfuscator.cpp
@@ -24,12 +24,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.*
/*project headers*/
#include "../mutator_aux.h"
/*standard headers*/
-#include <string>
-#include <iostream>
#include <cassert>
-#include <vector>
-#include <fstream>
+#include <cstdlib>
#include <dirent.h>
+#include <fstream>
+#include <iostream>
+#include <string>
+#include <vector>
/*LLVM headers*/
#include "clang/AST/AST.h"
#include "clang/AST/ASTConsumer.h"
@@ -51,17 +52,29 @@ using namespace clang::ast_matchers;
using namespace clang::driver;
using namespace clang::tooling;
/**********************************************************************************************************************/
-/*global vars*/
-static llvm::cl::OptionCategory ObfuscatorCat("Obfuscator custom options");
+namespace {
+ static llvm::cl::OptionCategory ObfuscatorCat("Obfuscator custom options");
+ std::string TMP_FILE = "";
+}
/**********************************************************************************************************************/
//#define DBG
+// @DEVI-FIXME
+#if defined(__linux__)
+#define TEMP_FILE "/tmp/obfuscator-tee"
+#elif defined(__MACH__) && defined(__APPLE__)
+#define TEMP_FILE "/tmp/obfuscator-tee"
+#elif defined(__CYGWIN__) || defined(_WIN32) || defined(_WIN64)
+#define TEMP_FILE "C:\Temp\obfuscator-tee"
+#else
+#define TEMP_FILE "/tmp/obfuscator-tee"
+#endif
/**********************************************************************************************************************/
-class CryptoSponge {
- public:
- CryptoSponge() = default;
- ~CryptoSponge() {}
-};
-/**********************************************************************************************************************/
+/**
+ * @brief Gets the list of all directories and sub-directories starting from a base directory.
+ * @param _path where the the base directory is.
+ * @return Returns the list of all found dirs.
+ * @warning WIP
+ */
std::vector<std::string> listDirs(std::string _path) {
std::vector<std::string> dummy_;
DIR* dir_;
@@ -79,11 +92,20 @@ std::vector<std::string> listDirs(std::string _path) {
return dummy_;
}
+/**
+ * @brief Dumps a list of directories, meant as a debug options.
+ * @param _dirs The input to dump.
+ */
void dumpDirList(std::vector<std::string> _dirs) {
for (auto &iter : _dirs) {std::cout << iter << "\t";}
std::cout << "\n";
}
+/**
+ * @brief Extract the filename, the extension and the path to the file.
+ * @param _path The path to the file. Should include the file name also.
+ * @return Returns a tuple including the filename, the extension and the path in that order.
+ */
std::tuple<std::string, std::string, std::string> getNameFromPath(std::string _path) {
size_t pos = _path.rfind("/");
size_t pos2 = _path.rfind(".");
@@ -93,6 +115,13 @@ std::tuple<std::string, std::string, std::string> getNameFromPath(std::string _p
return std::make_tuple(name_, extension_, path_);
}
+/**
+ * @brief Remakes the name of a file.
+ * @param _name The name.
+ * @param _extension The extension.
+ * @param _extra optional extra string to add to the name. Default value is "obfusc".
+ * @return Returns the newly made name.
+ */
std::string nameMaker(std::string _name, std::string _extension, std::string _extra = "obfusc") {
if (_extra == "") {
return _name + _extra + "." + _extension;
@@ -102,11 +131,21 @@ std::string nameMaker(std::string _name, std::string _extension, std::string _ex
}
}
+/**
+ * @brief Return the hash digest of an identifier.
+ * @param _name the identifier name to hash.
+ * @return Returns the new name.
+ */
std::string getHashedName(std::string _name) {
std::size_t hash = std::hash<std::string>{}(_name);
return "FILE" + std::to_string(hash);
}
+/**
+ * @brief Hashes all the filenames.
+ * @param _filenames The input.
+ * @return Returns the map of the hashed identifiers.
+ */
std::unordered_map<std::string, std::string> hashFilenames(const std::vector<std::string>& _filenames) {
std::unordered_map<std::string, std::string> ret_map_;
for (auto &iter : _filenames) {
@@ -118,12 +157,57 @@ std::unordered_map<std::string, std::string> hashFilenames(const std::vector<std
return ret_map_;
}
+/**
+ * @brief Dumps all the hashed filenames. Meant for debugging.
+ * @param _map The map containing the identifier and hash digest pair.
+ */
void dumpHashFilenames(std::unordered_map<std::string, std::string> _map) {
for (auto &iter : _map) {
std::cout << "Key: " << iter.first << "\t" << "Value: " << iter.second << "\n";
}
}
+
+/**
+ * @brief Get the tmp directory address at compile-time.
+ * @return Return the address of the tmp directory.
+ */
+std::string getTempDir1() {
+ std::string tmpdir_;
+#if defined(__linux__)
+ tmpdir_ = "/tmp";
+#elif defined(__MACH__) && defined(__APPLE__)
+ // $TMPDIR
+ tmpdir_ = std::getenv("TMPDIR");
+#elif defined(__CYGWIN__) || defined(_WIN32) || defined(_WIN64)
+ // %TEMP%
+ tmpdir_ = std::getenv("TEMP");
+#else
+ // unix-posix
+ tmpdir_ = "/tmp";
+#endif
+ return tmpdir_;
+}
+
+/**
+ * @brief Get the path to the tmp directory at run-time.
+ * @return Returns the path to the tmp directory.
+ */
+std::string getTempDir2() {
+ std::string tmpdir_ = std::getenv("TMPDIR");
+ if (tmpdir_ == "") {
+ tmpdir_ = std::getenv("TEMP");
+ if (tmpdir_ == "") {
+ tmpdir_ = std::getenv("TEMP");
+ if (tmpdir_ == "") {tmpdir_ = "";}
+ }
+ }
+
+ return tmpdir_;
+}
/**********************************************************************************************************************/
+/**
+ * @brief MatchCallback for CallExpr.
+ */
class CalledFunc : public MatchFinder::MatchCallback {
public:
CalledFunc(Rewriter &Rewrite) : Rewrite(Rewrite) {}
@@ -137,7 +221,6 @@ class CalledFunc : public MatchFinder::MatchCallback {
#ifdef DBG
std::cout << "CallExpr name: " << name << " Hash: " << hash << " New ID: " << newname << "\n";
#endif
-
auto dummy = Rewrite.getRewrittenText(SourceRange(CE->getLocStart(), CE->getRParenLoc()));
auto LParenOffset = dummy.find("(");
SourceLocation SL = Devi::getSLSpellingLoc(CE->getLocStart(), Rewrite);
@@ -151,6 +234,9 @@ class CalledFunc : public MatchFinder::MatchCallback {
Rewriter &Rewrite;
};
/**********************************************************************************************************************/
+/**
+ * @brief MatchCallback for DeclRefExpr. changes the identifier with its hash digest.
+ */
class CalledVar : public MatchFinder::MatchCallback {
public:
CalledVar (Rewriter &Rewrite) : Rewrite(Rewrite) {}
@@ -175,6 +261,9 @@ class CalledVar : public MatchFinder::MatchCallback {
Rewriter &Rewrite;
};
/**********************************************************************************************************************/
+/**
+ * @brief changes the identifier for function declarations with the hash digest of the identifier being defined.
+ */
class FuncDecl : public MatchFinder::MatchCallback
{
public:
@@ -203,6 +292,9 @@ private:
Rewriter &Rewrite;
};
/**********************************************************************************************************************/
+/**
+ * @brief changes the identifier for var declarations with the hash digest of the identifier being defined.
+ */
class VDecl : public MatchFinder::MatchCallback
{
public:
@@ -222,6 +314,7 @@ public:
SourceLocation SLE;
const clang::Expr* EXP = nullptr;
+ // if the VarDecl also contains an initial value assignment.
if (MR.Nodes.getNodeAs<clang::Expr>("expr") !=nullptr) {
EXP = MR.Nodes.getNodeAs<clang::Expr>("expr");
SLE = Devi::getSLSpellingLoc(EXP->getExprLoc(), Rewrite);
@@ -238,6 +331,9 @@ private:
Rewriter &Rewrite;
};
/**********************************************************************************************************************/
+/**
+ * @brief Replaces the class name with its hash digest.
+ */
class ClassDecl : public MatchFinder::MatchCallback {
public:
ClassDecl (Rewriter &Rewrite) : Rewrite(Rewrite) {}
@@ -268,6 +364,9 @@ class ClassDecl : public MatchFinder::MatchCallback {
Rewriter &Rewrite;
};
/**********************************************************************************************************************/
+/**
+ * @brief PPCallbacks for replacing Macro identifiers with their hash digest Along with changing the Header filenames.
+ */
class PPInclusion : public PPCallbacks
{
public:
@@ -332,6 +431,9 @@ private:
Rewriter &Rewrite;
};
/**********************************************************************************************************************/
+/**
+ * @brief A Clang Diagnostic Consumer that does nothing.
+ */
class BlankDiagConsumer : public clang::DiagnosticConsumer
{
public:
@@ -371,7 +473,7 @@ public:
}
void EndSourceFileAction() override {
std::error_code EC;
- std::string OutputFilename = "/tmp/obfuscator-tee";
+ std::string OutputFilename = TEMP_FILE;
TheRewriter.getEditBuffer(TheRewriter.getSourceMgr().getMainFileID()).write(llvm::outs());
tee = new raw_fd_ostream(StringRef(OutputFilename), EC, sys::fs::F_None);
TheRewriter.getEditBuffer(TheRewriter.getSourceMgr().getMainFileID()).write(*tee);
@@ -391,6 +493,9 @@ private:
raw_ostream *tee = &llvm::outs();
};
/**********************************************************************************************************************/
+/**
+ * @brief Deletes all comment from source-code.
+ */
class CommentWiper {
public:
CommentWiper(std::vector<std::string> SourceList) : sourcelist(SourceList) {}
@@ -398,7 +503,7 @@ class CommentWiper {
int run(void) {
for (auto &filepath : sourcelist) {
std::ifstream sourcefile;
- sourcefile.open("/tmp/obfuscator-tee");
+ sourcefile.open(TEMP_FILE);
std::ofstream dupe;
auto filename_ = getNameFromPath(filepath);
dupe.open(nameMaker(getHashedName(std::get<0>(filename_)), std::get<1>(filename_), ""));
@@ -471,7 +576,7 @@ class WhitespaceWarper {
int run(void) {
for (auto &filepath : sourcelist) {
std::ifstream sourcefile;
- sourcefile.open("./test/obfuscator-tee");
+ sourcefile.open(TEMP_FILE);
auto filename_ = getNameFromPath(filepath);
std::ofstream dupe;
dupe.open("./dupe2.cpp");
@@ -507,8 +612,6 @@ int main(int argc, const char **argv) {
const std::vector<std::string> &SourcePathList = op.getSourcePathList();
ClangTool Tool(op.getCompilations(), op.getSourcePathList());
int ret = Tool.run(newFrontendActionFactory<ObfFrontendAction>().get());
- //WhitespaceWarper WW(SourcePathList);
- //WW.run();
CommentWiper CW(SourcePathList);
CW.run();
dumpHashFilenames(hashFilenames(SourcePathList));