노현종

1차 완성(테스트 완료)

...@@ -21,10 +21,7 @@ namespace VulnCrawler ...@@ -21,10 +21,7 @@ namespace VulnCrawler
21 #region MySql 연결 21 #region MySql 연결
22 //SecureString s_key = GetConsoleSecurePassword(); 22 //SecureString s_key = GetConsoleSecurePassword();
23 //Console.Clear(); 23 //Console.Clear();
24 - //string key = SecureStringToString(s_key); 24 + //string key = SecureStringToString(s_key)
25 - //AWS.account.Id = "yhackerbv";
26 - //AWS.account.Pw = "guswhd12";
27 - //AWS.account.Endpoint = "vulndb.cby38wfppa7l.us-east-2.rds.amazonaws.com";
28 //AWS.SaveAccount(); 25 //AWS.SaveAccount();
29 //AES aes = new AES(); 26 //AES aes = new AES();
30 27
...@@ -81,7 +78,7 @@ namespace VulnCrawler ...@@ -81,7 +78,7 @@ namespace VulnCrawler
81 /* 폴더 중에 linux가 있으면 잠깐 넘어감 (너무 커서 테스트 힘듦) */ 78 /* 폴더 중에 linux가 있으면 잠깐 넘어감 (너무 커서 테스트 힘듦) */
82 if (directory.Contains("linux")) 79 if (directory.Contains("linux"))
83 { 80 {
84 - continue; 81 + // continue;
85 } 82 }
86 // 템플릿 패턴화 T : VulnAbstractCrawler 83 // 템플릿 패턴화 T : VulnAbstractCrawler
87 VulnWorker.Run<VulnC>(directory); 84 VulnWorker.Run<VulnC>(directory);
......
...@@ -65,8 +65,12 @@ namespace VulnCrawler ...@@ -65,8 +65,12 @@ namespace VulnCrawler
65 } 65 }
66 // 소멸자 66 // 소멸자
67 ~VulnAbstractCrawler() { 67 ~VulnAbstractCrawler() {
68 + try
69 + {
68 Repository?.Dispose(); 70 Repository?.Dispose();
69 } 71 }
72 + catch { }
73 + }
70 74
71 private void LoadReservedList() 75 private void LoadReservedList()
72 { 76 {
...@@ -223,7 +227,7 @@ namespace VulnCrawler ...@@ -223,7 +227,7 @@ namespace VulnCrawler
223 // 괄호가 모두 닫혔으니 종료 227 // 괄호가 모두 닫혔으니 종료
224 if (bracketCount < 0) 228 if (bracketCount < 0)
225 { 229 {
226 - Console.WriteLine("괄호끝"); 230 + // Console.WriteLine("괄호끝");
227 break; 231 break;
228 } 232 }
229 // oldBuilder.AppendLine(line); 233 // oldBuilder.AppendLine(line);
...@@ -271,34 +275,36 @@ namespace VulnCrawler ...@@ -271,34 +275,36 @@ namespace VulnCrawler
271 string md5 = string.Empty; 275 string md5 = string.Empty;
272 if (item.Value.Count() != 0) 276 if (item.Value.Count() != 0)
273 { 277 {
274 - Console.WriteLine("크리티컬 변수 목록"); 278 + //Console.WriteLine("크리티컬 변수 목록");
275 - Console.ForegroundColor = ConsoleColor.Cyan; 279 + //Console.ForegroundColor = ConsoleColor.Cyan;
276 - foreach (var c in item.Value) 280 + //foreach (var c in item.Value)
277 - { 281 + //{
278 - Console.WriteLine(c); 282 + // Console.WriteLine(c);
279 - } 283 + //}
280 - Console.ResetColor(); 284 + //Console.ResetColor();
281 - Console.WriteLine("-------------------"); 285 + //Console.WriteLine("-------------------");
282 // 크리티컬 블록 추출 286 // 크리티컬 블록 추출
283 - var blocks = GetCriticalBlocks(func, item.Value).ToList(); 287 + var blocks = new List<Block>();
284 - if (blocks == null) 288 + //var blocks = GetCriticalBlocks(func, item.Value).ToList();
285 - { 289 + //if (blocks == null)
286 - continue; 290 + //{
287 - } 291 + // continue;
288 - foreach (var block in blocks) 292 + //}
289 - { 293 + //foreach (var block in blocks)
294 + //{
290 295
291 - block.CriticalList = item.Value; 296 + // block.CriticalList = item.Value;
292 - /* 추상화 및 정규화 */ 297 + // /* 추상화 및 정규화 */
293 - block.AbsCode = Abstract(block.Code, varTable, methodTable); 298 + // block.AbsCode = Abstract(block.Code, varTable, methodTable);
294 - block.Hash = MD5HashFunc(block.AbsCode); 299 + // block.Hash = MD5HashFunc(block.AbsCode);
295 300
296 - } 301 + //}
297 /* 추상화 변환 테이블 출력 */ 302 /* 추상화 변환 테이블 출력 */
298 - foreach (var var in varTable) 303 + //foreach (var var in varTable)
299 - { 304 + //{
300 - Console.WriteLine($"{var.Key}, {var.Value}"); 305 + // Console.WriteLine($"{var.Key}, {var.Value}");
301 - } 306 + //}
307 +
302 yield return (methodName, func, blocks); 308 yield return (methodName, func, blocks);
303 } 309 }
304 310
...@@ -644,7 +650,7 @@ namespace VulnCrawler ...@@ -644,7 +650,7 @@ namespace VulnCrawler
644 /// </summary> 650 /// </summary>
645 /// <param name="str">INPUT 문자열</param> 651 /// <param name="str">INPUT 문자열</param>
646 /// <returns>결과 문자열</returns> 652 /// <returns>결과 문자열</returns>
647 - protected static string MD5HashFunc(string str) { 653 + public static string MD5HashFunc(string str) {
648 StringBuilder MD5Str = new StringBuilder(); 654 StringBuilder MD5Str = new StringBuilder();
649 byte[] byteArr = Encoding.ASCII.GetBytes(str); 655 byte[] byteArr = Encoding.ASCII.GetBytes(str);
650 byte[] resultArr = (new MD5CryptoServiceProvider()).ComputeHash(byteArr); 656 byte[] resultArr = (new MD5CryptoServiceProvider()).ComputeHash(byteArr);
......
...@@ -26,7 +26,8 @@ namespace VulnCrawler ...@@ -26,7 +26,8 @@ namespace VulnCrawler
26 /// <param name="patchCode">패치 코드</param> 26 /// <param name="patchCode">패치 코드</param>
27 /// <returns></returns> 27 /// <returns></returns>
28 public override MatchCollection GetMatches(string patchCode) { 28 public override MatchCollection GetMatches(string patchCode) {
29 - var regs = Regex.Matches(patchCode, RegexFuncPattern); 29 + var funcPattern = $@"(?<{MethodName}>(unsigned|static)?( const )? [\w]+ [\w]+\(([\w \*\,\t\n])*[\)\,])";
30 + var regs = Regex.Matches(patchCode, funcPattern);
30 return regs; 31 return regs;
31 } 32 }
32 /// <summary> 33 /// <summary>
...@@ -82,7 +83,7 @@ namespace VulnCrawler ...@@ -82,7 +83,7 @@ namespace VulnCrawler
82 { 83 {
83 continue; 84 continue;
84 } 85 }
85 - Console.WriteLine(line); 86 + // Console.WriteLine(line);
86 builder.AppendLine(line); 87 builder.AppendLine(line);
87 continue; 88 continue;
88 } 89 }
......
...@@ -139,7 +139,9 @@ namespace VulnCrawler ...@@ -139,7 +139,9 @@ namespace VulnCrawler
139 //콘솔출력용 139 //콘솔출력용
140 sql = "INSERT INTO vuln_Info(vulnId, cve, funcName, lenFunc, code, blockHash, url) " + 140 sql = "INSERT INTO vuln_Info(vulnId, cve, funcName, lenFunc, code, blockHash, url) " +
141 $"VALUES({last_vulnId}, {vuln.Cve}, '{vuln.FuncName}', '{vuln.LenFunc}', {vuln.Code},'{vuln.BlockHash}', '{vuln.Url}')"; 141 $"VALUES({last_vulnId}, {vuln.Cve}, '{vuln.FuncName}', '{vuln.LenFunc}', {vuln.Code},'{vuln.BlockHash}', '{vuln.Url}')";
142 - Console.WriteLine(sql); 142 + //Console.WriteLine(sql);
143 + //Console.ReadLine();
144 +
143 } 145 }
144 catch (Exception e) 146 catch (Exception e)
145 { 147 {
...@@ -150,7 +152,7 @@ namespace VulnCrawler ...@@ -150,7 +152,7 @@ namespace VulnCrawler
150 Connect(Account, DbName); 152 Connect(Account, DbName);
151 goto Retry; 153 goto Retry;
152 } 154 }
153 - Console.ReadLine(); 155 + //Console.ReadLine();
154 } 156 }
155 } 157 }
156 public static void InsertUserData(User user) 158 public static void InsertUserData(User user)
......
...@@ -20,15 +20,26 @@ namespace VulnCrawler ...@@ -20,15 +20,26 @@ namespace VulnCrawler
20 crawler.Init(dirPath); 20 crawler.Init(dirPath);
21 /* 초기화된 커밋 목록 가져옴 */ 21 /* 초기화된 커밋 목록 가져옴 */
22 var commits = crawler.Commits; 22 var commits = crawler.Commits;
23 + int totalCount = commits.Count();
24 + int count = 0;
23 foreach (var commit in commits) { 25 foreach (var commit in commits) {
24 // 커밋 메시지 26 // 커밋 메시지
27 + count++;
28 + double per = ((double)count / (double)totalCount) * 100;
29 +
30 + Console.Clear();
31 + Console.WriteLine($"{count} / {totalCount} :: {per.ToString("#0.0")}%");
32 +
25 string message = commit.Message; 33 string message = commit.Message;
26 string cve = crawler.GetCVE(message); 34 string cve = crawler.GetCVE(message);
27 if (string.IsNullOrEmpty(cve)) { 35 if (string.IsNullOrEmpty(cve)) {
28 continue; 36 continue;
29 } 37 }
38 +
30 foreach (var parent in commit.Parents) { 39 foreach (var parent in commit.Parents) {
31 40
41 + try
42 + {
32 // 부모 커밋과 현재 커밋을 Compare 하여 패치 내역을 가져옴 43 // 부모 커밋과 현재 커밋을 Compare 하여 패치 내역을 가져옴
33 var patch = crawler.Repository.Diff.Compare<Patch>(parent.Tree, commit.Tree); 44 var patch = crawler.Repository.Diff.Compare<Patch>(parent.Tree, commit.Tree);
34 // 패치 엔트리 파일 배열 중에 파일 확장자가 .py인 것만 가져옴 45 // 패치 엔트리 파일 배열 중에 파일 확장자가 .py인 것만 가져옴
...@@ -41,6 +52,9 @@ namespace VulnCrawler ...@@ -41,6 +52,9 @@ namespace VulnCrawler
41 PrintPatchEntrys(entrys, crawler, message, cve, repoName); 52 PrintPatchEntrys(entrys, crawler, message, cve, repoName);
42 // Console.ReadLine(); 53 // Console.ReadLine();
43 } 54 }
55 + catch(Exception)
56 + { }
57 + }
44 } 58 }
45 } 59 }
46 60
...@@ -64,33 +78,33 @@ namespace VulnCrawler ...@@ -64,33 +78,33 @@ namespace VulnCrawler
64 // 출력 78 // 출력
65 if (regs.Count > 0) 79 if (regs.Count > 0)
66 { 80 {
67 - int deleted = entry.LinesDeleted; 81 + //int deleted = entry.LinesDeleted;
68 - if (deleted == 0) 82 + //if (deleted == 0)
69 - { 83 + //{
70 - continue; 84 + // // continue;
71 - } 85 + //}
72 - Console.BackgroundColor = ConsoleColor.DarkBlue; 86 + //Console.BackgroundColor = ConsoleColor.DarkBlue;
73 - Console.WriteLine($"Old Content: \n{oldContent}"); 87 + //Console.WriteLine($"Old Content: \n{oldContent}");
74 - Console.ResetColor(); 88 + //Console.ResetColor();
75 - 89 +
76 - Console.ForegroundColor = ConsoleColor.Blue; 90 + //Console.ForegroundColor = ConsoleColor.Blue;
77 - Console.WriteLine($"status: {entry.Status.ToString()}"); 91 + //Console.WriteLine($"status: {entry.Status.ToString()}");
78 - Console.WriteLine($"added: {entry.LinesAdded.ToString()}, deleted: {entry.LinesDeleted.ToString()}"); 92 + //Console.WriteLine($"added: {entry.LinesAdded.ToString()}, deleted: {entry.LinesDeleted.ToString()}");
79 - Console.WriteLine($"old path: {entry.OldPath.ToString()}, new path: {entry.Path.ToString()}"); 93 + //Console.WriteLine($"old path: {entry.OldPath.ToString()}, new path: {entry.Path.ToString()}");
80 - Console.ResetColor(); 94 + //Console.ResetColor();
81 - 95 +
82 - 96 +
83 - Console.Write($"CVE: "); 97 + //Console.Write($"CVE: ");
84 - Console.ForegroundColor = ConsoleColor.Red; 98 + //Console.ForegroundColor = ConsoleColor.Red;
85 - Console.Write($"{cve}"); 99 + //Console.Write($"{cve}");
86 - Console.WriteLine(""); 100 + //Console.WriteLine("");
87 - Console.ResetColor(); 101 + //Console.ResetColor();
88 - Console.ForegroundColor = ConsoleColor.Yellow; 102 + //Console.ForegroundColor = ConsoleColor.Yellow;
89 - Console.WriteLine($"Commit Message: {commitMsg}"); 103 + //Console.WriteLine($"Commit Message: {commitMsg}");
90 - Console.ResetColor(); 104 + //Console.ResetColor();
91 - Console.BackgroundColor = ConsoleColor.DarkRed; 105 + //Console.BackgroundColor = ConsoleColor.DarkRed;
92 - Console.WriteLine($"Patched: \n{entry.Patch}"); 106 + //Console.WriteLine($"Patched: \n{entry.Patch}");
93 - Console.ResetColor(); 107 + //Console.ResetColor();
94 /* 패치된 코드들에서 Method로 나누고 크리티컬 변수로 뽑아옴 Dictionary 구조 (키 = 함수명) */ 108 /* 패치된 코드들에서 Method로 나누고 크리티컬 변수로 뽑아옴 Dictionary 구조 (키 = 함수명) */
95 var table = self.ExtractGitCriticalMethodTable(entry.Patch); 109 var table = self.ExtractGitCriticalMethodTable(entry.Patch);
96 /* 크리티컬 메서드 테이블과 패치 전 파일에서 Process 하고 tuple로 가져옴 */ 110 /* 크리티컬 메서드 테이블과 패치 전 파일에서 Process 하고 tuple로 가져옴 */
...@@ -98,10 +112,10 @@ namespace VulnCrawler ...@@ -98,10 +112,10 @@ namespace VulnCrawler
98 { 112 {
99 /* 메서드 이름, 원본 함수 코드, 블록 리스트(크리티컬 포함) */ 113 /* 메서드 이름, 원본 함수 코드, 블록 리스트(크리티컬 포함) */
100 (var methodName, var oriFunc, var blocks) = tuple; 114 (var methodName, var oriFunc, var blocks) = tuple;
101 - Console.BackgroundColor = ConsoleColor.DarkRed; 115 + //Console.BackgroundColor = ConsoleColor.DarkRed;
102 - Console.WriteLine($"메서드 이름 : {methodName}"); 116 + //Console.WriteLine($"메서드 이름 : {methodName}");
103 - Console.ResetColor(); 117 + //Console.ResetColor();
104 - //foreach (var block in blocks) 118 + ////foreach (var block in blocks)
105 //{ 119 //{
106 // /* 크리티컬 블록이 아니면 볼 필요 없으니 넘어감 */ 120 // /* 크리티컬 블록이 아니면 볼 필요 없으니 넘어감 */
107 // if (!block.HasCritical) 121 // if (!block.HasCritical)
...@@ -146,26 +160,41 @@ namespace VulnCrawler ...@@ -146,26 +160,41 @@ namespace VulnCrawler
146 /* VulnDB에 추가 */ 160 /* VulnDB에 추가 */
147 //VulnRDS.InsertVulnData(vuln); 161 //VulnRDS.InsertVulnData(vuln);
148 //} 162 //}
163 +
164 + if (string.IsNullOrWhiteSpace(oriFunc))
165 + {
166 + continue;
167 + }
149 string abstractCode = self.Abstract(oriFunc, new Dictionary<string, string>(), new Dictionary<string, string>()); 168 string abstractCode = self.Abstract(oriFunc, new Dictionary<string, string>(), new Dictionary<string, string>());
150 169
151 byte[] funcNameBytes = Encoding.Unicode.GetBytes(methodName); 170 byte[] funcNameBytes = Encoding.Unicode.GetBytes(methodName);
152 byte[] absCodeBytes = Encoding.Unicode.GetBytes(abstractCode); 171 byte[] absCodeBytes = Encoding.Unicode.GetBytes(abstractCode);
153 - VulnRDS.Vuln vuln = new VulnRDS.Vuln() 172 + byte[] commitMsgBytes = Encoding.Unicode.GetBytes(commitMsg);
173 + byte[] funcBytes = Encoding.Unicode.GetBytes(oriFunc);
174 + VulnRDS._Vuln vuln = new VulnRDS._Vuln()
154 { 175 {
155 - BlockHash = Convert.ToBase64String(absCodeBytes), 176 + LenFunc = oriFunc.Length,
156 Cve = cve, 177 Cve = cve,
157 - LenBlock = oriFunc.Length, 178 + BlockHash = VulnAbstractCrawler.MD5HashFunc(Convert.ToBase64String(absCodeBytes)),
158 FuncName = Convert.ToBase64String(funcNameBytes), 179 FuncName = Convert.ToBase64String(funcNameBytes),
180 + Code = Convert.ToBase64String(funcBytes),
181 + Url = Convert.ToBase64String(commitMsgBytes),
182 + //BlockHash = Convert.ToBase64String(absCodeBytes),
183 + //Cve = cve,
184 + //LenBlock = oriFunc.Length,
185 + //FuncName = Convert.ToBase64String(funcNameBytes),
159 }; 186 };
160 - Console.WriteLine(vuln.BlockHash); 187 + // Console.WriteLine(vuln.BlockHash);
161 - Console.ReadLine(); 188 + // Console.ReadLine();
162 /* VulnDB에 추가 */ 189 /* VulnDB에 추가 */
163 - //VulnRDS.InsertVulnData(vuln); 190 + VulnRDS._InsertVulnData(vuln);
164 191
165 } 192 }
166 } 193 }
167 else 194 else
168 { 195 {
196 + //Console.WriteLine("zzz");
197 + //Console.ReadLine();
169 continue; 198 continue;
170 } 199 }
171 200
...@@ -174,6 +203,8 @@ namespace VulnCrawler ...@@ -174,6 +203,8 @@ namespace VulnCrawler
174 } 203 }
175 catch (Exception e) 204 catch (Exception e)
176 { 205 {
206 + //Console.WriteLine(e.ToString());
207 + //Console.ReadLine();
177 continue; 208 continue;
178 } 209 }
179 210
......
This diff is collapsed. Click to expand it.
1  1 
2 +using BloomFilter;
2 using System; 3 using System;
3 using System.Collections.Generic; 4 using System.Collections.Generic;
4 using System.IO; 5 using System.IO;
...@@ -14,6 +15,47 @@ namespace VulnUserCodeAnalyzer ...@@ -14,6 +15,47 @@ namespace VulnUserCodeAnalyzer
14 { 15 {
15 static void Main(string[] args) 16 static void Main(string[] args)
16 { 17 {
18 +
19 + // default usage
20 + int capacity = 20000000;
21 + var filter = new Filter<string>(capacity);
22 + //filter.Add("1");
23 + // filter.Add("1");
24 + //Console.WriteLine(filter.Contains("1"));
25 + //Console.WriteLine(filter.Contains("content2"));
26 +
27 + /* AWS 계정 정보 파일 읽음 */
28 + string txt = File.ReadAllText(@"Account.xml");
29 + // string xml = aes.AESDecrypt128(txt, key);
30 + string xml = txt;
31 +
32 + AWS.LoadAccount(xml);
33 + AWS.Account account = AWS.account;
34 +
35 + /* AWS 정보 출력 */
36 + Console.WriteLine($"Endpoint: {account.Endpoint}, ID: {account.Id}, PW: {account.Pw}");
37 + try
38 + {
39 + /* DB 접속 시도 */
40 + VulnRDS.Connect(account, "vuln");
41 + }
42 + catch (Exception e)
43 + {
44 + Console.WriteLine($"접속 에러 :: {e.ToString()}");
45 + }
46 +
47 + /* AWS 연결 여부 확인 */
48 + if (VulnRDS.Conn.State == System.Data.ConnectionState.Open)
49 + {
50 + Console.WriteLine("접속 성공");
51 +
52 + }
53 + else
54 + {
55 + Console.WriteLine("연결 실패");
56 + return;
57 + }
58 +
17 var hashDict = new Dictionary<int, HashSet<VulnAbstractCrawler.UserBlock>>(); 59 var hashDict = new Dictionary<int, HashSet<VulnAbstractCrawler.UserBlock>>();
18 60
19 DirectoryInfo dirInfo = new DirectoryInfo(@"c:\code"); 61 DirectoryInfo dirInfo = new DirectoryInfo(@"c:\code");
...@@ -39,6 +81,7 @@ namespace VulnUserCodeAnalyzer ...@@ -39,6 +81,7 @@ namespace VulnUserCodeAnalyzer
39 { 81 {
40 hash.Path = codeFile.FullName; 82 hash.Path = codeFile.FullName;
41 hashDict[item.Key].Add(hash); 83 hashDict[item.Key].Add(hash);
84 + filter.Add(hash.Hash);
42 } 85 }
43 } 86 }
44 87
...@@ -48,7 +91,7 @@ namespace VulnUserCodeAnalyzer ...@@ -48,7 +91,7 @@ namespace VulnUserCodeAnalyzer
48 Console.Clear(); 91 Console.Clear();
49 Console.WriteLine($"{count} / {totalFileCount} :: {per.ToString("#0.0")}%, 개체 수 : {hashDict.Count}"); 92 Console.WriteLine($"{count} / {totalFileCount} :: {per.ToString("#0.0")}%, 개체 수 : {hashDict.Count}");
50 93
51 - //if (count > 20) 94 + //if (count > 100)
52 //{ 95 //{
53 // break; 96 // break;
54 //} 97 //}
...@@ -60,12 +103,56 @@ namespace VulnUserCodeAnalyzer ...@@ -60,12 +103,56 @@ namespace VulnUserCodeAnalyzer
60 foreach (var set in hashDict) 103 foreach (var set in hashDict)
61 { 104 {
62 Console.WriteLine($"-----key:{set.Key}"); 105 Console.WriteLine($"-----key:{set.Key}");
63 - foreach (var hash in set.Value) 106 + var vulnList = VulnRDS.SelectVulnbyLen(set.Key);
107 + foreach (var vuln in vulnList)
108 + {
109 + // Console.WriteLine(vuln.BlockHash);
110 + if (filter.Contains(vuln.BlockHash))
111 + {
112 + Console.WriteLine($"필터 확인 : {vuln.BlockHash}");
113 + if (hashDict.ContainsKey(vuln.LenFunc))
64 { 114 {
65 - Console.WriteLine($"{hash.FuncName}, {hash.Hash}, {hash.Len}, {hash.Path}"); 115 + var userBlock = hashDict[vuln.LenFunc].FirstOrDefault(b => b.Hash == vuln.BlockHash);
116 + if (userBlock == null)
117 + {
118 + Console.WriteLine("userBlock이 비어있습니다.");
119 + continue;
120 + }
121 +
122 + Console.WriteLine($"{userBlock.FuncName} 블록 확인 : DB : {vuln.BlockHash}, User : {userBlock.Hash}");
123 +
124 +
66 } 125 }
67 } 126 }
68 127
128 + }
129 + //foreach (var hash in set.Value)
130 + //{
131 +
132 + // Console.WriteLine($"{hash.FuncName}, {hash.Hash}, {hash.Len}, {hash.Path}");
133 + //}
134 + }
135 +
136 +
137 + // 블룸 필터 테스트
138 + //while(true)
139 + //{
140 + // string key = Console.ReadLine();
141 + // if (key == "-1")
142 + // {
143 + // break;
144 + // }
145 + // if (filter.Contains(key))
146 + // {
147 + // Console.WriteLine("포함");
148 + // }
149 + // else
150 + // {
151 + // Console.WriteLine("없음");
152 + // }
153 +
154 +
155 + //}
69 156
70 157
71 } 158 }
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
32 <WarningLevel>4</WarningLevel> 32 <WarningLevel>4</WarningLevel>
33 </PropertyGroup> 33 </PropertyGroup>
34 <ItemGroup> 34 <ItemGroup>
35 + <Reference Include="MySql.Data, Version=8.0.10.0, Culture=neutral, PublicKeyToken=c5687fc88969c44d, processorArchitecture=MSIL" />
35 <Reference Include="System" /> 36 <Reference Include="System" />
36 <Reference Include="System.Core" /> 37 <Reference Include="System.Core" />
37 <Reference Include="System.Xml.Linq" /> 38 <Reference Include="System.Xml.Linq" />
...@@ -42,6 +43,7 @@ ...@@ -42,6 +43,7 @@
42 <Reference Include="System.Xml" /> 43 <Reference Include="System.Xml" />
43 </ItemGroup> 44 </ItemGroup>
44 <ItemGroup> 45 <ItemGroup>
46 + <Compile Include="BloomFilter.cs" />
45 <Compile Include="Program.cs" /> 47 <Compile Include="Program.cs" />
46 <Compile Include="Properties\AssemblyInfo.cs" /> 48 <Compile Include="Properties\AssemblyInfo.cs" />
47 </ItemGroup> 49 </ItemGroup>
......