노현종

포인터 변수 추상화 버그 해결, 각 블록마다 추상화를 독립적으로 하도록 변경

a->b->c 같은 포인터 변수를 구분하여 추상화 할 수 있도록 수정, 정규식 성능 최적화
...@@ -84,6 +84,10 @@ namespace VulnCrawler ...@@ -84,6 +84,10 @@ namespace VulnCrawler
84 // Repository 목록 만큼 반복함. 84 // Repository 목록 만큼 반복함.
85 foreach (var directory in directorys) { 85 foreach (var directory in directorys) {
86 // 템플릿 패턴화 T : VulnAbstractCrawler 86 // 템플릿 패턴화 T : VulnAbstractCrawler
87 + if (directory.Contains("linux"))
88 + {
89 + continue;
90 + }
87 VulnWorker.Run<VulnC>(directory); 91 VulnWorker.Run<VulnC>(directory);
88 } 92 }
89 } 93 }
......
...@@ -336,7 +336,7 @@ namespace VulnCrawler ...@@ -336,7 +336,7 @@ namespace VulnCrawler
336 // 메서드 정규식 패턴 336 // 메서드 정규식 패턴
337 string methodPattern = @"([a-zA-Z0-9_\.]+)\s*\("; 337 string methodPattern = @"([a-zA-Z0-9_\.]+)\s*\(";
338 // 변수 정규식 패턴 338 // 변수 정규식 패턴
339 - string fieldPattern = @"\*?(?<Field>[a-zA-Z0-9_\.\[\]\-\>]+)"; 339 + string fieldPattern = @"\*?(?<Field>([a-zA-Z0-9_\.]|\-\>)+)";
340 string fieldArrayPattern = @"(?<ArrayName>[a-zA-Z0-9_\.]+)\[.+\]"; 340 string fieldArrayPattern = @"(?<ArrayName>[a-zA-Z0-9_\.]+)\[.+\]";
341 string invalidPattern = @"^[\d\.]+"; 341 string invalidPattern = @"^[\d\.]+";
342 342
...@@ -441,7 +441,10 @@ namespace VulnCrawler ...@@ -441,7 +441,10 @@ namespace VulnCrawler
441 { 441 {
442 return false; 442 return false;
443 } 443 }
444 - 444 + if (m.Value.StartsWith("-"))
445 + {
446 + return false;
447 + }
445 /* 알파벳이 하나도 없으면 넘어감 */ 448 /* 알파벳이 하나도 없으면 넘어감 */
446 if(!m.Value.Any(c => char.IsLetter(c))) 449 if(!m.Value.Any(c => char.IsLetter(c)))
447 { 450 {
...@@ -458,20 +461,53 @@ namespace VulnCrawler ...@@ -458,20 +461,53 @@ namespace VulnCrawler
458 }) 461 })
459 .Distinct(new MatchComparer()); 462 .Distinct(new MatchComparer());
460 463
464 +
461 foreach (var x in vars) 465 foreach (var x in vars)
462 { 466 {
463 if (x.Success) 467 if (x.Success)
464 { 468 {
465 - methodVarList.Vars.Add(x.Groups["Field"].Value); 469 + var field = x.Groups["Field"].Value;
470 +
471 + /* a->b 포인터 변수 나눠서 추가 */
472 + if (field.Contains("->"))
473 + {
474 + var connects = Regex.Split(field, "->");
475 + var connectList = new List<string>();
476 +
477 + string s = string.Empty;
478 + foreach (var c in connects)
479 + {
480 + if (s == string.Empty)
481 + {
482 + s = c;
483 + }
484 + else
485 + {
486 + s = string.Join("->", s, c);
487 + }
488 + connectList.Add(s);
489 + }
490 + foreach (var c in connectList)
491 + {
492 + if (c == connects[connects.Length-1])
493 + {
494 + continue;
495 + }
496 + if (methodVarList.Vars.Contains(c))
497 + {
498 + continue;
499 + }
500 + methodVarList.Vars.Add(c);
501 + }
502 + continue;
503 + }
504 + methodVarList.Vars.Add(field);
466 } 505 }
467 } 506 }
468 -
469 foreach (var x in arrays) 507 foreach (var x in arrays)
470 { 508 {
471 methodVarList.Vars.Add(x); 509 methodVarList.Vars.Add(x);
472 } 510 }
473 -
474 -
475 foreach (var m in methodSets) 511 foreach (var m in methodSets)
476 { 512 {
477 methodVarList.Methods.Add(m); 513 methodVarList.Methods.Add(m);
...@@ -499,8 +535,7 @@ namespace VulnCrawler ...@@ -499,8 +535,7 @@ namespace VulnCrawler
499 // 메서드 정규식 패턴 535 // 메서드 정규식 패턴
500 string methodPattern = @"([a-zA-Z0-9_\.]+)\s*\("; 536 string methodPattern = @"([a-zA-Z0-9_\.]+)\s*\(";
501 // 변수 정규식 패턴 537 // 변수 정규식 패턴
502 - string fieldPattern = @"^*?[a-zA-Z0-9_\.\[\]\-\>]+"; 538 + string fieldPattern = @"\*?(?<Field>([a-zA-Z0-9_\.]|\-\>)+)";
503 -
504 string invalidPattern = @"^[\d\.]+"; 539 string invalidPattern = @"^[\d\.]+";
505 540
506 string commentPattern = @"[""].*[""]"; 541 string commentPattern = @"[""].*[""]";
......
...@@ -37,21 +37,27 @@ namespace VulnCrawler ...@@ -37,21 +37,27 @@ namespace VulnCrawler
37 var table = new Dictionary<string, IEnumerable<string>>(); 37 var table = new Dictionary<string, IEnumerable<string>>();
38 string prevMethodName = string.Empty; 38 string prevMethodName = string.Empty;
39 StringBuilder builder = new StringBuilder(); 39 StringBuilder builder = new StringBuilder();
40 +
41 + var regex1 = new Regex("\n", RegexOptions.Compiled);
42 + var regex2 = new Regex(@""".+""", RegexOptions.Compiled);
43 + var regex3 = new Regex(@"^[+-]\s", RegexOptions.Compiled);
44 + var regex4 = new Regex(@"^[+-]\s*(\*|\/\*|\*\/)", RegexOptions.Compiled);
40 // 라인으로 나누고 @@가 시작하는 곳까지 생략 45 // 라인으로 나누고 @@가 시작하는 곳까지 생략
41 - var split = Regex.Split(srcCode, "\n").SkipWhile(s => !s.StartsWith("@@")).ToArray(); 46 + var split = regex1.Split(srcCode).SkipWhile(s => !s.StartsWith("@@")).ToArray();
42 for(int i = 0; i < split.Length; i++) 47 for(int i = 0; i < split.Length; i++)
43 { 48 {
44 string line = split[i].Trim(); 49 string line = split[i].Trim();
45 // 문자열 제거 50 // 문자열 제거
46 - line = Regex.Replace(line, @""".+""", ""); 51 + //line = Regex.Replace(line, @""".+""", "");
52 + line = regex2.Replace(line, "");
47 53
48 var methodMatch = extractMethodLine.Match(line); 54 var methodMatch = extractMethodLine.Match(line);
49 string methodName = methodMatch.Groups[MethodName].Value.Trim(); 55 string methodName = methodMatch.Groups[MethodName].Value.Trim();
50 // 추가된, 제거된 라인인지 확인 56 // 추가된, 제거된 라인인지 확인
51 - if (Regex.IsMatch(line, @"^[+-]\s")) 57 + if (regex3.IsMatch(line))
52 { 58 {
53 // 주석문인지 확인 59 // 주석문인지 확인
54 - if (Regex.IsMatch(line, @"^[+-]\s*(\*|\/\*|\*\/)")) 60 + if (regex4.IsMatch(line))
55 { 61 {
56 continue; 62 continue;
57 } 63 }
...@@ -111,20 +117,32 @@ namespace VulnCrawler ...@@ -111,20 +117,32 @@ namespace VulnCrawler
111 string commentPattern = @"\/\*.+\*\/"; 117 string commentPattern = @"\/\*.+\*\/";
112 string commentPattern2 = @"\/\*"; 118 string commentPattern2 = @"\/\*";
113 string commentPattern3 = @"\*\/"; 119 string commentPattern3 = @"\*\/";
120 + var regex1 = new Regex(commentPattern3, RegexOptions.Compiled);
121 + var regex2 = new Regex(stringPattern, RegexOptions.Compiled);
122 + var regex3 = new Regex(commentPattern2, RegexOptions.Compiled);
123 + var regex4 = new Regex(commentPattern, RegexOptions.Compiled);
124 + var regex5 = new Regex($"{method}", RegexOptions.Compiled);
125 + var regex6 = new Regex($@"""[.]*({method})", RegexOptions.Compiled);
126 + var regex7 = new Regex($@"{method}\s*" + @"\{", RegexOptions.Compiled);
114 while (!reader.EndOfStream) { 127 while (!reader.EndOfStream) {
115 string line = reader.ReadLine(); 128 string line = reader.ReadLine();
116 // 메서드를 찾은 경우 129 // 메서드를 찾은 경우
130 +
117 if (found) 131 if (found)
118 { 132 {
119 string trim = line.Trim(); 133 string trim = line.Trim();
120 // 범위 주석 진행되고 있으면 넘어감 134 // 범위 주석 진행되고 있으면 넘어감
135 + if (trim.StartsWith("#"))
136 + {
137 + continue;
138 + }
121 if (commentLine) 139 if (commentLine)
122 { 140 {
123 // 혹시 범위 주석이 끝났는지 체크 141 // 혹시 범위 주석이 끝났는지 체크
124 - if (Regex.IsMatch(trim, commentPattern3)) 142 + if (regex1.IsMatch(trim))
125 { 143 {
126 commentLine = false; 144 commentLine = false;
127 - trim = Regex.Split(trim, commentPattern3)[1]; 145 + trim = regex1.Split(trim)[1];
128 } 146 }
129 else 147 else
130 { 148 {
...@@ -132,13 +150,12 @@ namespace VulnCrawler ...@@ -132,13 +150,12 @@ namespace VulnCrawler
132 } 150 }
133 } 151 }
134 // "" 문자열 제거 152 // "" 문자열 제거
135 - string removeString = Regex.Replace(trim, stringPattern, ""); 153 + string removeString = regex2.Replace(trim, "");
136 // /* ~ 패턴 154 // /* ~ 패턴
137 - if (Regex.IsMatch(trim, commentPattern2)) 155 + if (regex3.IsMatch(trim))
138 { 156 {
139 -
140 // /* ~ */ 패턴이 아닌 경우 157 // /* ~ */ 패턴이 아닌 경우
141 - if (!Regex.IsMatch(trim, commentPattern)) 158 + if (!regex4.IsMatch(trim))
142 { 159 {
143 commentLine = true; 160 commentLine = true;
144 } 161 }
...@@ -187,7 +204,7 @@ namespace VulnCrawler ...@@ -187,7 +204,7 @@ namespace VulnCrawler
187 else 204 else
188 { 205 {
189 // 메서드 찾았는지 확인 206 // 메서드 찾았는지 확인
190 - if (Regex.Match(line, $"{method}").Success) 207 + if (regex5.Match(line).Success)
191 { 208 {
192 string trim = line.Trim(); 209 string trim = line.Trim();
193 // 주석으로 시작했다면 넘어감 210 // 주석으로 시작했다면 넘어감
...@@ -202,12 +219,12 @@ namespace VulnCrawler ...@@ -202,12 +219,12 @@ namespace VulnCrawler
202 } 219 }
203 220
204 // 혹시 메서드가 문자열 사이에 있다면 넘어감.. 221 // 혹시 메서드가 문자열 사이에 있다면 넘어감..
205 - if (Regex.Match(trim, $@"""[.]*({method})").Success) 222 + if (regex6.Match(trim).Success)
206 { 223 {
207 continue; 224 continue;
208 } 225 }
209 // 만약 찾은 메서드 라인에서 중괄호 {가 시작된 경우 226 // 만약 찾은 메서드 라인에서 중괄호 {가 시작된 경우
210 - if (Regex.Match(trim, $@"{method}\s*" + @"\{").Success) 227 + if (regex7.Match(trim).Success)
211 { 228 {
212 // 동시에 } 닫히기까지 한 경우 드물겠지만.. 229 // 동시에 } 닫히기까지 한 경우 드물겠지만..
213 if (trim.EndsWith("}")) 230 if (trim.EndsWith("}"))
...@@ -459,9 +476,21 @@ namespace VulnCrawler ...@@ -459,9 +476,21 @@ namespace VulnCrawler
459 var split = blockCode.Split('\n'); 476 var split = blockCode.Split('\n');
460 var varName = "VAL"; 477 var varName = "VAL";
461 var methodName = "FUNC"; 478 var methodName = "FUNC";
479 + var d = new Dictionary<string, string>();
480 +
481 +
462 int varIdx = dict.Count(); 482 int varIdx = dict.Count();
463 int methodIdx = methodDict.Count(); 483 int methodIdx = methodDict.Count();
464 484
485 + var dict2 = new Dictionary<string, string>();
486 + var methodDict2 = new Dictionary<string, string>();
487 + int varIdx2 = 0;
488 + int methodIdx2 = 0;
489 +
490 +
491 + //var regex1 = new Regex(@"\s*$|^\s*", RegexOptions.Compiled);
492 + var regex1 = new Regex(@"\s*$", RegexOptions.Compiled);
493 +
465 var removes = Regex.Split(blockCode, Environment.NewLine, RegexOptions.Multiline); 494 var removes = Regex.Split(blockCode, Environment.NewLine, RegexOptions.Multiline);
466 StringBuilder builder = new StringBuilder(); 495 StringBuilder builder = new StringBuilder();
467 Console.ForegroundColor = ConsoleColor.DarkYellow; 496 Console.ForegroundColor = ConsoleColor.DarkYellow;
...@@ -471,51 +500,100 @@ namespace VulnCrawler ...@@ -471,51 +500,100 @@ namespace VulnCrawler
471 { 500 {
472 continue; 501 continue;
473 } 502 }
474 - Console.Write(item); 503 + string rm = regex1.Replace(item, "");
475 - builder.Append(item); 504 + builder.Append(rm);
476 - // Console.ReadLine();
477 } 505 }
478 -// Console.WriteLine(builder.ToString()); 506 + Console.WriteLine(builder.ToString());
479 Console.ResetColor(); 507 Console.ResetColor();
480 - foreach (var line in split) 508 + string line = builder.ToString();
509 +
510 + var varList = ExtractMethodVariantList(line, skipDefine: false);
511 + if (varList == null)
481 { 512 {
482 - var varList = ExtractMethodVariantList(line, skipDefine: false); 513 + return string.Empty;
483 - if (varList == null) 514 + }
515 + foreach (var var in varList.Vars)
516 + {
517 + if (!dict.ContainsKey(var))
484 { 518 {
485 - continue; 519 + dict[var] = varName + varIdx++;
486 } 520 }
487 - foreach (var var in varList.Vars) 521 +
522 + if (!dict2.ContainsKey(var))
488 { 523 {
489 - if (!dict.ContainsKey(var)) 524 + dict2[var] = varName + varIdx2++;
490 - {
491 - dict[var] = varName + varIdx++;
492 - }
493 } 525 }
494 526
495 - foreach (var m in varList.Methods) 527 +
528 + }
529 +
530 + foreach (var m in varList.Methods)
531 + {
532 + if (!methodDict.ContainsKey(m))
496 { 533 {
497 - if (!methodDict.ContainsKey(m)) 534 + methodDict[m] = methodName + methodIdx++;
498 - { 535 + }
499 - methodDict[m] = methodName + methodIdx++; 536 + if (!methodDict2.ContainsKey(m))
500 - } 537 + {
538 + methodDict2[m] = methodName + methodIdx2++;
501 } 539 }
502 -
503 } 540 }
504 541
505 - var sortVarDict = dict.OrderByDescending(p => p.Key).ToDictionary(p => p.Key, p => p.Value); 542 + //var sortVarDict = dict.OrderByDescending(p => p.Key).ToDictionary(p => p.Key, p => p.Value);
506 - var sortMethodDict = methodDict.OrderByDescending(p => p.Key).ToDictionary(p => p.Key, p => p.Value); 543 + //var sortMethodDict = methodDict.OrderByDescending(p => p.Key).ToDictionary(p => p.Key, p => p.Value);
544 +
545 + var sortVarDict2 = dict2.OrderByDescending(p => p.Key).ToDictionary(p => p.Key, p => p.Value);
546 + var sortMethodDict2 = methodDict2.OrderByDescending(p => p.Key).ToDictionary(p => p.Key, p => p.Value);
507 547
508 string temp = blockCode; 548 string temp = blockCode;
509 - foreach (var pair in sortVarDict) 549 + foreach (var pair in sortVarDict2)
510 { 550 {
511 - temp = Regex.Replace(temp, $@"\b{pair.Key}\b", pair.Value); 551 + string pk = pair.Key;
512 - } 552 + string pv = pair.Value;
553 +
554 + if (pk.Contains("->"))
555 + {
556 + var connects = Regex.Split(pk, "->");
557 + var connectList = new List<string>();
558 +
559 + string result = string.Empty;
560 + string s = string.Empty;
561 + foreach (var c in connects)
562 + {
563 + if (s == string.Empty)
564 + {
565 + s = c;
566 + continue;
567 + }
513 568
514 - foreach (var pair in sortMethodDict) 569 + if (sortVarDict2.ContainsKey(s))
570 + {
571 + if (result == string.Empty)
572 + {
573 + result = sortVarDict2[s];
574 + }
575 + else
576 + {
577 + result = string.Join("->", result, sortVarDict2[s]);
578 + }
579 + }
580 + s = string.Join("->", s, c);
581 + }
582 + if (result != string.Empty)
583 + {
584 + result = string.Join("->", result, pv);
585 + pv = result;
586 + }
587 +
588 + }
589 +
590 + temp = Regex.Replace(temp, $@"\b{pk}\b", pv);
591 + }
592 + foreach (var pair in sortMethodDict2)
515 { 593 {
516 temp = Regex.Replace(temp, $@"\b{pair.Key}\b", pair.Value); 594 temp = Regex.Replace(temp, $@"\b{pair.Key}\b", pair.Value);
517 -
518 } 595 }
596 +
519 temp = Regex.Replace(temp, @"\s", "", RegexOptions.Multiline); 597 temp = Regex.Replace(temp, @"\s", "", RegexOptions.Multiline);
520 temp = Regex.Replace(temp, @"{|}|;|\)|\(", ""); 598 temp = Regex.Replace(temp, @"{|}|;|\)|\(", "");
521 temp = temp.ToUpper(); 599 temp = temp.ToUpper();
......