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; }
/** * 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; }
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; }