Skip to content

Commit

Permalink
First released
Browse files Browse the repository at this point in the history
  • Loading branch information
TerraWilly committed May 19, 2022
1 parent d13d622 commit 92cb5fb
Show file tree
Hide file tree
Showing 6 changed files with 433 additions and 0 deletions.
6 changes: 6 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
cmake_minimum_required(VERSION 3.20)
project(FlexNetLicenseSearch)

set(CMAKE_CXX_STANDARD 14)

add_executable(FlexNetLicenseSearch main.cpp search.cpp search.h pattern.cpp pattern.h)
227 changes: 227 additions & 0 deletions main.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
#include <iostream>
#include <fstream>
#include <string>
#include <dirent.h>
#include <cstring>
#include <vector>
#include <getopt.h>
#include <sys/stat.h>
#include <csignal>
#include <filesystem>
#include "search.h"
#include "pattern.h"

using namespace std;

void getFiles(const string &root, vector<string> &files);
int32_t createDirectory(const std::string &directoryPath);


#define ACCESS(fileName,accessMode) access(fileName,accessMode)
#define MKDIR(path) mkdir(path,S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)

/**
* Print logo
*
*/
void PrintLogo(void)
{
cout<< R"(
________ _ __ __ _____ __
/ ____/ /__ _ __/ | / /__ / /_ / ___/___ ____ ___________/ /_
/ /_ / / _ \| |/_/ |/ / _ \/ __/ \__ \/ _ \/ __ `/ ___/ ___/ __ \
/ __/ / / __/> </ /| / __/ /_ ___/ / __/ /_/ / / / /__/ / / /
/_/ /_/\___/_/|_/_/ |_/\___/\__/ /____/\___/\__,_/_/ \___/_/ /_/
by WillyTerra
)"<<endl;
}

/**
* Print help
*
*/
void PrintUsage(void)
{
cout <<R"(
**********************************************************************************
* -s Search flexnet licensing file
* -c Copy flexnet licensing file to new folder
* -h Display this info
**********************************************************************************
)"<<endl;
}

/**
* Main function
* @param argc
* @param argv
* @return
*/
int main(int argc, char* argv[]) {

int opt;
bool flgCopy = false;
bool flgSearch = false;

uint16_t PatchSig = 0;

string pCopyDirectory = "";

PrintLogo();
SearchPatternInit();

while ((opt = getopt(argc, argv, "sc:h")) != -1) {
switch (opt) {
case 'c': //Search Copy
flgCopy = true;
pCopyDirectory = optarg;
break;
case 's': //Search signature
flgSearch = true;
break;
case 'h': //Help
PrintUsage();
exit(EXIT_SUCCESS);
break;
default: break;
}
}

string root = "."; //Current Directory
vector<string> files;
getFiles(root, files);

for (auto file : files) {

ifstream binRead(file,ios::binary);
binRead.seekg(0,ios::end);

uint32_t dataFileSize = binRead.tellg();
uint8_t *dataBuffer = new uint8_t [dataFileSize + 10];

//Read ELF file
binRead.seekg(0,ios::beg);
binRead.read((char *)dataBuffer,dataFileSize);
binRead.close();

int resData = 0;

if (flgSearch)
{
//Find ECC Pattern
resData = PatchPatternSearchInfo(dataBuffer,dataFileSize,fnSigPattern);

if (resData != -1)
{
PatchSig++;
cout<<file<<endl;
while (dataBuffer[resData + 5] != 0x00)
{
cout<<(char)dataBuffer[resData+5];
resData++;
}
cout<<endl;

if (flgCopy) //Copy file to another
{
vector <string> fields;

string origFolder = get_current_dir_name() + file.erase(0,1);
string copyFolder = pCopyDirectory + file.erase(0,1);

createDirectory(copyFolder);

std::ifstream src(origFolder, std::ios::binary);
std::ofstream dst(copyFolder, std::ios::binary);
dst << src.rdbuf();
}
}
}
delete []dataBuffer;
}

if(flgSearch)
cout<<"Total "<<PatchSig<<" files with FlexNet license."<< endl;

return 0;
}

/**
* Search binary file
* @param root
* @param files
*/
void getFiles(const string &root, vector<string> &files) {

DIR *pDir;
struct dirent *ptr;

if (!(pDir = opendir(root.c_str()))) {
return;
}

while ((ptr = readdir(pDir)) != nullptr) {

string sub_file = root + "/" + ptr->d_name;

if (ptr->d_type != DT_REG && ptr->d_type != DT_DIR && ptr->d_type != DT_LNK) {
return;
}

if (ptr->d_type == DT_REG) {
if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {

uint8_t *dataBuffer = new uint8_t [4];

ifstream binRead(sub_file,ios::binary);
binRead.seekg(0,ios::beg);
binRead.read((char *)dataBuffer,4);
binRead.close();

//Find binary file
if (strstr((char*)(dataBuffer), "ELF"))
{
files.push_back(sub_file);
}
}
}
else if (ptr->d_type == DT_DIR) {
if (strcmp(ptr->d_name, ".") != 0 && strcmp(ptr->d_name, "..") != 0) {
getFiles(sub_file, files);
}
}
}
closedir(pDir);
}
/**
* Creat multiple directory
* @param directoryPath
* @return
*/
int32_t createDirectory(const std::string &directoryPath)
{
uint32_t dirPathLen = directoryPath.length();

if (dirPathLen > 256)
{
return -1;
}
char tmpDirPath[256] = { 0 };

for (uint32_t i = 0; i < dirPathLen; ++i)
{
tmpDirPath[i] = directoryPath[i];
if (tmpDirPath[i] == '\\' || tmpDirPath[i] == '/')
{
if (ACCESS(tmpDirPath, 0) != 0)
{
int32_t ret = MKDIR(tmpDirPath);
if (ret != 0)
{
return ret;
}
}
}
}
return 0;
}
19 changes: 19 additions & 0 deletions pattern.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
//
// Created by willyterra on 1/13/22.
//
#include "pattern.h"

//create pattern struct
stSearchPattern fnSigPattern;

void SearchPatternInit(void)
{
string patternTemp = "";

//Search flexnet licensing signature
patternTemp = "40 28 23 29 20 46 ?? ?? "; //@(#) F...
fnSigPattern.pattern = DeleteSpace(patternTemp);
fnSigPattern.pPatternData = new uint8_t [fnSigPattern.pattern.length()];
fnSigPattern.lenSearchPattern = fnSigPattern.pattern.length()/2;
fnSigPattern.posMarkCode = String2ByteArray(fnSigPattern.pattern,fnSigPattern.pPatternData);
}
17 changes: 17 additions & 0 deletions pattern.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//
// Created by willyterra on 1/13/22.
//

#ifndef PATTERNSEARCH_PATTERN_H
#define PATTERNSEARCH_PATTERN_H

#include "search.h"
#include <iostream>

using namespace std;

extern stSearchPattern fnSigPattern;


void SearchPatternInit(void);
#endif //PATTERNSEARCH_PATTERN_H
Loading

0 comments on commit 92cb5fb

Please sign in to comment.