노현종

C언어 Patch 함수명 추출

...@@ -69,13 +69,13 @@ namespace VulnCrawler ...@@ -69,13 +69,13 @@ namespace VulnCrawler
69 69
70 // var fields = VulnWorker.GetCriticalVariant(@"return _is_safe_url(url, host) and _is_safe_url(url.replace('\\', '/'), host)"); 70 // var fields = VulnWorker.GetCriticalVariant(@"return _is_safe_url(url, host) and _is_safe_url(url.replace('\\', '/'), host)");
71 var c = new VulnC(); 71 var c = new VulnC();
72 - var fields = c.ExtractCriticalVariant(@"!DoReadFile (infile, &ds64_chunk, sizeof (DS64Chunk), &bcount) ||/* aaaa */"); 72 + var fields = c.ExtractCriticalVariant(@"if (s->session->peer != s->session->sess_cert->peer_key->x509)");
73 foreach (var item in fields) 73 foreach (var item in fields)
74 { 74 {
75 Console.WriteLine(item); 75 Console.WriteLine(item);
76 } 76 }
77 // return; 77 // return;
78 - var directorys = Directory.GetDirectories(@"c:\VulnPy"); 78 + var directorys = Directory.GetDirectories(@"c:\VulnC");
79 if (directorys.Length == 0) { 79 if (directorys.Length == 0) {
80 Console.WriteLine("Repository 목록 찾기 실패"); 80 Console.WriteLine("Repository 목록 찾기 실패");
81 return; 81 return;
...@@ -83,7 +83,7 @@ namespace VulnCrawler ...@@ -83,7 +83,7 @@ namespace VulnCrawler
83 // Repository 목록 만큼 반복함. 83 // Repository 목록 만큼 반복함.
84 foreach (var directory in directorys) { 84 foreach (var directory in directorys) {
85 // 템플릿 패턴화 T : VulnAbstractCrawler 85 // 템플릿 패턴화 T : VulnAbstractCrawler
86 - VulnWorker.Run<VulnPython>(directory); 86 + VulnWorker.Run<VulnC>(directory);
87 } 87 }
88 } 88 }
89 89
......
...@@ -73,7 +73,9 @@ namespace VulnCrawler ...@@ -73,7 +73,9 @@ namespace VulnCrawler
73 #endregion 73 #endregion
74 74
75 public void Init(string path) { 75 public void Init(string path) {
76 + Console.WriteLine("로딩중");
76 Repository = new Repository(path); 77 Repository = new Repository(path);
78 + Console.WriteLine("로딩 완료");
77 Commits = SearchCommits(); 79 Commits = SearchCommits();
78 } 80 }
79 /// <summary> 81 /// <summary>
...@@ -88,7 +90,7 @@ namespace VulnCrawler ...@@ -88,7 +90,7 @@ namespace VulnCrawler
88 /// <summary> 90 /// <summary>
89 /// 커밋에서 검색할 정규식 문자열 91 /// 커밋에서 검색할 정규식 문자열
90 /// </summary> 92 /// </summary>
91 - public string SearchCommitPattern => @"CVE-20\d\d-\d{4}"; 93 + public string SearchCommitPattern => @"CVE[ -]\d{4}[ -]\d{4}";
92 /// <summary> 94 /// <summary>
93 /// 패치 코드에서 함수 찾을 정규식 패턴 문자열 95 /// 패치 코드에서 함수 찾을 정규식 패턴 문자열
94 /// </summary> 96 /// </summary>
...@@ -142,6 +144,8 @@ namespace VulnCrawler ...@@ -142,6 +144,8 @@ namespace VulnCrawler
142 /// <returns>커밋 목록</returns> 144 /// <returns>커밋 목록</returns>
143 public virtual IEnumerable<Commit> SearchCommits() { 145 public virtual IEnumerable<Commit> SearchCommits() {
144 // where => 조건에 맞는 것을 찾음(CVE-20\d\d-\d{4}로 시작하는 커밋만 골라냄) 146 // where => 조건에 맞는 것을 찾음(CVE-20\d\d-\d{4}로 시작하는 커밋만 골라냄)
147 + Console.WriteLine("출력중");
148 + Console.WriteLine(Repository.Commits.Count());
145 var commits = Repository.Commits 149 var commits = Repository.Commits
146 .Where(c => Regex.Match(c.Message, SearchCommitPattern, RegexOptions.IgnoreCase).Success) 150 .Where(c => Regex.Match(c.Message, SearchCommitPattern, RegexOptions.IgnoreCase).Success)
147 .ToList(); 151 .ToList();
...@@ -183,7 +187,7 @@ namespace VulnCrawler ...@@ -183,7 +187,7 @@ namespace VulnCrawler
183 // 메서드 정규식 패턴 187 // 메서드 정규식 패턴
184 string methodPattern = @"([a-zA-Z0-9_\.]+)\s*\("; 188 string methodPattern = @"([a-zA-Z0-9_\.]+)\s*\(";
185 // 변수 정규식 패턴 189 // 변수 정규식 패턴
186 - string fieldPattern = @"^*?[a-zA-Z0-9_\.\[\]]+"; 190 + string fieldPattern = @"^*?[a-zA-Z0-9_\.\[\]\-\>]+";
187 191
188 string invalidPattern = @"^[\d\.]+"; 192 string invalidPattern = @"^[\d\.]+";
189 193
......
...@@ -10,7 +10,7 @@ namespace VulnCrawler ...@@ -10,7 +10,7 @@ namespace VulnCrawler
10 { 10 {
11 public class VulnC : VulnAbstractCrawler 11 public class VulnC : VulnAbstractCrawler
12 { 12 {
13 - protected override string RegexFuncPattern => $@"@@ \-(?<{OldStart}>\d+),(?<{OldLines}>\d+) \+(?<{NewStart}>\d+),(?<{NewLines}>\d+) @@ (?<{MethodName}>(static)? [\w]+ [\w]+)\([\w \*\,\t\n]*\)"; 13 + protected override string RegexFuncPattern => $@"@@ \-(?<{OldStart}>\d+),(?<{OldLines}>\d+) \+(?<{NewStart}>\d+),(?<{NewLines}>\d+) @@ (?<{MethodName}>(static)?( const )? [\w]+ [\w]+\([\w \*\,\t\n]*[\)\,])";
14 protected override string Extension => ".c"; 14 protected override string Extension => ".c";
15 protected override string ReservedFileName => "CReserved.txt"; 15 protected override string ReservedFileName => "CReserved.txt";
16 public override MatchCollection GetMatches(string patchCode) { 16 public override MatchCollection GetMatches(string patchCode) {
......
...@@ -17,6 +17,7 @@ namespace VulnCrawler ...@@ -17,6 +17,7 @@ namespace VulnCrawler
17 var crawler = new T(); 17 var crawler = new T();
18 crawler.Init(dirPath); 18 crawler.Init(dirPath);
19 var commits = crawler.Commits; 19 var commits = crawler.Commits;
20 + Console.WriteLine(commits.Count());
20 foreach (var commit in commits) { 21 foreach (var commit in commits) {
21 // 커밋 메시지 22 // 커밋 메시지
22 string message = commit.Message; 23 string message = commit.Message;
...@@ -42,6 +43,9 @@ namespace VulnCrawler ...@@ -42,6 +43,9 @@ namespace VulnCrawler
42 foreach (var entry in entrys) { 43 foreach (var entry in entrys) {
43 // 기존 소스코드 44 // 기존 소스코드
44 var oldOid = entry.OldOid; 45 var oldOid = entry.OldOid;
46 +
47 + try
48 + {
45 Blob oldBlob = self.Repository.Lookup<Blob>(oldOid); 49 Blob oldBlob = self.Repository.Lookup<Blob>(oldOid);
46 string oldContent = oldBlob.GetContentText(); 50 string oldContent = oldBlob.GetContentText();
47 51
...@@ -49,15 +53,14 @@ namespace VulnCrawler ...@@ -49,15 +53,14 @@ namespace VulnCrawler
49 var newOid = entry.Oid; 53 var newOid = entry.Oid;
50 Blob newBlob = self.Repository.Lookup<Blob>(newOid); 54 Blob newBlob = self.Repository.Lookup<Blob>(newOid);
51 string newContent = newBlob.GetContentText(); 55 string newContent = newBlob.GetContentText();
52 -
53 var regs = self.GetMatches(entry.Patch); 56 var regs = self.GetMatches(entry.Patch);
54 -
55 #region 패치 코드 출력 57 #region 패치 코드 출력
56 // 패치 전 코드 (oldContent) 58 // 패치 전 코드 (oldContent)
57 // 패치 후 코드 (newContent) 59 // 패치 후 코드 (newContent)
58 // 패치 코드 (entry.Patch) 60 // 패치 코드 (entry.Patch)
59 // 출력 61 // 출력
60 - //if (regs.Count > 0) { 62 + if (regs.Count > 0)
63 + {
61 // Console.BackgroundColor = ConsoleColor.DarkBlue; 64 // Console.BackgroundColor = ConsoleColor.DarkBlue;
62 // Console.WriteLine($"Old Content: \n{oldContent}"); 65 // Console.WriteLine($"Old Content: \n{oldContent}");
63 // Console.ResetColor(); 66 // Console.ResetColor();
...@@ -65,30 +68,7 @@ namespace VulnCrawler ...@@ -65,30 +68,7 @@ namespace VulnCrawler
65 // Console.BackgroundColor = ConsoleColor.DarkMagenta; 68 // Console.BackgroundColor = ConsoleColor.DarkMagenta;
66 // Console.WriteLine($"New Content: \n{newContent}"); 69 // Console.WriteLine($"New Content: \n{newContent}");
67 // Console.ResetColor(); 70 // Console.ResetColor();
68 - // Console.BackgroundColor = ConsoleColor.DarkRed;
69 - // Console.WriteLine($"Patched: \n{entry.Patch}");
70 -
71 - // Console.ResetColor();
72 - // Console.WriteLine("-----------");
73 - // Console.WriteLine(regs.Count);
74 -
75 - //}
76 -
77 - // 패치 코드에서 매칭된 파이썬 함수들로부터
78 - // 패치 전 코드 파일(oldBlob)을 탐색하여 원본 파이썬 함수 가져오고(originalFunc)
79 - //
80 -#endregion
81 -
82 - foreach (var reg in regs) {
83 - var match = reg as Match;
84 - string methodName = match.Groups[VulnAbstractCrawler.MethodName].Value;
85 71
86 - string originalFunc, md5;
87 -
88 - (originalFunc, md5) = self.Process(oldBlob.GetContentStream(),
89 - match.Groups[VulnAbstractCrawler.MethodName].Value);
90 -
91 - #region 현재 패치 엔트리 정보 출력(추가된 , 삭제된 , 패치 이전 경로, 패치 경로)
92 Console.ForegroundColor = ConsoleColor.Blue; 72 Console.ForegroundColor = ConsoleColor.Blue;
93 Console.WriteLine($"status: {entry.Status.ToString()}"); 73 Console.WriteLine($"status: {entry.Status.ToString()}");
94 Console.WriteLine($"added: {entry.LinesAdded.ToString()}, deleted: {entry.LinesDeleted.ToString()}"); 74 Console.WriteLine($"added: {entry.LinesAdded.ToString()}, deleted: {entry.LinesDeleted.ToString()}");
...@@ -105,12 +85,44 @@ namespace VulnCrawler ...@@ -105,12 +85,44 @@ namespace VulnCrawler
105 Console.WriteLine($"Commit Message: {commitMsg}"); 85 Console.WriteLine($"Commit Message: {commitMsg}");
106 Console.ResetColor(); 86 Console.ResetColor();
107 87
88 +
89 +
90 + Console.BackgroundColor = ConsoleColor.DarkRed;
91 + Console.WriteLine($"Patched: \n{entry.Patch}");
92 +
93 + Console.ResetColor();
94 + // Console.WriteLine("-----------");
95 +
96 +
97 +
98 + }
99 +
100 +
101 +
102 + // 패치 코드에서 매칭된 파이썬 함수들로부터
103 + // 패치 전 코드 파일(oldBlob)을 탐색하여 원본 파이썬 함수 가져오고(originalFunc)
104 + //
105 + #endregion
106 +
107 + foreach (var reg in regs)
108 + {
109 + var match = reg as Match;
110 + string methodName = match.Groups[VulnAbstractCrawler.MethodName].Value.Trim();
111 + Console.WriteLine("methodName = " + methodName);
112 + string originalFunc, md5;
113 + (originalFunc, md5) = self.Process(oldBlob.GetContentStream(),
114 + match.Groups[VulnAbstractCrawler.MethodName].Value);
115 +
116 + #region 현재 패치 엔트리 정보 출력(추가된 , 삭제된 , 패치 이전 경로, 패치 경로)
117 +
118 +
119 +
108 // 패치 전 원본 함수 120 // 패치 전 원본 함수
109 Console.WriteLine($"Original Func: {originalFunc}"); 121 Console.WriteLine($"Original Func: {originalFunc}");
110 // 해쉬 후 122 // 해쉬 후
111 Console.WriteLine($"Original Func MD5: {md5}"); 123 Console.WriteLine($"Original Func MD5: {md5}");
112 - Console.BackgroundColor = ConsoleColor.DarkRed; 124 + //Console.BackgroundColor = ConsoleColor.DarkRed;
113 - Console.WriteLine($"Patched: \n{entry.Patch}"); 125 + //Console.WriteLine($"Patched: \n{entry.Patch}");
114 126
115 Console.ResetColor(); 127 Console.ResetColor();
116 Console.WriteLine("=============================="); 128 Console.WriteLine("==============================");
...@@ -119,6 +131,12 @@ namespace VulnCrawler ...@@ -119,6 +131,12 @@ namespace VulnCrawler
119 131
120 } 132 }
121 } 133 }
134 + catch (Exception)
135 + {
136 + continue;
137 + }
138 +
139 + }
122 } 140 }
123 141
124 } 142 }
......