Winform, WPF 프로그램 난독화 - feat.ConfuserEx

안녕하세요.

응용프로그램 난독화 하는 방법을 공유하고자 합니다.
(난독화 내부가 어떻게 돌아가는지 잘 모릅니다…)

.net framework용
https://blog.naver.com/lukewire129/223094369360

.net core용 (난독화 툴 아예 사용 할줄 모르신다면 .netframework용 참고하세요!)
https://blog.naver.com/lukewire129/223095093097

난독화를 하면 개인적으로 만족은 들겠지만
반면에 단점들도 존재합니다.

하지만 현재 프로젝트 특성에 맞춰서 적절한 난독화 옵션을 조절하여 사용하시는 것도 나쁘지 않을 것 같습니다.

5개의 좋아요

공유해주신 포럼 링크에도 존재하는 댓글이지만,
ConfuserEx 또는 obfuscator를 사용했을 때 치명적인 문제가 발생하기도 합니다.
일단 윈도우 자체에서 악성코드로 분류해버려서 자동 삭제 또는 실행을 차단시키기도 하고,
obfuscator의 경우에는 string변수에 담긴 값을 처리할때 종종 문제가 생기더군요…
아무튼 충분히 검증 후 사용해야 할 것 같습니다.

제일 큰 단점은 컴파일된 exe를 Windows에서 악성코드로 분류하는 것… :disappointed:

2개의 좋아요

CORE 프로젝트의 경우 따라하는 방법이 잘 이해가 가질 않는데
.csproj 파일을 열어서 tage 관련 내용을 복붙 하라는 뜻 인가요?

1개의 좋아요

네 맞습니다.

<예시입니다.>

<project outputDir="D:\Project\6.example_github\obfuscationTest\ObfucationCoreTest\bin\Debug\net7.0-windows" baseDir="D:\Project\6.example_github\obfuscationTest\ObfucationCoreTest\bin\Debug\net7.0-windows" xmlns="http://confuser.codeplex.com">
  <module path="ObfucationCoreTest.dll" />
  <probePath>C:\Program Files (x86)\dotnet\packs\Microsoft.NETCore.App.Ref\3.1.0\ref\netcoreapp3.1</probePath>
  <probePath>C:\Program Files (x86)\dotnet\packs\Microsoft.NETCore.App.Ref\5.0.0\ref\net5.0</probePath>
  <probePath>C:\Program Files (x86)\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.21\ref\net6.0</probePath>
  <probePath>C:\Program Files (x86)\dotnet\packs\Microsoft.NETCore.App.Ref\7.0.10\ref\net7.0</probePath>
  <probePath>C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\3.1.32</probePath>
  <probePath>C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\5.0.17</probePath>
  <probePath>C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\6.0.21</probePath>
  <probePath>C:\Program Files (x86)\dotnet\shared\Microsoft.NETCore.App\7.0.10</probePath>
  <probePath>C:\Program Files (x86)\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\3.1.0\ref\netcoreapp3.1</probePath>
  <probePath>C:\Program Files (x86)\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\5.0.0\ref\net7.0</probePath>
  <probePath>C:\Program Files (x86)\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.21\ref\net7.0</probePath>
  <probePath>C:\Program Files (x86)\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\7.0.10\ref\net7.0</probePath>
  <probePath>C:\Program Files (x86)\dotnet\shared\Microsoft.WindowsDesktop.App\3.1.32</probePath>
  <probePath>C:\Program Files (x86)\dotnet\shared\Microsoft.WindowsDesktop.App\5.0.17</probePath>
  <probePath>C:\Program Files (x86)\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.21</probePath>
  <probePath>C:\Program Files (x86)\dotnet\shared\Microsoft.WindowsDesktop.App\7.0.10</probePath>
  <probePath>C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\3.1.0\ref\netcoreapp3.1</probePath>
  <probePath>C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\5.0.0\ref\net5.0</probePath>
  <probePath>C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\6.0.21\ref\net6.0</probePath>
  <probePath>C:\Program Files\dotnet\packs\Microsoft.NETCore.App.Ref\7.0.10\ref\net7.0</probePath>
  <probePath>C:\Program Files\dotnet\shared\Microsoft.NETCore.App\3.1.32</probePath>
  <probePath>C:\Program Files\dotnet\shared\Microsoft.NETCore.App\5.0.17</probePath>
  <probePath>C:\Program Files\dotnet\shared\Microsoft.NETCore.App\6.0.21</probePath>
  <probePath>C:\Program Files\dotnet\shared\Microsoft.NETCore.App\7.0.10</probePath>
  <probePath>C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\3.1.0\ref\netcoreapp3.1</probePath>
  <probePath>C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\5.0.0\ref\net5.0</probePath>
  <probePath>C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\6.0.21\ref\net6.0</probePath>
  <probePath>C:\Program Files\dotnet\packs\Microsoft.WindowsDesktop.App.Ref\7.0.10\ref\net7.0</probePath>
  <probePath>C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\3.1.32</probePath>
  <probePath>C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\5.0.17</probePath>
  <probePath>C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\6.0.21</probePath>
  <probePath>C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\7.0.10</probePath>
</project>
1개의 좋아요
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>net7.0-windows</TargetFramework>
    <Nullable>enable</Nullable>
    <UseWPF>true</UseWPF>
  </PropertyGroup>

</Project>

저의 .csproj 파일을 열면 이렇게 나오는데

<project>
사이에 <probePath> 복사/붙여넣기 를 하면 빌드 오류가 나고 있습니다.
</project>

아 그 .csproj 파일이 아닙니다!

image

여기 ConfuserEX 프로그램에서 생성된 프로젝트 파일입니다.

lukewire129님의 블로그 : 네이버 블로그 1편에

하단 Confuser.CLI난독화해보기 부분에서 .csproj만드는 부분이 있습니다.

한번 확인부탁드리겠습니다!

2개의 좋아요

1편을 보고 따라하고 있습니다
헌데 .Net 7.0 이라서 1회차때 나오는 Protect 자체가 실패한 상태로 만들어져서 그런지 모르겠지만
계속 같은 Exception이 발생되네요,

처리되지 않은 예외: System.AggregateException: 하나 이상의 오류가 발생했습니다. ---> System.NullReferenceException: 개체 참조가 개체의 인스턴스로 설정되지 않았습니다.
   위치: Confuser.Core.ConfuserEngine.PrintEnvironmentInfo(ConfuserContext context)
   위치: Confuser.Core.ConfuserEngine.RunInternal(ConfuserParameters parameters, CancellationToken token)
   위치: Confuser.Core.ConfuserEngine.<>c__DisplayClass3_0.<Run>b__0()
   위치: System.Threading.Tasks.Task.Execute()
   --- 내부 예외 스택 추적의 끝 ---
   위치: System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
   위치: System.Threading.Tasks.Task.Wait(Int32 millisecondsTimeout, CancellationToken cancellationToken)
   위치: System.Threading.Tasks.Task.Wait()
   위치: Confuser.CLI.Program.RunProject(ConfuserParameters parameters)
   위치: Confuser.CLI.Program.Main(String[] args)
1개의 좋아요

아하
혹시 그럼 .csproj 파일 내용 공유 받을 수 있을까요?

2개의 좋아요

[회사 노트북이라 업로드가 안되네요 ㅠ_ㅠ]
Prove 태그의 내용을 현재 PC의 버전 별로 전부 맞춰니까 되는것 같습니다 (???)

헌데 문제가 있는데,
Dotpeek으로 디컴을 하니 전부 오픈 되서 보이네요…(??)

여기에 코드를 입력하거나 붙여 넣으세요
```[DEBUG] Executing 'Export symbol map' phase...
 [INFO] Done.
Finished at 오후 3:52, 0:00 elapsed.
1개의 좋아요

네 맞아요! propbePath 역할이 내 PC의 .net core경로를 잡아주는 것이라고 보시면 됩니다.

probePath는
기존 confuser자체에 레지스트리를 통해서 .netframework 설치된 버전들을 전부 가져오고 있는데
net core의 패키지들은 레지스트리에 설치유무를 판단할 수 없다보니
prop을 통해서 직접 수동작업을 진행해주어야하는걸로 이해하고 있습니다.

//
혹시 Setting 탭에 있는 Global settings에 룰 설정하셨는지요…!?

2개의 좋아요

수차례 이것저것 변경하다 보니 정상적으로 확인 하였습니다!!!

배움 감사드려요 !!! :wink:

2개의 좋아요