노현종

UserCodeAnalyzer 구현

...@@ -81,7 +81,7 @@ namespace VulnCrawler ...@@ -81,7 +81,7 @@ namespace VulnCrawler
81 /* 폴더 중에 linux가 있으면 잠깐 넘어감 (너무 커서 테스트 힘듦) */ 81 /* 폴더 중에 linux가 있으면 잠깐 넘어감 (너무 커서 테스트 힘듦) */
82 if (directory.Contains("linux")) 82 if (directory.Contains("linux"))
83 { 83 {
84 - // continue; 84 + continue;
85 } 85 }
86 // 템플릿 패턴화 T : VulnAbstractCrawler 86 // 템플릿 패턴화 T : VulnAbstractCrawler
87 VulnWorker.Run<VulnC>(directory); 87 VulnWorker.Run<VulnC>(directory);
......
...@@ -45,6 +45,7 @@ namespace VulnCrawler ...@@ -45,6 +45,7 @@ namespace VulnCrawler
45 ~VulnAbstractCrawler() { 45 ~VulnAbstractCrawler() {
46 Repository?.Dispose(); 46 Repository?.Dispose();
47 } 47 }
48 +
48 private void LoadReservedList() 49 private void LoadReservedList()
49 { 50 {
50 try 51 try
...@@ -120,6 +121,8 @@ namespace VulnCrawler ...@@ -120,6 +121,8 @@ namespace VulnCrawler
120 /// <returns>함수 문자열</returns> 121 /// <returns>함수 문자열</returns>
121 protected abstract string GetOriginalFunc(Stream oldStream, string methodName); 122 protected abstract string GetOriginalFunc(Stream oldStream, string methodName);
122 123
124 + public abstract IDictionary<int, List<string>> CrawlUserCode(StreamReader reader);
125 +
123 protected abstract IList<Block> GetCriticalBlocks(string srcCode, IEnumerable<string> criticalList); 126 protected abstract IList<Block> GetCriticalBlocks(string srcCode, IEnumerable<string> criticalList);
124 /// <summary> 127 /// <summary>
125 /// 성능 개선을 위한 128 /// 성능 개선을 위한
...@@ -401,11 +404,11 @@ namespace VulnCrawler ...@@ -401,11 +404,11 @@ namespace VulnCrawler
401 return false; 404 return false;
402 } 405 }
403 406
404 - /* 대문자로 구성된 변수면 넘어감 */ 407 + ///* 대문자로 구성된 변수면 넘어감 */
405 - if (skipDefine && m.Value.All(c => char.IsUpper(c) || !char.IsLetter(c))) 408 + //if (skipDefine && m.Value.All(c => char.IsUpper(c) || !char.IsLetter(c)))
406 - { 409 + //{
407 - return false; 410 + // return false;
408 - } 411 + //}
409 412
410 return true; 413 return true;
411 }) 414 })
...@@ -447,11 +450,11 @@ namespace VulnCrawler ...@@ -447,11 +450,11 @@ namespace VulnCrawler
447 return false; 450 return false;
448 } 451 }
449 452
450 - /* 대문자로 구성된 변수면 넘어감 */ 453 + ///* 대문자로 구성된 변수면 넘어감 */
451 - if (skipDefine && m.Value.All(c => char.IsUpper(c) || !char.IsLetter(c))) 454 + //if (skipDefine && m.Value.All(c => char.IsUpper(c) || !char.IsLetter(c)))
452 - { 455 + //{
453 - return false; 456 + // return false;
454 - } 457 + //}
455 458
456 return true; 459 return true;
457 }) 460 })
......
...@@ -12,11 +12,14 @@ namespace VulnCrawler ...@@ -12,11 +12,14 @@ namespace VulnCrawler
12 { 12 {
13 // protected override string RegexFuncPattern => $@"@@ \-(?<{OldStart}>\d+),(?<{OldLines}>\d+) \+(?<{NewStart}>\d+),(?<{NewLines}>\d+) @@ (?<{MethodName}>(static)?( const )? [\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 /* 함수 패턴 정규식 */ 14 /* 함수 패턴 정규식 */
15 - protected override string RegexFuncPattern => $@"(?<{MethodName}>(unsigned|static)?( const )? [\w]+ [\w]+\(([\w \*\,\t\n])*[\)\,])"; 15 + protected override string RegexFuncPattern => $@"^[\w \*]*(?<{MethodName}>[\w\*]+ [\w\*]+\(([\w \*\,\t\n])*[\)\,])";
16 /* 검색 파일 타입 */ 16 /* 검색 파일 타입 */
17 protected override string Extension => ".c"; 17 protected override string Extension => ".c";
18 /* 예약어 파일명 */ 18 /* 예약어 파일명 */
19 protected override string ReservedFileName => "CReserved.txt"; 19 protected override string ReservedFileName => "CReserved.txt";
20 +
21 +
22 +
20 /// <summary> 23 /// <summary>
21 /// 패치 코드에서 함수 목록 뽑는 정규식 24 /// 패치 코드에서 함수 목록 뽑는 정규식
22 /// </summary> 25 /// </summary>
...@@ -549,7 +552,7 @@ namespace VulnCrawler ...@@ -549,7 +552,7 @@ namespace VulnCrawler
549 { 552 {
550 return string.Empty; 553 return string.Empty;
551 } 554 }
552 - foreach (var var in varList.Vars) 555 + foreach (var var in varList.Vars.Where(s => s.All(c => char.IsLower(c) || c == '>' || c == '-' || c == '*' || c == '_')))
553 { 556 {
554 if (!dict.ContainsKey(var)) 557 if (!dict.ContainsKey(var))
555 { 558 {
...@@ -638,5 +641,202 @@ namespace VulnCrawler ...@@ -638,5 +641,202 @@ namespace VulnCrawler
638 641
639 return temp; 642 return temp;
640 } 643 }
644 +
645 + public override IDictionary<int, List<string>> CrawlUserCode(StreamReader reader)
646 + {
647 + var dict = new Dictionary<int, List<string>>();
648 + StringBuilder oldBuilder = new StringBuilder();
649 +
650 + bool found = false;
651 + bool found2 = false;
652 + bool commentLine = false;
653 + int bracketCount = -1;
654 + string stringPattern = @"[""].*[""]";
655 + string commentPattern = @"\/\*.+\*\/";
656 + string commentPattern2 = @"\/\*";
657 + string commentPattern3 = @"\*\/";
658 + var regex1 = new Regex(commentPattern3, RegexOptions.Compiled);
659 + var regex2 = new Regex(stringPattern, RegexOptions.Compiled);
660 + var regex3 = new Regex(commentPattern2, RegexOptions.Compiled);
661 + var regex4 = new Regex(commentPattern, RegexOptions.Compiled);
662 +
663 + bool found3 = false;
664 +
665 +
666 + while (!reader.EndOfStream)
667 + {
668 + string line = reader.ReadLine();
669 + Console.WriteLine(line);
670 + // 메서드를 찾은 경우
671 + if (found3)
672 + {
673 + string obStr = oldBuilder.ToString();
674 + obStr = Abstract(obStr, new Dictionary<string, string>(), new Dictionary<string, string>());
675 +
676 + if (!dict.ContainsKey(obStr.Length))
677 + {
678 + dict[obStr.Length] = new List<string>();
679 + }
680 + dict[obStr.Length].Add(MD5HashFunc(obStr));
681 + oldBuilder.Clear();
682 + found = false;
683 + found2 = false;
684 + found3 = false;
685 + bracketCount = -1;
686 + commentLine = false;
687 +
688 + }
689 + if (found)
690 + {
691 + string trim = line.Trim();
692 + // 범위 주석 진행되고 있으면 넘어감
693 + if (trim.StartsWith("#"))
694 + {
695 + continue;
696 + }
697 + if (commentLine)
698 + {
699 + // 혹시 범위 주석이 끝났는지 체크
700 + if (regex1.IsMatch(trim))
701 + {
702 + commentLine = false;
703 + trim = regex1.Split(trim)[1];
704 + }
705 + else
706 + {
707 + continue;
708 + }
709 + }
710 + // "" 문자열 제거
711 + string removeString = regex2.Replace(trim, "");
712 + // /* ~ 패턴
713 + if (regex3.IsMatch(trim))
714 + {
715 + // /* ~ */ 패턴이 아닌 경우
716 + if (!regex4.IsMatch(trim))
717 + {
718 + commentLine = true;
719 + }
720 + trim = Regex.Split(trim, "/*")[0];
721 +
722 + }
723 + // 비어있는 경우 넘어감
724 + if (string.IsNullOrWhiteSpace(trim))
725 + {
726 + continue;
727 + }
728 + int openBracketCount = removeString.Count(c => c == '{');
729 + int closeBracketCount = removeString.Count(c => c == '}');
730 + int subtract = openBracketCount - closeBracketCount;
731 + bracketCount += subtract;
732 + // 메서드 시작 괄호 찾은 경우
733 + if (found2)
734 + {
735 +
736 + oldBuilder.AppendLine(line);
737 + // 괄호가 모두 닫혔으니 종료
738 + if (bracketCount < 0)
739 + {
740 + if (reader.EndOfStream)
741 + {
742 + Console.WriteLine("파일끝");
743 + }
744 + found3 = true;
745 + continue;
746 + }
747 + }
748 + else // 메서드는 찾았으나 아직 시작 괄호를 못찾은 경우
749 + {
750 + oldBuilder.AppendLine(line);
751 + if (openBracketCount > 0)
752 + {
753 +
754 + found2 = true;
755 + }
756 + else
757 + {
758 + //아직 { 괄호를 못찾았는데 );를 만났다면 메서드 선언 부분이니 넘어감
759 + if (trim.EndsWith(");"))
760 + {
761 + Console.WriteLine("-------");
762 + Console.WriteLine(trim);
763 + Console.WriteLine("-----");
764 + found = false;
765 + oldBuilder.Clear();
766 + continue;
767 + }
768 + }
769 + }
770 + }
771 + // 아직 메서드를 못찾은 경우
772 + else
773 + {
774 + //아직 { 괄호를 못찾았는데 );를 만났다면 메서드 선언 부분이니 넘어감
775 + if (line.Trim().EndsWith(");"))
776 + {
777 + found = false;
778 + oldBuilder.Clear();
779 + continue;
780 + }
781 +
782 + // 메서드 찾았는지 확인
783 + if (Regex.IsMatch(line, RegexFuncPattern))
784 + {
785 + string trim = line.Trim();
786 + // 주석으로 시작했다면 넘어감
787 + if (trim.StartsWith("//"))
788 + {
789 + continue;
790 + }
791 +
792 + if (trim.StartsWith("/*"))
793 + {
794 + continue;
795 + }
796 +
797 + // 만약 찾은 메서드 라인에서 중괄호 {가 시작된 경우
798 + if (trim.Contains("{"))
799 + {
800 + // 동시에 } 닫히기까지 한 경우 드물겠지만..
801 + if (trim.EndsWith("}"))
802 + {
803 + oldBuilder.AppendLine(line);
804 + found3 = true;
805 + continue;
806 + }
807 + found2 = true;
808 + }
809 + // 메서드 찾음
810 + found = true;
811 + oldBuilder.AppendLine(line);
812 + }
813 + }
814 +
815 + }
816 +
817 + if (found3)
818 + {
819 + string obStr = oldBuilder.ToString();
820 + obStr = Abstract(obStr, new Dictionary<string, string>(), new Dictionary<string, string>());
821 +
822 + if (!dict.ContainsKey(obStr.Length))
823 + {
824 + dict[obStr.Length] = new List<string>();
825 + }
826 + dict[obStr.Length].Add(MD5HashFunc(obStr));
827 + oldBuilder.Clear();
828 + found = false;
829 + found2 = false;
830 + found3 = false;
831 + bracketCount = -1;
832 + commentLine = false;
833 +
834 + }
835 +
836 +
837 + return dict;
838 +
839 +
840 + }
641 } 841 }
642 } 842 }
......
...@@ -80,5 +80,10 @@ namespace VulnCrawler ...@@ -80,5 +80,10 @@ namespace VulnCrawler
80 { 80 {
81 throw new NotImplementedException(); 81 throw new NotImplementedException();
82 } 82 }
83 +
84 + public override IDictionary<int, List<string>> CrawlUserCode(StreamReader reader)
85 + {
86 + throw new NotImplementedException();
87 + }
83 } 88 }
84 } 89 }
......
...@@ -100,51 +100,67 @@ namespace VulnCrawler ...@@ -100,51 +100,67 @@ namespace VulnCrawler
100 Console.BackgroundColor = ConsoleColor.DarkRed; 100 Console.BackgroundColor = ConsoleColor.DarkRed;
101 Console.WriteLine($"메서드 이름 : {methodName}"); 101 Console.WriteLine($"메서드 이름 : {methodName}");
102 Console.ResetColor(); 102 Console.ResetColor();
103 - foreach (var block in blocks) 103 + //foreach (var block in blocks)
104 + //{
105 + // /* 크리티컬 블록이 아니면 볼 필요 없으니 넘어감 */
106 + // if (!block.HasCritical)
107 + // {
108 + // // Console.WriteLine("크리티컬 아님");
109 + // continue;
110 + // }
111 +
112 +
113 + // if (block.HasCritical)
114 + // {
115 + // Console.BackgroundColor = ConsoleColor.DarkMagenta;
116 + // }
117 + // else
118 + // {
119 + // Console.BackgroundColor = ConsoleColor.DarkGreen;
120 + // }
121 + // /* 블록 정보 출력(블록 번호, 블록 소스코드, 블록 추상화 코드, 블록 해쉬값) */
122 + // Console.WriteLine($"=====block({block.Num}, {block.HasCritical.ToString()})");
123 + // Console.WriteLine(block.Code);
124 + // Console.ResetColor();
125 + // Console.WriteLine($"AbsCode = \n{block.AbsCode}");
126 + // Console.WriteLine($"MD5 = {block.Hash}");
127 +
128 + // /* base64 인코딩(MySQL에 들어갈 수 없는 문자열이 있을 수 있으므로 인코딩) */
129 + // byte[] funcNameBytes = Encoding.Unicode.GetBytes(methodName);
130 + // byte[] codeOriBeforeBytes = Encoding.Unicode.GetBytes(oriFunc);
131 + // byte[] codeAbsBeforeBytes = Encoding.Unicode.GetBytes(block.AbsCode);
132 +
133 + // /* VulnDB에 하나의 레코드로 들어가는 하나의 취약점 객체 */
134 + // VulnRDS.Vuln vuln = new VulnRDS.Vuln()
135 + // {
136 + // Cve = cve,
137 + // BlockHash = block.Hash,
138 + // LenBlock = block.Code.Length,
139 + // FuncName = Convert.ToBase64String(funcNameBytes),
140 + // //CodeOriBefore = Convert.ToBase64String(codeOriBeforeBytes),
141 + // //CodeAbsBefore = Convert.ToBase64String(codeAbsBeforeBytes),
142 + // //NumBlock = block.Num,
143 + // };
144 + // Console.WriteLine($"Vuln FuncName:{vuln.FuncName}");
145 + /* VulnDB에 추가 */
146 + //VulnRDS.InsertVulnData(vuln);
147 + //}
148 + string abstractCode = self.Abstract(oriFunc, new Dictionary<string, string>(), new Dictionary<string, string>());
149 +
150 + byte[] funcNameBytes = Encoding.Unicode.GetBytes(methodName);
151 + byte[] absCodeBytes = Encoding.Unicode.GetBytes(abstractCode);
152 + VulnRDS.Vuln vuln = new VulnRDS.Vuln()
104 { 153 {
105 - /* 크리티컬 블록이 아니면 볼 필요 없으니 넘어감 */ 154 + BlockHash = Convert.ToBase64String(absCodeBytes),
106 - if (!block.HasCritical) 155 + Cve = cve,
107 - { 156 + LenBlock = oriFunc.Length,
108 - // Console.WriteLine("크리티컬 아님"); 157 + FuncName = Convert.ToBase64String(funcNameBytes),
109 - continue; 158 + };
110 - } 159 + Console.WriteLine(vuln.BlockHash);
111 - 160 + Console.ReadLine();
112 - 161 + /* VulnDB에 추가 */
113 - if (block.HasCritical) 162 + //VulnRDS.InsertVulnData(vuln);
114 - { 163 +
115 - Console.BackgroundColor = ConsoleColor.DarkMagenta;
116 - }
117 - else
118 - {
119 - Console.BackgroundColor = ConsoleColor.DarkGreen;
120 - }
121 - /* 블록 정보 출력(블록 번호, 블록 소스코드, 블록 추상화 코드, 블록 해쉬값) */
122 - Console.WriteLine($"=====block({block.Num}, {block.HasCritical.ToString()})");
123 - Console.WriteLine(block.Code);
124 - Console.ResetColor();
125 - Console.WriteLine($"AbsCode = \n{block.AbsCode}");
126 - Console.WriteLine($"MD5 = {block.Hash}");
127 -
128 - /* base64 인코딩(MySQL에 들어갈 수 없는 문자열이 있을 수 있으므로 인코딩) */
129 - byte[] funcNameBytes = Encoding.Unicode.GetBytes(methodName);
130 - byte[] codeOriBeforeBytes = Encoding.Unicode.GetBytes(oriFunc);
131 - byte[] codeAbsBeforeBytes = Encoding.Unicode.GetBytes(block.AbsCode);
132 -
133 - /* VulnDB에 하나의 레코드로 들어가는 하나의 취약점 객체 */
134 - VulnRDS.Vuln vuln = new VulnRDS.Vuln()
135 - {
136 - Cve = cve,
137 - BlockHash = block.Hash,
138 - LenBlock = block.Code.Length,
139 - FuncName = Convert.ToBase64String(funcNameBytes),
140 - CodeOriBefore = Convert.ToBase64String(codeOriBeforeBytes),
141 - CodeAbsBefore = Convert.ToBase64String(codeAbsBeforeBytes),
142 - NumBlock = block.Num,
143 - };
144 - Console.WriteLine($"Vuln FuncName:{vuln.FuncName}");
145 - /* VulnDB에 추가 */
146 - VulnRDS.InsertVulnData(vuln);
147 - }
148 } 164 }
149 } 165 }
150 else 166 else
......
1 +<?xml version="1.0" encoding="utf-8" ?>
2 +<configuration>
3 + <startup>
4 + <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
5 + </startup>
6 +</configuration>
...\ No newline at end of file ...\ No newline at end of file
1 +using System;
2 +using System.Collections.Generic;
3 +using System.IO;
4 +using System.Linq;
5 +using System.Text;
6 +using System.Text.RegularExpressions;
7 +using System.Threading.Tasks;
8 +using VulnCrawler;
9 +
10 +namespace VulnUserCodeAnalyzer
11 +{
12 + class Program
13 + {
14 + static void Main(string[] args)
15 + {
16 + DirectoryInfo dirInfo = new DirectoryInfo(@"c:\code");
17 + var codeFiles = dirInfo.EnumerateFiles("*.c", SearchOption.AllDirectories);
18 +
19 + var crawler = new VulnC();
20 + foreach (var codeFile in codeFiles)
21 + {
22 + Console.WriteLine(codeFile.FullName);
23 + using (var reader = codeFile.OpenText())
24 + {
25 +
26 + var dict = crawler.CrawlUserCode(reader);
27 +
28 + foreach (var item in dict)
29 + {
30 + Console.WriteLine($"----{item.Key}->");
31 + foreach (var hash in item.Value)
32 + {
33 + Console.WriteLine(hash);
34 + }
35 + }
36 + }
37 + }
38 +
39 +
40 + }
41 + }
42 +}
1 +using System.Reflection;
2 +using System.Runtime.CompilerServices;
3 +using System.Runtime.InteropServices;
4 +
5 +// 어셈블리에 대한 일반 정보는 다음 특성 집합을 통해
6 +// 제어됩니다. 어셈블리와 관련된 정보를 수정하려면
7 +// 이러한 특성 값을 변경하세요.
8 +[assembly: AssemblyTitle("VulnUserCodeAnalyzer")]
9 +[assembly: AssemblyDescription("")]
10 +[assembly: AssemblyConfiguration("")]
11 +[assembly: AssemblyCompany("")]
12 +[assembly: AssemblyProduct("VulnUserCodeAnalyzer")]
13 +[assembly: AssemblyCopyright("Copyright © 2018")]
14 +[assembly: AssemblyTrademark("")]
15 +[assembly: AssemblyCulture("")]
16 +
17 +// ComVisible을 false로 설정하면 이 어셈블리의 형식이 COM 구성 요소에
18 +// 표시되지 않습니다. COM에서 이 어셈블리의 형식에 액세스하려면
19 +// 해당 형식에 대해 ComVisible 특성을 true로 설정하세요.
20 +[assembly: ComVisible(false)]
21 +
22 +// 이 프로젝트가 COM에 노출되는 경우 다음 GUID는 typelib의 ID를 나타냅니다.
23 +[assembly: Guid("84c36798-2a15-481e-96d5-e6c547114161")]
24 +
25 +// 어셈블리의 버전 정보는 다음 네 가지 값으로 구성됩니다.
26 +//
27 +// 주 버전
28 +// 부 버전
29 +// 빌드 번호
30 +// 수정 버전
31 +//
32 +// 모든 값을 지정하거나 아래와 같이 '*'를 사용하여 빌드 번호 및 수정 번호가 자동으로
33 +// 지정되도록 할 수 있습니다.
34 +// [assembly: AssemblyVersion("1.0.*")]
35 +[assembly: AssemblyVersion("1.0.0.0")]
36 +[assembly: AssemblyFileVersion("1.0.0.0")]
1 +<?xml version="1.0" encoding="utf-8"?>
2 +<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3 + <Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
4 + <PropertyGroup>
5 + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
6 + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
7 + <ProjectGuid>{84C36798-2A15-481E-96D5-E6C547114161}</ProjectGuid>
8 + <OutputType>Exe</OutputType>
9 + <RootNamespace>VulnUserCodeAnalyzer</RootNamespace>
10 + <AssemblyName>VulnUserCodeAnalyzer</AssemblyName>
11 + <TargetFrameworkVersion>v4.6.1</TargetFrameworkVersion>
12 + <FileAlignment>512</FileAlignment>
13 + <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
14 + </PropertyGroup>
15 + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
16 + <PlatformTarget>AnyCPU</PlatformTarget>
17 + <DebugSymbols>true</DebugSymbols>
18 + <DebugType>full</DebugType>
19 + <Optimize>false</Optimize>
20 + <OutputPath>bin\Debug\</OutputPath>
21 + <DefineConstants>DEBUG;TRACE</DefineConstants>
22 + <ErrorReport>prompt</ErrorReport>
23 + <WarningLevel>4</WarningLevel>
24 + </PropertyGroup>
25 + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
26 + <PlatformTarget>AnyCPU</PlatformTarget>
27 + <DebugType>pdbonly</DebugType>
28 + <Optimize>true</Optimize>
29 + <OutputPath>bin\Release\</OutputPath>
30 + <DefineConstants>TRACE</DefineConstants>
31 + <ErrorReport>prompt</ErrorReport>
32 + <WarningLevel>4</WarningLevel>
33 + </PropertyGroup>
34 + <ItemGroup>
35 + <Reference Include="System" />
36 + <Reference Include="System.Core" />
37 + <Reference Include="System.Xml.Linq" />
38 + <Reference Include="System.Data.DataSetExtensions" />
39 + <Reference Include="Microsoft.CSharp" />
40 + <Reference Include="System.Data" />
41 + <Reference Include="System.Net.Http" />
42 + <Reference Include="System.Xml" />
43 + </ItemGroup>
44 + <ItemGroup>
45 + <Compile Include="Program.cs" />
46 + <Compile Include="Properties\AssemblyInfo.cs" />
47 + </ItemGroup>
48 + <ItemGroup>
49 + <None Include="App.config" />
50 + </ItemGroup>
51 + <ItemGroup>
52 + <ProjectReference Include="..\VulnCrawler\VulnCrawler.csproj">
53 + <Project>{42c06434-1aca-409c-8783-c6341abff8ba}</Project>
54 + <Name>VulnCrawler</Name>
55 + </ProjectReference>
56 + </ItemGroup>
57 + <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
58 +</Project>
...\ No newline at end of file ...\ No newline at end of file
...@@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VulnCrawler", "VulnCrawler\ ...@@ -7,6 +7,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VulnCrawler", "VulnCrawler\
7 EndProject 7 EndProject
8 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DownloaderGithubClone", "DownloaderGithubClone\DownloaderGithubClone.csproj", "{17D012E2-AD26-437B-83DC-EC8E09AF0F8D}" 8 Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DownloaderGithubClone", "DownloaderGithubClone\DownloaderGithubClone.csproj", "{17D012E2-AD26-437B-83DC-EC8E09AF0F8D}"
9 EndProject 9 EndProject
10 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "VulnUserCodeAnalyzer", "VulnUserCodeAnalyzer\VulnUserCodeAnalyzer.csproj", "{84C36798-2A15-481E-96D5-E6C547114161}"
11 +EndProject
10 Global 12 Global
11 GlobalSection(SolutionConfigurationPlatforms) = preSolution 13 GlobalSection(SolutionConfigurationPlatforms) = preSolution
12 Debug|Any CPU = Debug|Any CPU 14 Debug|Any CPU = Debug|Any CPU
...@@ -21,6 +23,10 @@ Global ...@@ -21,6 +23,10 @@ Global
21 {17D012E2-AD26-437B-83DC-EC8E09AF0F8D}.Debug|Any CPU.Build.0 = Debug|Any CPU 23 {17D012E2-AD26-437B-83DC-EC8E09AF0F8D}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 {17D012E2-AD26-437B-83DC-EC8E09AF0F8D}.Release|Any CPU.ActiveCfg = Release|Any CPU 24 {17D012E2-AD26-437B-83DC-EC8E09AF0F8D}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 {17D012E2-AD26-437B-83DC-EC8E09AF0F8D}.Release|Any CPU.Build.0 = Release|Any CPU 25 {17D012E2-AD26-437B-83DC-EC8E09AF0F8D}.Release|Any CPU.Build.0 = Release|Any CPU
26 + {84C36798-2A15-481E-96D5-E6C547114161}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
27 + {84C36798-2A15-481E-96D5-E6C547114161}.Debug|Any CPU.Build.0 = Debug|Any CPU
28 + {84C36798-2A15-481E-96D5-E6C547114161}.Release|Any CPU.ActiveCfg = Release|Any CPU
29 + {84C36798-2A15-481E-96D5-E6C547114161}.Release|Any CPU.Build.0 = Release|Any CPU
24 EndGlobalSection 30 EndGlobalSection
25 GlobalSection(SolutionProperties) = preSolution 31 GlobalSection(SolutionProperties) = preSolution
26 HideSolutionNode = FALSE 32 HideSolutionNode = FALSE
......