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

안녕하세요.

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

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

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

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

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

5 Likes

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

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

2 Likes

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

1 Like

네 맞습니다.

<예시입니다.>

<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 Like
<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 Likes

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 Like

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

2 Likes

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

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

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

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

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

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

2 Likes

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

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

2 Likes