이광석
August 29, 2023, 5:04am
1
안녕하세요.
응용프로그램 난독화 하는 방법을 공유하고자 합니다.
(난독화 내부가 어떻게 돌아가는지 잘 모릅니다…)
.net framework용
https://blog.naver.com/lukewire129/223094369360
.net core용 (난독화 툴 아예 사용 할줄 모르신다면 .netframework용 참고하세요!)
https://blog.naver.com/lukewire129/223095093097
난독화를 하면 개인적으로 만족은 들겠지만
반면에 단점들도 존재합니다.
https://forum.dotnetdev.kr/t/topic/3009
하지만 현재 프로젝트 특성에 맞춰서 적절한 난독화 옵션을 조절하여 사용하시는 것도 나쁘지 않을 것 같습니다.
5 Likes
공유해주신 포럼 링크에도 존재하는 댓글이지만,
ConfuserEx 또는 obfuscator를 사용했을 때 치명적인 문제가 발생하기도 합니다.
일단 윈도우 자체에서 악성코드로 분류해버려서 자동 삭제 또는 실행을 차단시키기도 하고,
obfuscator의 경우에는 string변수에 담긴 값을 처리할때 종종 문제가 생기더군요…
아무튼 충분히 검증 후 사용해야 할 것 같습니다.
제일 큰 단점은 컴파일된 exe를 Windows에서 악성코드로 분류하는 것…
2 Likes
hask
August 29, 2023, 5:51am
3
CORE 프로젝트의 경우 따라하는 방법이 잘 이해가 가질 않는데
.csproj 파일을 열어서 tage 관련 내용을 복붙 하라는 뜻 인가요?
1 Like
이광석
August 29, 2023, 5:57am
5
네 맞습니다.
<예시입니다.>
<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
hask
August 29, 2023, 6:05am
6
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net7.0-windows</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
</PropertyGroup>
</Project>
저의 .csproj 파일을 열면 이렇게 나오는데
<project>
사이에 <probePath> 복사/붙여넣기 를 하면 빌드 오류가 나고 있습니다.
</project>
이광석
August 29, 2023, 6:07am
7
아 그 .csproj 파일이 아닙니다!
여기 ConfuserEX 프로그램에서 생성된 프로젝트 파일입니다.
https://blog.naver.com/lukewire129/223094369360 1편에
하단 Confuser.CLI난독화해보기 부분에서 .csproj만드는 부분이 있습니다.
한번 확인부탁드리겠습니다!
2 Likes
hask
August 29, 2023, 6:31am
8
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
이광석
August 29, 2023, 6:34am
9
아하
혹시 그럼 .csproj 파일 내용 공유 받을 수 있을까요?
2 Likes
hask
August 29, 2023, 6:56am
11
[회사 노트북이라 업로드가 안되네요 ㅠ_ㅠ]
Prove 태그의 내용을 현재 PC의 버전 별로 전부 맞춰니까 되는것 같습니다 (???)
헌데 문제가 있는데,
Dotpeek으로 디컴을 하니 전부 오픈 되서 보이네요…(??)
여기에 코드를 입력하거나 붙여 넣으세요
```[DEBUG] Executing 'Export symbol map' phase...
[INFO] Done.
Finished at 오후 3:52, 0:00 elapsed.
1 Like
이광석
August 29, 2023, 7:04am
12
네 맞아요! propbePath 역할이 내 PC의 .net core경로를 잡아주는 것이라고 보시면 됩니다.
probePath는
기존 confuser자체에 레지스트리를 통해서 .netframework 설치된 버전들을 전부 가져오고 있는데
net core의 패키지들은 레지스트리에 설치유무를 판단할 수 없다보니
prop을 통해서 직접 수동작업을 진행해주어야하는걸로 이해하고 있습니다.
//
혹시 Setting 탭에 있는 Global settings에 룰 설정하셨는지요…!?
2 Likes
hask
August 29, 2023, 7:40am
15
수차례 이것저것 변경하다 보니 정상적으로 확인 하였습니다!!!
배움 감사드려요 !!!
2 Likes