Skip to main content

Command Palette

Search for a command to run...

CodeQL with Csharp

Updated
3 min read
  • Trong bài viết trước mình đã nếu ra 2 phương pháp parse database mà CodeQL hỗ trợ. Đó là no build và có command build, Với no build thì tất nhiên là rất dễ dàng nhưng ảnh hưởng tới độ chính xác của các liên kết trong source code

      codeql database create project_name --language=lang --command="command build" --overwrite
    
      codeql database create project_name --language=lang --build-mode none --overwrite
    
  • Trong bài viết này, mình sẽ lấy C# làm ví dụ để chạy CodeQL với command build.

  • Hầu hết các sản phẩm đều không cho bạn source code gốc, vậy làm sao để có thể lấy được source và chạy build với source lấy được đó ?

  • Và đây là cách mình thường làm, sau khi cài đặt sản phẩm mình sẽ dump dll file của sản phẩm đó ra. Tiếp đó là việc decompile từ dll sang C# source

  • Trong việc decompile C# mình thường dùng Dnspy hoặc ILSpy để thực hiện (Ý kiến cá nhân của mình thì nên đọc code với Dnspy và decompile với ILSpy), Từ đó có thể lấy được C# source (Tùy sản phẩm có encode không mà việc decompile có thể mang lại code đẹp hoặc xấu)

  • Nhưng hầu hết source code sau khi decompile sẽ dính nhiều lỗi và được nhiên là không thể rebuild ngay trên source đó

  • Code sẽ có những đoạn mã như trên, Nó thường được sinh ra khi code gốc có sử dụng Dynamic hoặc expression tree phức tạp, mà dnSpy decompile lại IL → C# nên nó sẽ giữ nguyên những dòng code này

  • Nó khá phổ biến trong source decompile (Hầu hết file nào cũng dính)

  • Ví dụ về hơn 5k error và 10 tiếng chờ bạn fix :)))

  • Hầu hết lỗi đến từ việc decompile sinh ra các mẫu code như ở trên. Ngoài ra bạn cần thiết lập lại file build và cấu trúc thư mục cho đống source code này

  • Đầu tiên hãy kiểm tra TargetFrameworkVersion trong các file csproj để xem code gốc đang được build trên .Net Framework version bao nhiêu, từ đó setup môi trường để build

  • Tiếp đó là tạo sln file để build

      dotnet new sln -n MySolution
      sln MySolution.sln add (Get-ChildItem -Recurse -Filter *.csproj | Select-Object -ExpandProperty FullName)
    
  • Vậy là đã có đầy đủ các bước để rebuild lại source code decompile này, tiếp theo là việc bạn phải đọc logic và sửa lại toàn bộ code không thể decompile ở trên, đây là bước tốn thời gian và công sức nhất

  • Bạn cần Restore project trước khi đưa codeql lệnh build

      MSBuild project.sln /t:Restore
    
      codeql database create project_name --language=csharp --command="MSBuild project.sln /p:Configuration=Release" --overwrite
    
  • Có 2 điều ở việc sửa code để rebuild lại, một là bạn có thể sẽ sửa sai logic code và đương nhiên nó sẽ làm lệch đi phần nào việc parse của CodeQL

  • Tiếp đó là bạn hoàn toàn có thể decompile cả các dll của system và các thư viện ngoài được import vào project, điều này sẽ giúp việc parse database của CodeQL chi tiết nhất có thể (Flow link từ đầu tới cuối) nhưng độ phức tạp để fix code là rất cao và đương nhiên việc build cũng khó, môi trường và version .Net giữa các thư viện, project, .. là hoàn toàn khác nhau

  • Cuối cùng đây là bài viết theo góc nhìn cá nhân nên sẽ có nhiều sai sót, đôi khi là lệch hướng nên xin miễn nhận gạch đá