MS_DecompileAndObfuscation - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki
- æ»ãïŒãã®ä»ãéçºã®è²ã ïŒ
éã³ã³ãã€ã«ã»é£èªåãªã©ã®è³ªåãçšã«ããããã
é£èªåãœãªã¥ãŒã·ã§ã³ã¯ã
- å®è¡æã³ã³ãã€ã©ã
- ã¹ã¯ãªããèšèªã
åºãŠããŠãå¿ èŠã«ãªã£ãŠããããããªãã§ããããïŒ
è£è¶³ïŒåæã®èŠç«ãŠã¯æ¬è³ªãçªããŠããïŒ: ãå®è¡æã³ã³ãã€ã©ã
ã¹ã¯ãªããèšèªãåºãŠããŠãå¿ èŠã«ãªã£ãŠãããââ
ãã®æšæž¬ã¯æ£ãããçç±ãæŽçãããããªãäžéã³ãŒãã»ã¹ã¯ãªããã ãšéã³ã³ãã€ã«ãããããã®ãã ãã€ãã£ã ã³ã³ãã€ã«ïŒC/C++ïŒ ãœãŒã¹ ââæé©åâââ¶ æ©æ¢°èª ã»å€æ°åãååãæ§é ããå®å šã«å€±ãããã ã»ã¬ãžã¹ã¿å²ãåœãŠãã€ã³ã©ã€ã³å±éãã«ãŒãå€åœ¢ã§ååãçããªã ã»ãå ã«æ»ãæ å ±ãããããæ®ã£ãŠããªããâ äžéã³ãŒãïŒ.NET / JavaïŒ ãœãŒã¹ âââ¶ IL / ãã€ãã³ãŒã ââå®è¡æâââ¶ æ©æ¢°èª ã»ãã¡ã¿ããŒã¿ïŒååã»ã¡ãœããåã»ã·ã°ããã£ïŒãå¿ é ã â ãªãã¬ã¯ã·ã§ã³ãGCãåå®å šæ§ã®ããã«ãæ¶ããªããâ ã»IL ã¯é«æ°ŽæºïŒã¹ã¿ãã¯ãã·ã³ãæ§é åãããåå²ïŒ â å ã®ãœãŒã¹ã«è¿ã圢ã«åŸ©å ã§ãããæ¶ããªããã®ãèŠç¹ã§ããã
.NET ã¯å®è¡æã«åæ å ±ãå¿ èŠãšããèšèšïŒ.NET ã® Reflectionã
ã¬ããŒãž ã³ã¬ã¯ã·ã§ã³ãDI ãªã©ïŒã§ããããã
ã¡ã¿ããŒã¿ãåãããšãåççã«ã§ããªãã
ã ãã**ãæ¶ããã®ã§ã¯ãªããèªã¿ã«ãããããïŒé£èªå**ãããªãã
C èšèªã®ããªããã»ããµã«éããåŸã®ã³ãŒã㯠â ãªããŒã¹ã§ããªããããã
-
å¥è·¡çã« C/C++ ã®éã³ã³ãã€ã©ãæã«å ¥ãããããšããŠã
ãããåãåºããœãŒã¹ãçè§£ã§ããå¯èœæ§ã¯å šããªãã -
C++ ã®éã³ã³ãã€ã©ã¯ C ãããã¯ããã«å°é£ (äºå®äžäžå¯èœ)
â» æ©æ¢°èªèªäœãèªã人ãããããç¥ããªãã®ã§ãä¿è·ãããã¬ãã«ã«ãããããããŸãããã
è£è¶³ïŒãã®å€æã¯çŸåšã¯å°ãæ éã«ïŒ: åæã®
ãçè§£ã§ããå¯èœæ§ã¯å šããªãããäºå®äžäžå¯èœãã¯
åœæãšããŠã¯åŠ¥åœã ããçŸåšã¯ããç¶æ³ãå€ãã£ãã
ããŒã« å 容 Ghidra NSA ã 2019 幎ã«å ¬éãç¡åãC é¢šã®æ¬äŒŒã³ãŒããåºå â IDA Pro + Hex-Rays åçšã®å®çªããã³ã³ãã€ã©ã®å質ãé«ã Binary Ninja åçšãäžé衚çŸãæ±ãããã radare2 / rizin OSS ãçŸåšã®å®éã ã»å€æ°åã»ååã¯ãäŸç¶ãšããŠåŸ©å ãããªãã â åºå㯠sub_401000(a1, a2) ã®ãããªåœ¢ ã»ããããå¶åŸ¡ãããŒãšã¢ã«ãŽãªãºã ã¯èªããã ã»ã·ã³ãã«ïŒãããã°æ å ± / PDBïŒãæ®ã£ãŠããã°ãããªãèªãã â ã»æ©æ¢°åŠç¿ã§é¢æ°åãæšå®ããç ç©¶ã»ããŒã«ãåºãŠãã ãçµè«ã ãäžå¯èœãã§ã¯ãªããéåžžã«æéããããããæ£ãã â è²»çšå¯Ÿå¹æãæ»æè åŽã§èŠåããã©ããã®åé¡åæã®â»ïŒãä¿è·ãããã¬ãã«ã«ãããïŒãã
çŸåšãæãç確ãªç· ãæ¹ã§ããã
- ã¹ã¯ãªããã»ãã¡ã€ã«ããã®ãŸãŸåãã
- ã€ã³ã¿ããªã¿ã§ãœãŒã¹ã³ãŒãããæ©æ¢°èªããã°ã©ã ã«è§£éã»å€æããªããåŠçã»å®è¡ããã
以äžã®çç±ã§ãéã³ã³ãã€ã«ã容æã§ããã±ãŒã¹ãå€ããããã
-
äžéã³ãŒãã¯ãã€ãã£ãã³ãŒãã«æ¯ã¹ãŠåœä»€ã®çš®é¡ãè€éããå°ãªãã
-
éã³ã³ãã€ã«ããæãèšèª
-
ã¬ãŒããŒãžã»ã³ã¬ã¯ã·ã§ã³ããªãã¬ã¯ã·ã§ã³æ©èœã®ããèšèª
-
ãã®ä»ã
- å ±çšäœãç¡ã
- ãã€ã³ã¿æŒç®ã»ãã£ã¹ãã®å¶é
- class ã«å®çŸ©æ å ±ãå«ãŸããã
- goto æãçŠæ¢ããŠãã
- , etc.
-
-
èšèªæ¯ã®ããŒã«
-
JavaïŒ
JAD(Jad Decompiler) -
.NETïŒ
-
IL DisassemblerïŒildasm.exeïŒ
Visual Studio ã«ä»å± -
.NET Reflector
æã¯ç¡åã§äžæã ã£ããã2011 幎㮠3 æã«æååãããã -
dotPeek
ReSharper ã«ä»å± -
ILSpy
MIT ã® OSS ã§ã¹ã¿ã³ãã¢ãã³ã§å©çšå¯èœã -
Telerik JustDecompile
Telerik 瀟補 -
.NET CodeReflect
-
-
è£è¶³ïŒæããããçç±ã¯ç確ïŒ: ãéã³ã³ãã€ã«ããæãèšèªãã®
ç¹åŸŽã®äžèЧã¯ããªã埩å ã§ããã®ããæ£ãã説æããŠããããå ±çšäœïŒunionïŒãç¡ãã C ã® union ã¯ãåãé åãå¥ã®åãšããŠè§£éããã â éã³ã³ãã€ã©ã¯ã©ã®åã倿ã§ããªã .NET ã«ã¯ïŒååïŒç¡ãã®ã§ãåãäžæã«æ±ºãŸã â ããã€ã³ã¿æŒç®ã»ãã£ã¹ãã®å¶éã C ã§ã¯ p + 3 ãäœãæãããéçã«åãããªã .NET ã¯åå®å šãªã®ã§ãåç §ãäœãæãã远ãã ãclass ã«å®çŸ©æ å ±ãå«ãŸããã ã¡ã¿ããŒã¿ãã®ãã®ãåè¿°ã®éãæ¶ããªã â ãgoto ãçŠæ¢ããŠããã æ§é åãããå¶åŸ¡ãããŒïŒif / while / forïŒã«æ»ãããã â ä»»æã® goto ããããšãå ã®æ§é ãæšå®ã§ããªãç§»è¡ã¡ã¢ïŒåããŒã«ã®çŸæ³ïŒ:
ããŒã« çŸæ³ ildasm.exe çŸåœ¹ïŒIL ã®éã¢ã»ã³ãã«ãC# ã«ã¯æ»ããªãïŒ ILSpy çŸåœ¹ã»æŽ»çºãMITãVS æ¡åŒµçããã â dotPeek çŸåœ¹ã»ç¡åïŒJetBrainsãReSharper äžèŠã«ãªã£ãïŒ .NET Reflector æåïŒRedgateïŒãçŸåœ¹ Telerik JustDecompile æäŸçµäºïŒ2023 å¹ŽïŒ .NET CodeReflect æäŸçµäº dnSpy éçºåæ¢ïŒ2020ïŒãdnSpyEx ããã©ãŒã¯ãšããŠç¶ç¶ JADïŒJavaïŒ éçºåæ¢ãçŸåšã¯ CFRãProcyonãFernflower ãçŸåšã® .NET ã§ã®å®çªã ã»ILSpyïŒç¡åã»OSSïŒâ ã»dotPeekïŒç¡åïŒ ã»dnSpyExïŒãããã¬ä»ããåçè§£æãã§ããïŒãªããéã³ã³ãã€ã«ã¯ãæ»æãã ãã®ææ®µã§ã¯ãªãã
ãæ£åœãªçšéã ã»ãœãŒã¹ã倱ã£ãèªç€Ÿè£œ DLL ã®èª¿æ» ã»NuGet ããã±ãŒãžã®æå確èªïŒ[NuGetããã±ãŒãžã®ãããã°](MS_NuGetPackageDebugging)ïŒ ã».NET ã©ã³ã¿ã€ã èªäœã®å®è£ ç¢ºèª â çŸåšã¯ãsource.dot.net / GitHubãã§ãœãŒã¹ãå ¬éãããŠãã â ã»é害解æïŒé 眮ããããã€ããªãæåŸ ã®çãïŒã©ã€ã»ã³ã¹äžã®æ³šæ:
ã»ç¬¬äžè ã®è£œåãéã³ã³ãã€ã«ããè¡çºã¯ã ã䜿çšèš±è«Ÿå¥çŽïŒEULAïŒã§çŠæ¢ãããŠãããããšãå€ã ã»èäœæš©æ³äžãããªããŒã¹ ãšã³ãžãã¢ãªã³ã°ã®å¯åŠã¯ ç®çã»åœã«ãã£ãŠæ±ããç°ãªã â æ¥åã§è¡ãå Žåã¯ãå¥çŽãšæ³åã確èªãããâ
-
é£èªåã¯åãªãæé皌ãã«éãããããã°ã©ã ã®éã³ã³ãã€ã«ãäžå¯èœãšãããã®ã§ã¯ãªãã
-
åçšã®é£èªåãœãªã¥ãŒã·ã§ã³ã¯ãœãŒã¹ã³ãŒãã®é£èªåã Java ã .NET ãªã©ã®ãã©ãããã©ãŒã äžç«ãª
ãã€ãã³ãŒãã®å€æã倧éšåãå ããããäžã«ã¯ã³ã³ãã€ã«ããããã€ããªã«çŽæ¥äœçšãããã®ãååšããã
ãããããéã³ã³ãã€ã«ãã§ããªãã®ã§é£èªåãäžèŠã
ãããããã³ã³ãã€ã«ããªãã®ã§é£èªåãã§ããªãã
ç§»è¡ã¡ã¢ïŒã¹ã¯ãªããèšèªãé£èªåã¯ã§ããïŒ: ãã³ã³ãã€ã«ããªãã®ã§
é£èªåãã§ããªããã¯æ£ç¢ºã§ã¯ãªãã
é£èªåã¯ã³ã³ãã€ã«ã®æç¡ãšã¯ç¬ç«ã§ããããJavaScript ã®é£èªåã¯å®éã«åºãè¡ãããŠããã ã»å€æ°åã®ççž®ã»ç¡æå³åïŒMinify + MangleïŒ â terser / esbuild ãæšæºã§è¡ã â [ASP.NET ã® BundleConfig](MS_ASPNETBundleConfig) ã® Minification ã»æååã®åå²ã»ãšã³ã³ãŒã ã»å¶åŸ¡ãããŒã®å¹³åŠåïŒjavascript-obfuscator çïŒ ããã ãã ãã©ãŠã¶ã§åã以äžããæçµçã«ã¯å¿ ãèªããã â ãããã¬ã§å®è¡æã®å€ãèŠãã°åãã â ãã¯ããæé皌ããã§ããåæã®äž»åŒµã®æ žââ
ãé£èªåã¯æé皌ãã«éããªããââã¯ã
ã¹ã¯ãªããèšèªã§ãäžéã³ãŒãã§ãçããæ£ããã
-
éã³ã³ãã€ã«ã容æãªãããé£èªåãå¿ èŠã«ãªãã±ãŒã¹ãããã
-
èšèªæ¯ã®ããŒã«
-
JavaïŒ
- ProGuard
- JODE
- JavaGuard
- RetroGuard
- jarg
- yGuard
-
.NETïŒ
- ConfuserExïŒç¡æïŒ
- NanDoKuïŒç¡æïŒ
- Phoenix ProtectorïŒç¡æïŒ
- DotfuscatorïŒææ â ç°¡æçæãïŒ
- Eazfuscator.NETïŒææ â 詊çšçæãïŒ
- babelfor.netïŒBabelïŒïŒææ â 詊çšçæãïŒ
-
è£è¶³ïŒé£èªåãå®éã«äœããããïŒ: ãèªã¿ã«ãããããã®äžèº«ã
å ·äœåããŠãããšãéçãšå¯äœçšãçè§£ããããã
ææ³ å 容 å¯äœçš èå¥åã®æ¹å CalcTaxâaãbãªãã¬ã¯ã·ã§ã³ã§åå解決ããŠããç®æãå£ãã â å¶åŸ¡ãããŒã®å¹³åŠå if/forãswitch+ ç¶æ 倿°ã«å€åœ¢æ§èœäœäžãã¹ã¿ã㯠ãã¬ãŒã¹ãç¡æå³ã« æååã®æå·å æååãªãã©ã«ãå®è¡æã«åŸ©å· èµ·åãé ããªãã埩å·ããŒã¯ãã€ããªå ã«ãã äžèŠã³ãŒãã®æ³šå ¥ æå³ã®ãªãåå²ãæ··ãã ãµã€ãºå¢ãæ§èœäœäž ã¡ã¿ããŒã¿ã®é€å» æªäœ¿çšã®åã»ã¡ã³ããåã åçèªã¿èŸŒã¿ãå£ãã 察ããã㬠ãããã¬æ€ç¥ã§çµäºãã æ£åœãªé害解æãå°é£ã«ãªã ãé£èªåã§å£ããå žåçãªãã®ãâ å®åã§å¿ ãåœãã ã»ãªãã¬ã¯ã·ã§ã³ïŒååã»ã¡ãœããåãæååã§æå®ããŠããç®æïŒ ã»ã·ãªã¢ã©ã€ãºïŒãã·ãªã¢ã©ã€ãºïŒJSONãXML ã®ããããã£åïŒ ã»DI ã³ã³ããã®ååã«ãã解決 ã»Entity Framework ã®ãããã³ã° ã»WPF / XAML ã®ãã€ã³ãã£ã³ã°ïŒããããã£åãæååã§æå®ïŒâ ã»åäœãã¹ãïŒinternal ãèŠããã¹ãïŒ â ãé€å€èšå®ïŒexcludeïŒãäžå¯§ã«æžããå¿ èŠããã â é£èªååŸã«ãå¿ ãçµåãã¹ããéããã¹ã¿ã㯠ãã¬ãŒã¹ã®åé¡:
é£èªåãããšãæ¬çªã§åºãäŸå€ã®ã¹ã¿ã㯠ãã¬ãŒã¹ã at a.b(c d) ã®ããã«ãªããè§£æã§ããªãã ã察çã ãããã³ã° ãã¡ã€ã«ãä¿åãã埩å ããŒã«ã§æ»ã ã»Dotfuscator: Map ãã¡ã€ã« ã»ProGuard: mapping.txt â ããªãªãŒã¹ããšã«ä¿ç®¡ãããã倱ããšè§£æäžèœã«ãªã âç§»è¡ã¡ã¢ïŒããŒã«ã®çŸæ³ïŒ:
ããŒã« çŸæ³ ConfuserEx éçºåæ¢ããã©ãŒã¯ã® ConfuserEx2 ãç¶ç¶ Dotfuscator Community Visual Studio ã«å梱ïŒçŸåœ¹ïŒâ Eazfuscator.NET çŸåœ¹ïŒæåïŒ Babel çŸåœ¹ïŒæåïŒ NanDoKu / Phoenix Protector æŽæ°åæ¢ ProGuardïŒJavaïŒ çŸåœ¹ãAndroid ã§ã¯ R8 ãåŸç¶
è£è¶³ïŒçŸåšã®ãä¿è·ãã®èãæ¹ïŒ: é£èªåã®è°è«ã¯ã
åæããèŠçŽãã¹ã段éã«ãããâ ããããå®ãã¹ããã®ã¯äœã
ãã¯ã©ã€ã¢ã³ãã«é ããã€ããªã«çœ®ããŠã¯ãããªããã®ã ã»API ããŒãæ¥ç¶æååãæå·éµ â â é£èªåããŠããå®è¡æã«ã¯ã¡ã¢ãªäžã«å¹³æã§ååšããã â ãããã¬ãä»ããã°åãã ã»èªå¯ã®ããžã㯠â ã¯ã©ã€ã¢ã³ãåŽã®å€å®ã¯ãå¿ ãè¿åãããã â ããµãŒãåŽã«çœ®ããã®ãå¯äžã®è§£â¡ å®ãããã® / å®ããªããã®
察象 é£èªåã®å¹æ ã¢ã«ãŽãªãºã ã®æ©å¯ïŒç¬èªã®èšç®ããžãã¯ïŒ äžå®ã®å¹æïŒæé皌ãïŒ ã©ã€ã»ã³ã¹ ãã§ã㯠éå®çïŒã¯ã©ãã¯ã®äž»æŠå ŽïŒ ç§å¯æ å ±ïŒéµããã¹ã¯ãŒãïŒ å¹æãªã â èªå¯ã»èª²éã®å€å® 广ãªãïŒãµãŒãã§ããïŒ â¢ çŸåšã®ä»£æ¿ææ®µ
ã»ããµãŒãåŽã«çœ®ããïŒSaaS åïŒ â ããããã¯ã©ã€ã¢ã³ãã«æž¡ããªããæãç¢ºå® ã»ãNative AOT ã§ãã€ãã£ãåãããâ â IL ãæ®ããªããããéã³ã³ãã€ã«ã®é£åºŠãè·³ãäžãã â .NET 7 以éã§å®çšçã«ã坿¬¡çãªä¿è·å¹æããã â ãã ããªãã¬ã¯ã·ã§ã³çã«å¶çŽïŒ[èªäœCUIïŒCLIïŒã®è©±](MS_BuildingYourOwnCLI)ïŒ ã»ã眲åããŠæ¹ç«ãæ€ç¥ãããïŒAuthenticodeïŒ â ãèªãŸããªããã®ã§ã¯ãªããæžãæããæ€ç¥ããã ã»ãéèŠåŠçã HSM / ã»ãã¥ã¢ ãšã¬ã¡ã³ãã«çœ®ããã倿ã®é åºã â ãã®æ å ±ã¯æ¬åœã«ã¯ã©ã€ã¢ã³ãã«çœ®ãå¿ èŠããããïŒ â No ãªã ãµãŒããžç§»ãïŒããã§å€§åã解決ããïŒâ ⡠眮ããªããæŒããå Žåã®åœ±é¿ã¯ã©ãããããïŒ â¢ åœ±é¿ã倧ãããªããé£èªå ïŒ æ€ç¥ ïŒ ããŒããŒã·ã§ã³ãçµã¿åããã ⣠é£èªåã¯ãå€å±€é²åŸ¡ã® 1 å±€ãã§ãããåç¬ã§ã¯æ©èœããªãåæã®ãé£èªåã¯åãªãæé皌ãã«éããããšããäžæãã
20 幎è¿ãçµã£ãçŸåšãæãæ£ç¢ºãªèŠçŽã§ããã
- .NET ToolsïŒ.NETéã³ã³ãã€ã©ãšã³ãŒããé£èªåããDotfuscatorïŒ3/4ïŒ - ïŒ IT
https://atmarkit.itmedia.co.jp/fdotnet/tools/dotfuscator/dotfuscator_03.html
-
éã³ã³ãã€ã© - Wikipedia
https://ja.wikipedia.org/wiki/%E9%80%86%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9 -
ã®éã³ã³ãã€ã©ã¯ã©ããŸã§å®çŸå¯èœãïŒJavaã¯ãªãéã³ã³ãã€ã«ãããããã®ãïŒ
http://www5d.biglobe.ne.jp/~noocyte/Programming/Decompile.html -
æ¢ã«ã³ã³ãã€ã«ãããã¢ã»ã³ããªããããã°ã§ãã.NET Reflector
https://www.infoq.com/jp/news/2012/08/precompiled-net-reflector/ -
C#ã§äœãããããã°ã©ã ããã³ã³ãã€ã«ããŠã¿ãã - ã»ãã»ããŒ
https://tyheeeee.hateblo.jp/entry/CS-Advent-Calendar-2014-Day-15
-
é£èªåã³ãŒã - Wikipedia
https://ja.wikipedia.org/wiki/%E9%9B%A3%E8%AA%AD%E5%8C%96%E3%82%B3%E3%83%BC%E3%83%89 -
.NETããã°ã©ã ã®é£èªåããŒã«ã®ç޹ä»ãšäœ¿ã£ãŠã¿ãææ³
https://rabbitfoot.xyz/code-obfuscation/ -
ãã¥ãŒãã³è£œåæ¡å Spices.NET JP
ïŒ.NET ã¢ããªã±ãŒã·ã§ã³é£èªåããŒã«/éã³ã³ãã€ã©ïŒ
https://www.newtone.co.jp/productsnjp00.html -
Dotfuscator ã®æ©èœ - Visual Studio (Windows) | Microsoft Docs
https://learn.microsoft.com/ja-jp/visualstudio/ide/dotfuscator/capabilities
- Native AOT ã®é
眮
https://learn.microsoft.com/ja-jp/dotnet/core/deploying/native-aot/ - .NET ã®ãœãŒã¹ïŒsource.dot.netïŒ
https://source.dot.net/ - ã¢ã»ã³ããªã®å³å¯åãšçœ²å
https://learn.microsoft.com/ja-jp/dotnet/standard/assembly/sign-strong-name
Tags: ç§»è¡, ããã°ã©ãã³ã°, ãã®ä»ãéçºã®è²ã , .NETéçº