노현종

코드 주석 정리

......@@ -27,6 +27,8 @@ namespace VulnCrawler
//AWS.account.Endpoint = "vulndb.cby38wfppa7l.us-east-2.rds.amazonaws.com";
//AWS.SaveAccount();
//AES aes = new AES();
/* AWS 계정 정보 파일 읽음 */
string txt = File.ReadAllText(@"Account.xml");
// string xml = aes.AESDecrypt128(txt, key);
string xml = txt;
......@@ -34,15 +36,19 @@ namespace VulnCrawler
AWS.LoadAccount(xml);
AWS.Account account = AWS.account;
/* AWS 정보 출력 */
Console.WriteLine($"Endpoint: {account.Endpoint}, ID: {account.Id}, PW: {account.Pw}");
try
{
/* DB 접속 시도 */
VulnRDS.Connect(account, "vuln");
}
catch(Exception e)
{
Console.WriteLine($"접속 에러 :: {e.ToString()}");
}
/* AWS 연결 여부 확인 */
if (VulnRDS.Conn.State == System.Data.ConnectionState.Open)
{
Console.WriteLine("접속 성공");
......@@ -53,44 +59,18 @@ namespace VulnCrawler
Console.WriteLine("연결 실패");
return;
}
//MySqlConnectionStringBuilder builder = new MySqlConnectionStringBuilder {
// Server = "",
// UserID = id,
// Password = pw,
// Database = "vuln",
// Port = 3306
//};
//string strConn = builder.ToString();
//builder = null;
//MySqlConnection conn = new MySqlConnection(strConn);
//try {
// String sql = "INSERT INTO members (id, pwd, name) " +
// "VALUES ('gon', '111', '김삿갓')";
// MySqlCommand cmd = new MySqlCommand(sql, conn);
// conn.Open();
// cmd.ExecuteNonQuery();
// conn.Close();
//} catch (Exception e) {
// Console.WriteLine(e.ToString());
//}
#endregion
Run();
}
/* 메인 동작 함수 */
public static void Run() {
// Repository 폴더들이 있는 주소를 지정하면 하위 폴더 목록을 가져옴(Repository 목록)
Regex.CacheSize = 50;
// var fields = VulnWorker.GetCriticalVariant(@"return _is_safe_url(url, host) and _is_safe_url(url.replace('\\', '/'), host)");
// return;
/* C:\VulnC에 있는 Git Repository들로 돌아감 */
var directorys = Directory.GetDirectories(@"c:\VulnC");
if (directorys.Length == 0) {
Console.WriteLine("Repository 목록 찾기 실패");
......@@ -98,16 +78,15 @@ namespace VulnCrawler
}
// Repository 목록 만큼 반복함.
foreach (var directory in directorys) {
// 템플릿 패턴화 T : VulnAbstractCrawler
if (directory.Contains("open"))
/* 폴더 중에 linux가 있으면 잠깐 넘어감 (너무 커서 테스트 힘듦) */
if (directory.Contains("linux"))
{
continue;
}
Console.WriteLine(directory);
// 템플릿 패턴화 T : VulnAbstractCrawler
VulnWorker.Run<VulnC>(directory);
}
}
#region Secure string input
static String SecureStringToString(SecureString value) {
IntPtr valuePtr = IntPtr.Zero;
......
......@@ -10,14 +10,27 @@ namespace VulnCrawler
{
public class VulnC : VulnAbstractCrawler
{
// protected override string RegexFuncPattern => $@"@@ \-(?<{OldStart}>\d+),(?<{OldLines}>\d+) \+(?<{NewStart}>\d+),(?<{NewLines}>\d+) @@ (?<{MethodName}>(static)?( const )? [\w]+ [\w]+\([\w \*\,\t\n]*[\)\,])";
// protected override string RegexFuncPattern => $@"@@ \-(?<{OldStart}>\d+),(?<{OldLines}>\d+) \+(?<{NewStart}>\d+),(?<{NewLines}>\d+) @@ (?<{MethodName}>(static)?( const )? [\w]+ [\w]+\([\w \*\,\t\n]*[\)\,])";
/* 함수 패턴 정규식 */
protected override string RegexFuncPattern => $@"(?<{MethodName}>(unsigned|static)?( const )? [\w]+ [\w]+\(([\w \*\,\t\n])*[\)\,])";
/* 검색 파일 타입 */
protected override string Extension => ".c";
/* 예약어 파일명 */
protected override string ReservedFileName => "CReserved.txt";
/// <summary>
/// 패치 코드에서 함수 목록 뽑는 정규식
/// </summary>
/// <param name="patchCode">패치 코드</param>
/// <returns></returns>
public override MatchCollection GetMatches(string patchCode) {
var regs = Regex.Matches(patchCode, RegexFuncPattern);
return regs;
}
/// <summary>
/// 주석 제거 함수 (안쓰임)
/// </summary>
/// <param name="original"></param>
/// <returns></returns>
public override string RemoveComment(string original) {
string txt = Regex.Replace(original, Environment.NewLine, "");
......@@ -32,6 +45,11 @@ namespace VulnCrawler
return replace;
}
/// <summary>
/// 패치 정보에서 크리티컬 메서드 테이블 구함
/// </summary>
/// <param name="srcCode">원본 소스 코드</param>
/// <returns>키 = 크리티컬 메서드명, 값 = 크리티컬 변수 목록</returns>
public override IDictionary<string, IEnumerable<string>> ExtractGitCriticalMethodTable(string srcCode)
{
var table = new Dictionary<string, IEnumerable<string>>();
......@@ -105,6 +123,12 @@ namespace VulnCrawler
}
return table;
}
/// <summary>
/// 원본 함수 코드 구해주는 함수
/// </summary>
/// <param name="oldStream">원본 코드 파일</param>
/// <param name="methodName">찾을 메서드 이름</param>
/// <returns></returns>
protected override string GetOriginalFunc(Stream oldStream, string methodName) {
StringBuilder oldBuilder = new StringBuilder();
string method = Regex.Escape(methodName);
......@@ -244,6 +268,12 @@ namespace VulnCrawler
return oldBuilder.ToString();
}
/// <summary>
/// 크리티컬 블록 리스트 구하는 함수
/// </summary>
/// <param name="srcCode">원본 함수 코드</param>
/// <param name="criticalList">크리티컬 변수 목록</param>
/// <returns></returns>
protected override IList<Block> GetCriticalBlocks(string srcCode, IEnumerable<string> criticalList)
{
......@@ -471,6 +501,13 @@ namespace VulnCrawler
return blockList;
}
/// <summary>
/// 추상화 정규화 함수
/// </summary>
/// <param name="blockCode">블록 소스 코드</param>
/// <param name="dict">추상화 변환 변수 테이블</param>
/// <param name="methodDict">추상화 변환 메서드 테이블</param>
/// <returns></returns>
public override string Abstract(string blockCode, IDictionary<string, string> dict, IDictionary<string, string> methodDict)
{
var split = blockCode.Split('\n');
......
......@@ -16,7 +16,9 @@ namespace VulnCrawler
// 템플릿 메서드 패턴
public static void Run<T>(string dirPath) where T : VulnAbstractCrawler, new() {
var crawler = new T();
/* Git 경로로 초기화 */
crawler.Init(dirPath);
/* 초기화된 커밋 목록 가져옴 */
var commits = crawler.Commits;
foreach (var commit in commits) {
// 커밋 메시지
......@@ -31,18 +33,16 @@ namespace VulnCrawler
// 패치 엔트리 파일 배열 중에 파일 확장자가 .py인 것만 가져옴
// (실질적인 코드 변경 커밋만 보기 위해서)
var entrys = crawler.GetPatchEntryChanges(patch);
/* C:\VulnC\linux 라면 linux만 뽑아서 repoName에 저장 */
var dsp = dirPath.Split(Path.DirectorySeparatorChar);
string repoName = dsp[dsp.Length - 1];
// 현재 커밋에 대한 패치 엔트리 배열을 출력함
PrintPatchEntrys(entrys, crawler, message, cve, repoName);
Console.ReadLine();
}
// Console.ReadLine();
}
}
private static void PrintPatchEntrys(IEnumerable<PatchEntryChanges> entrys, VulnAbstractCrawler self, string commitMsg, string cve, string repoName) {
foreach (var entry in entrys) {
// 기존 소스코드
......@@ -72,10 +72,6 @@ namespace VulnCrawler
Console.WriteLine($"Old Content: \n{oldContent}");
Console.ResetColor();
//Console.BackgroundColor = ConsoleColor.DarkMagenta;
//Console.WriteLine($"New Content: \n{newContent}");
//Console.ResetColor();
Console.ForegroundColor = ConsoleColor.Blue;
Console.WriteLine($"status: {entry.Status.ToString()}");
Console.WriteLine($"added: {entry.LinesAdded.ToString()}, deleted: {entry.LinesDeleted.ToString()}");
......@@ -94,15 +90,26 @@ namespace VulnCrawler
Console.BackgroundColor = ConsoleColor.DarkRed;
Console.WriteLine($"Patched: \n{entry.Patch}");
Console.ResetColor();
/* 패치된 코드들에서 Method로 나누고 크리티컬 변수로 뽑아옴 Dictionary 구조 (키 = 함수명) */
var table = self.ExtractGitCriticalMethodTable(entry.Patch);
/* 크리티컬 메서드 테이블과 패치 전 파일에서 Process 하고 tuple로 가져옴 */
foreach (var tuple in self.Process(oldBlob, table))
{
/* 메서드 이름, 원본 함수 코드, 블록 리스트(크리티컬 포함) */
(var methodName, var oriFunc, var blocks) = tuple;
Console.BackgroundColor = ConsoleColor.DarkRed;
Console.WriteLine($"메서드 이름 : {methodName}");
Console.ResetColor();
foreach (var block in blocks)
{
/* 크리티컬 블록이 아니면 볼 필요 없으니 넘어감 */
if (!block.HasCritical)
{
// Console.WriteLine("크리티컬 아님");
continue;
}
if (block.HasCritical)
{
Console.BackgroundColor = ConsoleColor.DarkMagenta;
......@@ -111,22 +118,19 @@ namespace VulnCrawler
{
Console.BackgroundColor = ConsoleColor.DarkGreen;
}
/* 블록 정보 출력(블록 번호, 블록 소스코드, 블록 추상화 코드, 블록 해쉬값) */
Console.WriteLine($"=====block({block.Num}, {block.HasCritical.ToString()})");
Console.WriteLine(block.Code);
Console.ResetColor();
Console.WriteLine($"AbsCode = \n{block.AbsCode}");
Console.WriteLine($"MD5 = {block.Hash}");
if (!block.HasCritical)
{
// Console.WriteLine("크리티컬 아님");
continue;
}
/* base64 인코딩(MySQL에 들어갈 수 없는 문자열이 있을 수 있으므로 인코딩) */
byte[] funcNameBytes = Encoding.Unicode.GetBytes(methodName);
byte[] codeOriBeforeBytes = Encoding.Unicode.GetBytes(oriFunc);
byte[] codeAbsBeforeBytes = Encoding.Unicode.GetBytes(block.AbsCode);
/* VulnDB에 하나의 레코드로 들어가는 하나의 취약점 객체 */
VulnRDS.Vuln vuln = new VulnRDS.Vuln()
{
Cve = cve,
......@@ -140,76 +144,22 @@ namespace VulnCrawler
BlockNum = block.Num,
};
// Console.WriteLine("추가중...");
VulnRDS.InsertVulnData(vuln);
// Console.WriteLine($"추가: {vuln.Cve}, {vuln.FuncName}, {vuln.RepositName}");
// Console.ReadLine();
Console.WriteLine($"Vuln FuncName:{vuln.FuncName}");
/* VulnDB에 추가 */
//VulnRDS.InsertVulnData(vuln);
}
}
//foreach (var item in table)
//{
// Console.WriteLine($"Method : {item.Key}");
// //foreach (var b in item.Value)
// //{
// // Console.WriteLine($"--{b}");
// //}
//}
// Console.ReadLine();
}
else
{
continue;
}
// 패치 코드에서 매칭된 파이썬 함수들로부터
// 패치 전 코드 파일(oldBlob)을 탐색하여 원본 파이썬 함수 가져오고(originalFunc)
//
#endregion
//foreach (var reg in regs)
//{
// var match = reg as Match;
// string methodName = match.Groups[VulnAbstractCrawler.MethodName].Value.Trim();
// string originalFunc, md5;
// (originalFunc, md5) = self.Process(oldBlob.GetContentStream(),
// methodName);
// #region 현재 패치 엔트리 정보 출력(추가된 줄 수, 삭제된 줄 수, 패치 이전 경로, 패치 후 경로)
// // 패치 전 원본 함수
// Console.WriteLine($"Original Func: {originalFunc}");
// // 해쉬 후
// Console.WriteLine($"Original Func MD5: {md5}");
// //Console.BackgroundColor = ConsoleColor.DarkRed;
// //Console.WriteLine($"Patched: \n{entry.Patch}");
// Console.ResetColor();
// Console.ForegroundColor = ConsoleColor.Red;
// Console.WriteLine("==============================");
// Console.ResetColor();
// #endregion
//}
//Console.ReadLine();
}
catch (Exception e)
{
// Console.WriteLine(entry.Patch);
// Console.WriteLine(e.ToString());
// Console.ReadLine();
continue;
}
......