Esempio n. 1
0
int strtol10(const char* in, const char** out = 0)
{
	bool inv = (*in == '-');
	if (inv || *in == '+')
		++in;

	int value = (int)strtoul10(in, out);
	if (inv) {
		value = -value;
	}

	return value;
}
Esempio n. 2
0
/**
 * Convert a formatted base-10 ASCII number to signed long binary representation.
 *
 * \see strtoul10()
 */
bool strtol10(const char *first, const char *last, long *val)
{
	bool negative = false;

	if (*first == '+')
		++first; /* skip unary plus sign */
	else if (*first == '-')
	{
		negative = true;
		++first;
	}

	bool result = strtoul10(first, last, (unsigned long *)val);

	if (negative)
		*val = - *val;

	return result;
}
Esempio n. 3
0
void main(int argc,char *argv[])
{
	bool CreateNewDBFromIDA=TRUE;
	TCHAR *optstring=TEXT("f:i:I:L:ld:s:t:y");
	int optind=0;
	TCHAR *optarg;
	int c;

	char *SourceFilename=NULL;
	char *TargetFilename=NULL;
	char *LogFilename=NULL;
	BOOL bListFiles=FALSE;
	char *IDAPath=NULL;
	BOOL UseIDASync=FALSE;

	DWORD SourceFunctionAddress=0;
	DWORD TargetFunctionAddress = 0;

	int SourceFileID;
	int TargetFileID;
	int DebugLevel = 0;
	bool is_64 = false; //TODO:

#ifdef DEBUG_MEMORY
	_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

	_CrtSetReportMode(_CRT_WARN, _CRTDBG_MODE_FILE);
	_CrtSetReportFile(_CRT_WARN, _CRTDBG_FILE_STDOUT);
	_CrtSetReportMode(_CRT_ERROR, _CRTDBG_MODE_FILE);
	_CrtSetReportFile(_CRT_ERROR, _CRTDBG_FILE_STDOUT);
	_CrtSetReportMode(_CRT_ASSERT, _CRTDBG_MODE_FILE);
	_CrtSetReportFile(_CRT_ASSERT, _CRTDBG_FILE_STDOUT);
#endif

	while((c=getopt(argc,argv,optstring,&optind,&optarg))!=EOF)
	{
		switch(c)
		{
			case 'f':
				SourceFilename=optarg;
				TargetFilename=argv[optind];
				optind++;
				break;

			case 'i':
				SourceFileID=strtoul10(optarg);
				TargetFileID=strtoul10(argv[optind]);
				optind++;
				break;

			case 'd':
				DebugLevel=strtoul10(optarg);
				break;

			case 's':
				SourceFunctionAddress = strtoul(optarg, NULL, 16);
				break;

			case 't':
				TargetFunctionAddress = strtoul(optarg, NULL, 16);
				break;

			case 'I':
				IDAPath=optarg;
				break;

			case 'L':
				LogFilename=optarg;
				break;

			case 'l':
				bListFiles=TRUE;
				break;

			case 'y':
				UseIDASync=TRUE;
				break;
		}
	}

	if(argc<=optind)
	{
		printf("Usage: %s [-f <original filename> <patched filename>]|[-i <original file id> <patched file id>]|-l -L <Log Filename> [-y] <database filename>\r\n"
			   			   
							" - f <original filename> <patched filename>\r\n"
							"	Original filename and patched filename\r\n"
							"		Retrieve data from IDA using DarunGrim IDA plugin\r\n"

							"-i <original file id> <patched file id>\r\n"
							"	Original files ID in the database and patched files ID in the database\r\n"
							"		Retrieve data from database file created using DarunGrim IDA plugin\r\n"

							"-I IDA Program path.\r\n"

							//Debugging related parameters
							"-L Debug Log Filename\r\n"
							"-d <level> Debug Level\r\n"

							"-s <function address> Function address to analyze for the original binary\r\n"
							"-t <function address> Function address to analyze for the patched binary\r\n"
							
							"-y Use IDA synchorinzation mode\r\n"
							
							"-l: \r\n"
							"	List file informations in the <database filename>\r\n"
							
							"<database filename>\r\n"
							"	Database filename to use\r\n\r\n", argv[0]);
		return;
	}

	DarunGrim *pDarunGrim = new DarunGrim();

	if (IDAPath)
		pDarunGrim->SetIDAPath(IDAPath,is_64);

	pDarunGrim->SetLogParameters(LogToStdout, DebugLevel, "");

	char *DiffDatabaseFilename=argv[optind];
	
	if (bListFiles)
	{
		pDarunGrim->ListDiffDatabase(DiffDatabaseFilename);
	}
	else if (SourceFilename && TargetFilename && DiffDatabaseFilename)
	{
		pDarunGrim->PerformDiff(
			SourceFilename, SourceFunctionAddress,
			TargetFilename, TargetFunctionAddress,
			DiffDatabaseFilename);
	}
	else
	{
		pDarunGrim->AcceptIDAClientsFromSocket();
		pDarunGrim->PerformDiff();
	}


	if(UseIDASync)
	{
		pDarunGrim->ShowOnIDA();
	}

#ifdef DEBUG_MEMORY
	_CrtDumpMemoryLeaks();
#endif
}
std::vector<Vertex> parseObj(const char* filename, const std::string& shading_model){
	bool has_texture = false;
	FILE* file;
	char line[128];
	
	// Hold the data from the object file
	std::vector<glm::vec3> temp_vertices;
	std::vector<glm::vec3> temp_vnormals;
	std::vector<glm::vec2> temp_vt;
	
	std::vector<ushort> normal_elements;
	std::vector<ushort> vertex_elements;
	std::vector<ushort> vt_elements;
	
	std::vector<Vertex> vertices;
	
	file = fopen(filename, "r");
	
	while( fgets(line, sizeof(line), file) != NULL){
		switch(line[0]){
		case 'v':
			switch(line[1]){
			case ' ':{
				uchar nchar = 2;
				glm::vec3 v;
				for(int i = 0; i < 3; i++){
					char buff[32];
					nchar += getNextWord(line + nchar, buff);
					v[i] = fast_atof(buff);
				}
				temp_vertices.push_back(v);
				break;
			}
			case 'n':{
				uchar nchar = 3;
				glm::vec3 vn;
				for(int i = 0; i < 3; i++){
					char buff[32];
					nchar += getNextWord(line + nchar, buff);
					vn[i] = fast_atof(buff);
				}
				temp_vnormals.push_back(vn);
				break;
			}
			case 't':{
				has_texture = true;
				uchar nchar = 3;
				glm::vec2 vt;
				for(int i = 0; i < 2; i++){
					char buff[32];
					nchar += getNextWord(line + nchar, buff);
					vt[i] = fast_atof(buff);
				}
				temp_vt.push_back(vt);
				break;
			}
			}
			break;
		case 'f':{
			ushort f,fn;
			if(!has_texture){
				uchar nchar = 2;
				for(int i = 0; i < 3; i++){
					char buff[32];
					nchar += getNextWord(line + nchar, buff);
					uchar nextpos = findCharAndTerminate(buff, '/');
					nextpos++;
					f = (ushort)strtoul10(buff);
					fn = (ushort)strtoul10(buff + nextpos);
					vertex_elements.push_back(--f);
					normal_elements.push_back(--fn);
				}
			}
			else{
				ushort vt;
				uchar nchar = 2;
				for(int i = 0; i < 3; i++){
					char buff[32];
					char *a = buff;
					nchar += getNextWord(line + nchar, buff);
					uchar nextpos = findCharAndTerminate(a, '/');
					f = (ushort)strtoul10(a);
					a += nextpos;
					nextpos = findCharAndTerminate(a, '/');
					vt = (ushort)strtoul10(a);
					a += nextpos;
					fn = (ushort)strtoul10(a);
					vertex_elements.push_back(--f);
					normal_elements.push_back(--fn);
					vt_elements.push_back(--vt);
				}
			}
			break;
		}
		default:
			break;
		}
	}
	
	fclose(file);
	// Make the vertex and normal lists
	int f_size = vertex_elements.size();
	
	if(shading_model == "smooth"){
		
		std::vector<glm::vec3> vertexnormals;
		int v_size = temp_vertices.size();
		
		for(int i = 0; i < v_size; i++){ //For every vertex
			glm::vec3 normal(0.0,0.0,0.0);
			for(int j = 0; j < f_size; j++){ //For every vertex of the triangles
				if(i == vertex_elements[j]){ //If they share the vertex
					normal+=temp_vnormals[normal_elements[j]];
				}
			}
			glm::normalize(normal);
			vertexnormals.push_back(normal);
		}
		if(!has_texture){
			for(int i = 0; i < f_size; i++){
				Vertex vertex(temp_vertices[vertex_elements[i]], vertexnormals[vertex_elements[i]]);
				vertices.push_back(vertex);
			}
		}
		else{
			for(int i = 0; i < f_size; i++){
				Vertex vertex(temp_vertices[vertex_elements[i]], vertexnormals[vertex_elements[i]], temp_vt[vt_elements[i]]);
				vertices.push_back(vertex);
			}
		}
	}
	else{
		if(!has_texture){
			for(int i = 0; i < f_size; i++){
				Vertex vertex(temp_vertices[vertex_elements[i]], temp_vnormals[normal_elements[i]]);
				vertices.push_back(vertex);
			}
		}
		else{
			for(int i = 0; i < f_size; i++){
				Vertex vertex(temp_vertices[vertex_elements[i]], temp_vnormals[normal_elements[i]], temp_vt[vt_elements[i]]);
				vertices.push_back(vertex);
			}
		}
	}
	return vertices;
}