포인터 변수 추상화 버그 해결, 각 블록마다 추상화를 독립적으로 하도록 변경
a->b->c 같은 포인터 변수를 구분하여 추상화 할 수 있도록 수정, 정규식 성능 최적화
Showing
3 changed files
with
164 additions
and
47 deletions
... | @@ -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(); | ... | ... |
-
Please register or login to post a comment