æè¿ãIntelã¯ãœãããŠã§ã¢éçºè åãã®éåžžã«èå³æ·±ãããŒã«ã»ããããªãªãŒã¹ããŸãããããã«ããããœãããŠã§ã¢ã³ãŒãããããã³ã°ããä¿è·ããã¯ã©ãã«ãŒã®ç掻ãå€§å¹ ã«è€éã«ããããšãã§ããŸãã ãã®ãããã«ã¯ãé£èªåã³ã³ãã€ã©ãããŒããããåçã©ã€ãã©ãªã®æŽåæ§ãæ€èšŒããããã«äœ¿çšããã眲åãã¡ã€ã«ãäœæããããŒã«ãæŽåæ§ãã§ãã¯æ©èœã®ã©ã€ãã©ãªããã³è¿œå ã®äŸ¿å©ãªããŒã«ãå«ãŸããŠããŸãã Intel®Tamper Protection ToolkitããŒã¿çã¯ã Intelããå®å šã«ç¡æã§ããŠã³ããŒãã§ããŸãã
é£èªåã³ã³ãã€ã©
Tamper Protection Toolkitã®ããŒã«ã®1ã€ã¯ãé£èªåã³ã³ãã€ã©ãŒiprotã§ãã ãã®ããŒã«ã䜿çšãããšãå®è¡å¯èœã³ãŒããéçããã³åçãªåæ/å€æŽããä¿è·ã§ããŸãã é£èªåã³ã³ãã€ã©ãŒã®çµæã¯ãå€æŽãéçåæã«æµæããèªå·±æå·åãèªå·±å€æŽã³ãŒãã§ãããæ©èœçã«ã¯åæã³ãŒããšåçã§ãã
é£èªåã³ã³ãã€ã©ãŒã¯ãåçã©ã€ãã©ãªãŒã®æ©èœãšé£åããŸãã ãã ããå€ãã®å Žåãã¢ããªã±ãŒã·ã§ã³ã¯ãæ©å¯ã³ãŒããã¢ããªã±ãŒã·ã§ã³å ã«é 眮ãããããã«äœæãããŸãã ãã®ã³ãŒããä¿è·ããã«ã¯ãã¢ããªã±ãŒã·ã§ã³ã®ãªãã¡ã¯ã¿ãªã³ã°ãå°ãè¡ãå¿ èŠããããŸããæ©å¯æ©èœãåå¥ã®åçã©ã€ãã©ãªã«åé¢ããŸãã
é£èªåã³ã³ãã€ã©ã®çµæã§ã¯ãå¥ã®åçã©ã€ãã©ãªãäœæããããã®æ©èœãåŠçãããŸãã ãããã®æ©èœã¯ããã«ä»äºã«äœ¿çšãããŸãã
åœç¶ãã³ãŒãä¿è·ã¯ç¡æã§ã¯ãããŸããã ä¿è·æéã®1ã€ã¯ãã³ãŒãã®é床ãèœãšããé¢æ°ã³ãŒãã®ãµã€ãºã倧ããããããšã§ãã é£èªåã³ã³ãã€ã©ãŒã«ã¯ãã³ãŒãã®ä¿è·/ããã©ãŒãã³ã¹æ¯ãå¶åŸ¡ããããã«äœ¿çšã§ãããã©ã¡ãŒã¿ãŒãããã€ããããŸãã ããã©ãŒãã³ã¹ã®äœäžã¯ãããšãã°ã€ã³ã©ã€ã³é¢æ°ã䜿çšããŠãœãŒã¹ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããããã³ãŒãã®ãµã€ãºã«ãã£ãŠæé©åããããšã§è£ãããšãã§ããŸãã é£èªåã³ã³ãã€ã©ã®ãã©ã¡ãŒã¿--mutation-distanceããã³--cell-sizeãå€æŽããŠã¿ãŠãã ããã
--mutation-distanceãã©ã¡ãŒã¿ãŒã¯ãã³ãŒããèªå·±ä¿®æ£ããé »åºŠãå¶åŸ¡ããŸãã è·é¢ãçããªããšä¿è·ã¯åäžããŸãããããã©ãŒãã³ã¹ãäœäžããŸãã ãã®ãã©ã¡ãŒã¿ãŒã®ããã€ãã®ç°ãªãå€ãè©ŠããŠãããªãã®æèŠã§æé©ãªããã©ãŒãã³ã¹ãéæã§ããŸãã
--cell-sizeãã©ã¡ãŒã¿ãŒã¯ãç¹å®ã®æç¹ã§ã®ãã³ãŒã/ãªãŒãã³ã³ãŒãã®ãµã€ãºãå¶åŸ¡ããŸãã ã³ãŒãã»ã«ã®ãµã€ãºãå°ããã»ã©ä¿è·ã¯åäžããŸãããããã©ãŒãã³ã¹ã¯äœäžããŸãã ã»ã«ãµã€ãºã倧ãããããšãããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãããã³ãŒãä¿è·ãå€§å¹ ã«äœäžããŸãã åæã®ããã«ãã³ãŒãã®å€§éšåãïŒãªãŒãã³ãã©ãŒã ã§ïŒå©çšå¯èœã«ãªããŸãã ãã®ãã©ã¡ãŒã¿ãŒã®ããŸããŸãªå€ãè©Šãããšã«ãããæé©ãªããã©ãŒãã³ã¹ãå®çŸã§ããŸãã
ãããã£ãŠãå®å šã§åæã«çç£çãªã³ãŒããäœæããããšã¯ç°¡åãªäœæ¥ã§ã¯ãªããšèšããŸãã ãã®å®è£ ã§ã¯ãé£èªåã³ã³ãã€ã©ãŒã®ãã©ã¡ãŒã¿ãŒãå€æŽããã ãã§ãªãããœãŒã¹ã³ãŒãããªãã¡ã¯ã¿ãªã³ã°ããŠãããã©ãŒãã³ã¹ãåäžããããœãŒã¹ã³ãŒãã®ãµã€ãºãå°ããããå¿ èŠããããŸãã
ãã¹ãŠã®ã³ãŒããé£èªåã³ã³ãã€ã©ãŒã§åŠçã§ããããã§ã¯ãªãããšã«æ³šæããŠãã ããã ãœãŒã¹ã³ãŒãã«ã¯ãåé 眮ã®æ¬ åŠãéæ¥é·ç§»ïŒinderectãžã£ã³ãïŒãé£èªåã³ã³ãã€ã©ã«ããåŠçæã«ã³ãŒããå©çšã§ããªãä»ã®ã©ã€ãã©ãªããã®é¢æ°åŒã³åºããªã©ã®å¶éããããŸãã
次ã«ãå®ç掻ã§çºçããå¯èœæ§ã®ããã³ãŒãã®éäºææ§ã®åé¡ã«å¯ŸåŠããããšããäŸãæ€èšããŸãã
åçã©ã€ãã©ãªã³ãŒãã®æŽåæ§ãã§ãã¯
åçã©ã€ãã©ãªã®ããŒãå¯èœãªã¢ãžã¥ãŒã«ãå€æŽãããŠããªãããšã確èªããããã«ãã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã«ã¯ç¹å¥ãªããŒã«ã»ãããå«ãŸããŠããŸãã åçã©ã€ãã©ãªçœ²åäœæããŒã«ã¯codebindã§ãããã©ã€ãã©ãªã®æŽåæ§ããã§ãã¯ããããã®é¢æ°ã®å°ããªã©ã€ãã©ãªã¯codeverify.libã§ãã
åçã©ã€ãã©ãªïŒcodebindïŒã®ããžã¿ã«çœ²åãäœæããããŒã«ã¯ãã©ã€ãã©ãªåãšDSAç§å¯ããŒãå ¥åãšããŠåãå ¥ããŸããããã¯ãããšãã°OpenSSL *ã©ã€ãã©ãªã䜿çšããŠçæã§ããŸãã ãã®çµæãè¿œå ã®ãã¡ã€ã«ïŒã»ãã¥ãªãã£ã§ä¿è·ãããããã¯ã¹ïŒãäœæãããŸãããã®ãã¡ã€ã«ã¯ãåŸã§é¢é£ããåçã©ã€ãã©ãªã®æŽåæ§ãæ€èšŒããããã«äœ¿çšãããŸãã
åçã©ã€ãã©ãªã®æŽåæ§ãã§ãã¯ã¯ãã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã®äžéšã§ããããã€ãã®æ©èœã䜿çšããŠå®è¡ãããŸãã APIåŒã³åºããè¿œå ããŠãã¢ããªã±ãŒã·ã§ã³ãå€æŽããå¿ èŠããããŸãã ãã®APIã®æ©èœã«ãããåçã©ã€ãã©ãªãã¡ã¢ãªã«èªã¿èŸŒãåã«éçã©ã€ãã©ãªã®æŽåæ§ããã§ãã¯ïŒéçãã§ãã¯ïŒããããšãã§ããŸãããŸããããã°ã©ã ã®å®è¡äžã«ã©ã€ãã©ãªã³ãŒããå€æŽããããã©ããããã§ãã¯ïŒåçãã§ãã¯ïŒã§ããŸãã
æå·åæ©èœã©ã€ãã©ãª
ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã«ã¯ãããã€ãã®åºæ¬çãªæå·åæ©èœãå«ãŸããŠããŸãã
- åæ¹åããã·ã¥é¢æ°ïŒHMAC SHA256
- 察称ããŒæå·åæ©èœïŒAESïŒCTR / GCMïŒ
- ãããŠãä»ã®ããã€ãã
ãããã®ãã¹ãŠã®æ©èœã¯æ©å¯ã³ãŒãã§äœ¿çšã§ããã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã®äžéšã§ããé£èªåã³ã³ãã€ã©ãŒã«ãã£ãŠåŠçã§ããŸãã
ãããã£ãŠãã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã®ããŒã«ãšæ©èœã䜿çšããŠããŠãŒã¶ãŒã¢ããªã±ãŒã·ã§ã³ã«å«ãŸããæ©å¯ã³ãŒããŸãã¯æ å ±ã®ä¿¡é Œæ§ã®é«ãä¿è·ãäœæã§ããŸãã é£èªåã³ã³ãã€ã©ãŒã䜿çšãããšãèªå·±æå·åããã³èªå·±ä¿®æ£ã³ãŒããäœæããŠãä¿®æ£ããã³éçåæã«èããããšãã§ããŸãã CodebindããŒã«ã¯ããžã¿ã«çœ²åãã¡ã€ã«ã®äœæã«åœ¹ç«ã¡ãŸããæŽåæ§ãã§ãã¯æ©èœã®ã©ã€ãã©ãªã¯ãåçã©ã€ãã©ãªã®æ©èœããã£ã¹ã¯äžãããŒãåãããã³ã³ãŒããã¡ã¢ãªã«ããŒãããåŸã®äž¡æ¹ã§å€æŽããããã©ããã確èªããã®ã«åœ¹ç«ã¡ãŸãã æå·åã©ã€ãã©ãªã®æ©èœã¯ãæå·åã¢ã«ãŽãªãºã ãäœæããé£èªåã³ã³ãã€ã©ã®å©ããåããŠããããä¿è·ããã®ã«åœ¹ç«ã¡ãŸãã
ã³ãŒãé£èªåã®äŸ
ãã®äŸã§ã¯ãã€ã³ãã«Â®ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã«å«ãŸããŠããé£èªåã³ã³ãã€ã©ãŒã䜿çšããŠã³ãŒããä¿è·ããæ¹æ³ã瀺ããŸãã ãŸããã³ãŒãã®é£èªåã®ããã»ã¹ã§çºçããå¯èœæ§ã®ããåé¡ãã©ã®ããã«åãé€ãããšãã§ãããã瀺ããŸãã
ãã®äŸã«å¿ èŠãªãã®
- C / C ++ã®åºæ¬çãªåºç€ãç解ããã åé 眮ãšéæ¥ãžã£ã³ãã«ç²ŸéããŠããã
- C / C ++ã³ã³ãã€ã©ãããšãã°Intel®ã ã³ã³ãã€ã©ãŒãŸãã¯Microsoft Visual Studio *
- ã€ã³ãã«Â®ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ããã
ãã®äŸã§ã¯Visual Studioã³ã³ãã€ã©ãŒã³ãã³ãã䜿çšããŸãããä»ã®ã³ã³ãã€ã©ãŒãšåãæ¹æ³ã§ã³ãŒããã³ã³ãã€ã«ã§ããŸãã
ã€ã³ãã«Â®ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã«å«ãŸããé£èªåã³ã³ãã€ã©ãŒã¯ãåçã©ã€ãã©ãªãžã®ãã¹ïŒdll / soïŒãé£èªåããå¿ èŠãããé¢æ°ã®ååãããã³é£èªåãã©ã¡ãŒã¿ãŒãåãå ¥ããŸãã ãããã£ãŠãåäœããã«ã¯ãæåã«åçã©ã€ãã©ãªãäœæããå¿ èŠããããŸãã åçã©ã€ãã©ãªãäœæããäŸã¯ãdisk folder tutorials \ obfuscation_tutorialã«ãããŸãã
åçã©ã€ãã©ãªãæ§ç¯ããã«ã¯ãVisual Studio *ã䜿çšããŸãã Visual Studioã³ãã³ãããã³ãããå®è¡ãã次ã®ã³ãã³ããå ¥åããŸãã
cl /GS- /GR- src_compatible.c /link /DLL /NOENTRY /OUT:.\src_compatible.dll
ãã®ã³ãã³ãã®çµæãšããŠãsrc_compatible.dllåçã©ã€ãã©ãªã衚瀺ãããã¯ãã§ãã 次ã®ãªãã·ã§ã³ãã³ã³ãã€ã«ã«äœ¿çšãããŸãã
- / GR--ãã®ãªãã·ã§ã³ã¯ãå®è¡æã®ãªããžã§ã¯ãã¿ã€ããã§ãã¯ãç¡å¹ã«ããŸã
- / GS--ãã®ãªãã·ã§ã³ã¯ããªãŒããŒãããŒãã§ãã¯ããªãã«ããŸãã
- / NOENTRY-ãã®ãªãã·ã§ã³ã¯ããã€ãããã¯ã©ã€ãã©ãªã®ã¡ã€ã³ãšã³ããªã®äœæãç¡å¹ã«ããŸãã
ãã¹ããæ©èœãããã«ã¯ããã¹ãã¢ããªã±ãŒã·ã§ã³loadutil.cããã³related.hãã³ã³ãã€ã«ããŸãã
cl loadutil.c /link /OUT:.\loadutil.exe
ãã¹ãã¢ããªã±ãŒã·ã§ã³ãã¢ã»ã³ãã«ããåŸããã¹ããå®è¡ããŠãäœæããåçã©ã€ãã©ãªãæ©èœããããšã確èªã§ããŸãã
loadutil src_compatible.dll
ã¢ããªã±ãŒã·ã§ã³ã¯ã Called get_symbolïŒïŒé¢æ°ãã³ãã³ããŠã£ã³ããŠã«æ£åžžã«æžã蟌ãå¿ èŠããããŸãã
次ã«ã次ã®ã³ãã³ãã䜿çšããŠãåçã©ã€ãã©ãªã®é£èªåãããããŒãžã§ã³ãäœæããŸãã
iprot src_compatible.dll -o obfuscated.dll get_symbol
obfuscated.dllã©ã€ãã©ãªããã£ã¹ã¯ã«è¡šç€ºãããã¯ãã§ãããã®ååããã¹ãã¢ããªã±ãŒã·ã§ã³ã®å ¥åã«éä¿¡ããŸãã
loadutil obfuscated.dll
ã¢ããªã±ãŒã·ã§ã³ã¯ãã³ãã³ããŠã£ã³ããŠã«Called get_symbolïŒïŒé¢æ°ãå床æ£åžžã«æžã蟌ãå¿ èŠããããŸãã ãããã£ãŠãé£èªåãããã©ã€ãã©ãªã¯ãé£èªåãããŠããªãã©ã€ãã©ãªãšæ©èœçã«å®å šã«åçã§ãã ãã ããHEXãšãã£ã¿ãŒã䜿çšããŠåçã©ã€ãã©ãªãèŠããšãé£èªåãããã©ã€ãã©ãªã®ã³ãŒããç解ããããšã¯ã»ãšãã©äžå¯èœã§ããããšãããããŸãã
ããã§ãæåã®æãåçŽãªé£èªåãããåçã©ã€ãã©ãªãæ§ç¯ããŸããã ããè€éãªC / C ++ã³ãŒããé£èªåãããšãã«ã©ã®ãããªåé¡ãå°é£ãçºçããå¯èœæ§ãããã®ãââããŸããã®å¯ŸåŠæ¹æ³ãèŠãŠã¿ãŸãããã
èœãšãç©Žãåé¿ããããã®ãã³ã
ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã®äžéšã§ããé£èªåã³ã³ãã€ã©ãŒã«ã¯ãåŠçããããšããŠããã³ãŒãã«ããã€ãã®å¶éããããŸãã
- ã³ãŒããçæããåé 眮
- éæ¥ãžã£ã³ããçæããã³ãŒã
- ã°ããŒãã«ãªã³ã¯ãçæããPICïŒAnroid *ä»æ§ïŒ
Cèšèªã«ã¯ãéæ¥çãªé·ç§»ãšåé 眮ãçæã§ããããªãã®æ°ã®æ§é ãå«ãŸããŠããŸãã 次ã«ããã®ãããªæ§æã®ããã€ãã®äŸãšãäžèŠãªã³ãŒãã®çæããã€ãã¹ããæ¹æ³ãèŠãŠãããŸãã
é£èªåã³ã³ãã€ã©ãŒãåŠçã§ããªãã³ãŒã-src_incompatible.cãå«ãäŸãèããŠã¿ãŸãããã tutorials / obfuscation_tutorialãã©ã«ããŒã§ååŸã§ããŸãã
ãŸãããã®ãã¡ã€ã«ããåçã©ã€ãã©ãªãæ§ç¯ããŸãã
cl /GS- /GR- src_incompatible.c /link /DLL /NOENTRY /OUT:.\Incompatible.dll
次ã«ããã®åçã©ã€ãã©ãªã®æ©èœã®1ã€ãé£èªåããŸãã
iprot Incompatible.dll -o Obfuincompatible.dll get_symbol
ãã®çµæã次ã®ãããªã¡ãã»ãŒãžã衚瀺ãããã¯ãã§ãã
[parsing_flow-1]ïŒ 'get_symbol'ãåŠçããŠããŸã...
[warning-1]ïŒèŠåïŒæäžäœã«ãŒãã§æ€åºãããæå°éã®çªç¶å€ç°ã ããã«è¿œå
[ã¹ã±ãžã¥ãŒãªã³ã°-1]ïŒãããã¬ãã«ã®çªç¶å€ç°è·é¢ã®èšå®ïŒ1
[åæ-1]ïŒ
[PROC 0ïŒ0x10001010ïŒ12 <-0]
iprotïŒ0x1000101cã§ååŸããã³ãŒãã®åé 眮ã§ãµããŒããããŠããªãã¡ã¢ãªåç §ïŒ
mov alãbyte ptr [eax + 10002000h]
é£èªåã³ã³ãã€ã©ãŒã¯åé 眮ãæ€åºããåŠçãç¶è¡ã§ããŸããã§ããã ããã¯ã get_symbolïŒïŒé¢æ°ãã°ããŒãã«å€æ°alphabetã®åŒã³åºãã䜿çšããããã§ãã ã³ã³ãã€ã©ãŒã¯ãé£èªåã³ã³ãã€ã©ãŒãåŠçã§ããªãåé 眮ãçæããŸãã åé 眮ãåãé€ã1ã€ã®æ¹æ³ã¯ãé¢æ°ãåŒã³åºããšãã«ãã€ã³ã¿ãŒããã©ã¡ãŒã¿ãŒãšããŠæž¡ãããšã§ãã
ãœãªã¥ãŒã·ã§ã³No. 1
char API get_symbol(char const* alphabet_data, unsigned int alphabet_size, unsigned int s_idx) { if (s_idx < alphabet_size) return alphabet_data[s_idx]; return ' '; }
ãã以å€ã®å Žåã¯ãã°ããŒãã«ããŒã¿ã®ä»£ããã«ããŒã«ã«å€æ°ã䜿çšã§ããŸãã
決å®çªå·2
char API get_symbol_second(unsigned int s_idx) { char alphabet_local[26]; alphabet_local[0] = 'a'; alphabet_local[1] = 'b'; alphabet_local[2] = 'c'; alphabet_local[3] = 'd'; alphabet_local[4] = 'e'; alphabet_local[5] = 'f'; alphabet_local[6] = 'g'; alphabet_local[7] = 'h'; alphabet_local[8] = 'i'; alphabet_local[9] = 'j'; alphabet_local[10] = 'k'; alphabet_local[11] = 'l'; alphabet_local[12] = 'm'; alphabet_local[13] = 'n'; alphabet_local[14] = 'o'; alphabet_local[15] = 'p'; alphabet_local[16] = 'q'; alphabet_local[17] = 'r'; alphabet_local[18] = 's'; alphabet_local[19] = 't'; alphabet_local[20] = 'u'; alphabet_local[21] = 'v'; alphabet_local[22] = 'w'; alphabet_local[23] = 'x'; alphabet_local[24] = 'y'; alphabet_local[25] = 'z'; if (s_idx < sizeof(alphabet_local)) return alphabet_local[s_idx]; return ' '; }
次ã«ã次ã®ã³ãã³ãã§ã©ã€ãã©ãªãé£èªåããŸãã
iprot Incompatible.dll -o Obfuincompatible.dll get_next_state
ãã®çµæã次ã®ãã®ãåŸãããŸãã
[parsing_flow-1]ïŒ 'get_next_state'ãåŠçããŠããŸã...
[warning-1]ïŒèŠåïŒæäžäœã«ãŒãã§æ€åºãããæå°éã®çªç¶å€ç°ã ããã«è¿œå
[ã¹ã±ãžã¥ãŒãªã³ã°-1]ïŒæäžäœã®çªç¶å€ç°è·é¢ã®èšå®ïŒ2
[åæ-1]ïŒ
[PROC 0ïŒ0x10001030ïŒ18 <-0]
iprotïŒ0x10001055ã§ååŸããã³ãŒãã®éæ¥ãžã£ã³ãã¯ãµããŒããããŠããŸããïŒ
jmp dword ptr [100010A0h + edx * 4]
é£èªåã³ã³ãã€ã©ã¯ãåŠçã§ããªãéæ¥ãžã£ã³ãã«ééããŸããã
get_next_stateïŒïŒé¢æ°ã³ãŒããèŠããšãéæ¥é·ç§»ãçæããswitchã®äœ¿çšãèŠãããšãã§ããŸãã if-else ifã䜿çšãããšãéæ¥é·ç§»ãç°¡åã«åãé€ãããšãã§ããŸãã
解決ç
my_state API get_next_state(my_state in_state) { if(ST_UNINITIALIZED == in_state) return ST_CONNECTING; if(ST_CONNECTING == in_state) return ST_NEGOTIATING; if(ST_NEGOTIATING == in_state) return ST_INITIALIZING; if(ST_INITIALIZING == in_state) return ST_PROCESSING; if(ST_PROCESSING == in_state) return ST_DISCONNECTING; if(ST_DISCONNECTING == in_state) return ST_FINISHED; return ST_UNINITIALIZED; }
Androidçšã®PICã³ãŒãã®çæãåãé€ãããã«ã -fno-picã³ã³ãã€ã«ãªãã·ã§ã³ã䜿çšã§ããŸãã
ã³ãŒãæŽåæ§ãã§ãã¯ã®äŸ
ãã®äŸã§ã¯ãTamper Protection Toolkitã«ãã£ãŠæäŸããããã€ããªããŒã¿ã®ãã€ã³ãã£ã³ã°ããã³æŽåæ§æ€èšŒãšåŒã°ãããœãããŠã§ã¢æ©èœã®äœ¿çšæ¹æ³ã瀺ããŸãã ãããã®æ©èœã¯ãããã°ã©ã ã³ãŒãã®ã¯ã©ãã«ãŒã®å¯¿åœãå€§å¹ ã«è€éã«ããã®ã«åœ¹ç«ã¡ãŸãã æŽåæ§ãã§ãã¯æ©èœã¯ããã£ã¹ã¯äžã®ããŒã¿ãšããã°ã©ã ã¡ã¢ãªã«ããŒãããããã€ããªã³ãŒãããã§ãã¯ããŸãã ãã®äŸã®æé ã«åŸããšãã³ãŒãã®ãã€ã³ããšæ€èšŒã®äœ¿çšæ¹æ³ãããããŸãã
ãã®äŸã«å¿ èŠãªãã®
- C / C ++ã®åºæ¬çãªåºç€ãç解ããã åé 眮ãšéæ¥ãžã£ã³ãã«ç²ŸéããŠããã
- C / C ++ã³ã³ãã€ã©ãŒãäŸïŒã€ã³ãã«Â®ã³ã³ãã€ã©ãŒãŸãã¯Microsoft Visual Studio *
- ããŒãçæããããã®OpenSSL *ã©ã€ãã©ãªã
- ã€ã³ãã«Â®ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ããã
ãã®äŸã§ã¯Visual Studioã³ã³ãã€ã©ãŒã³ãã³ãã䜿çšããŠããŸãããä»ã®ã³ã³ãã€ã©ãŒãšåãæ¹æ³ã§ã³ãŒããã³ã³ãã€ã«ã§ããŸãã
äŸã®æåã®ã³ã³ããŒãã³ãã§ããåçã©ã€ãã©ãªmodule.dllãæ§ç¯ããããšããå§ããŸãããã ãœãŒã¹ã³ãŒãã¯ã tutorials / code_verificationãã©ã«ãã®ãã£ã¹ã¯ã«ãããŸã ã
cl module.c /link /DLL /OUT:module.dll
次ã«ãåçã©ã€ãã©ãªã®é¢æ°ã䜿çšããã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸãã
cl sample_app_without_verification.cpp /link module.lib
ã¢ã»ã³ãã«ãããã¢ããªã±ãŒã·ã§ã³ãå®è¡ãããšã次ã衚瀺ãããŸãã
> sample_app_without_verification
sumïŒ3,5ïŒã¯8ãè¿ããŸã
sumïŒ3,5ïŒ+ global_array [3]ã¯12ãè¿ããŸã
ããã§ããªã³ã¯ããã³æŽåæ§ãã§ãã¯æ©èœã䜿çšããŠãåçã©ã€ãã©ãªãä¿è·ããæºåããã¹ãŠæŽããŸããã ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã®ããŒã«ã®1ã€ã䜿çšããŠããã»ãã¥ã¢ããã¯ã¹ããšåŒã°ããæ¡åŒµå.sbã®ç¹å¥ãªçœ²åãã¡ã€ã«ãäœæããŸãã ãã®ãã¡ã€ã«ã«ã¯ãmodule.dllåçã©ã€ãã©ãªã®æŽåæ§ãæ€èšŒããããã«ããŒã«ãããé¢æ°ã«ãã£ãŠäœ¿çšãããããŒã¿ãå«ãŸããŠããŸãã
ãŸããOpenSSLã䜿çšããŠå¿ èŠãªããŒãçæããŸãã
md keys openssl dsaparam -out keys/dsaparam.pem 2048 openssl gendsa -out keys/prikey.pem keys/dsaparam.pem openssl dsa -in keys/prikey.pem -outform der -out keys/pubkey.der -pubout
眲åãã¡ã€ã«ãçæããã«ã¯ãcodebind.exeããã°ã©ã ã䜿çšããŸãã ã³ãŒããšçœ²åããªã³ã¯ããæ©èœãžã®å ¥åã¯ãåçã©ã€ãã©ãªãšäºåã«çæãããç§å¯ããŒã§ãã ãã€ã³ãã£ã³ã°ããã»ã¹ã®çµæã¯ã眲åãã¡ã€ã«-ãã»ãã¥ã¢ããã¯ã¹ãã§ãã 眲åãã¡ã€ã«ã®ååãšãã®æ¡åŒµåã¯ããŠãŒã¶ãŒã®éžæã«ããä»»æã§ãã ãã®äŸã§ã¯ãæ¡åŒµåã.sbãã䜿çšãããŸãã ãã€ã³ãã£ã³ã°ã³ãã³ãã¯æ¬¡ã®ããã«ãªããŸãã
codebind -i <path to the dll/so file> -k <path to private key> -o <output path to secure box file>
OpenSSLã䜿çšããŠçæãããç§å¯ããŒã䜿çšããŠåçã©ã€ãã©ãªããªã³ã¯ããã«ã¯ã次ã®ã³ãã³ããå®è¡ããŸãã
codebind -i module.dll -k keys/prikey.pem -o module.sb
ãã©ãããã©ãŒã ããIntel®Secure KeyãããµããŒãããŠããªãå Žåã次ã®ã¡ãã»ãŒãžã衚瀺ãããŸãã
codebindïŒIntel®Secure KeyïŒRDRANDåœä»€ïŒã¯ãµããŒããããŠããŸããã
ã--seedãããã°ã©ã ãªãã·ã§ã³ã䜿çšãã
ãã®å Žåãä¹±æ°ã§--seedã¹ã€ããã䜿çšããŠæ¬¡ã®ã³ãã³ããå®è¡ããŸãã
codebind -i module.dll -k keys/prikey.pem -o module.sb --seed 0xabba
ãªã³ã¯ã«æåãããšãmodule.sbãã¡ã€ã«ããã£ã¬ã¯ããªã«è¡šç€ºãããŸããããã䜿çšããŠãåçã©ã€ãã©ãªã®æŽåæ§ããã§ãã¯ããŸãã
ãã®ãããçŸæç¹ã§ã¯ãä¿è·ããæ©èœãå«ãåçã©ã€ãã©ãªmodule.dllããããŸãã åçã©ã€ãã©ãªããé¢æ°ãåŒã³åºãsample_app_without_verificationã¢ããªã±ãŒã·ã§ã³ã ãããªãã¯ããŒãšãã©ã€ããŒãããŒã®ãã¢ãåŸè ã¯çœ²åãã¡ã€ã«ã®äœæã«äœ¿çšãããã®ã§ããmodule.sbãã§ãã
ãã®äŸã®æ¬¡ã®ã¹ãããã¯ãé¢æ°ãåŒã³åºãããã»ã¹ã§åçã©ã€ãã©ãªã®æŽåæ§ãéçããã³åçã«ãã§ãã¯ããã³ãŒããè¿œå ããããšã§ãã
ãã®ãã¹ã«æ²¿ã£ãæåã®ã¹ãããã¯ãå ¬éããŒãæŽåæ§ãã§ãã¯ã³ãŒãã§äœ¿çšã§ãããã¥ãŒã«å€æããããšã§ãã ãããè¡ãã«ã¯ããbin2hexããšããããŒã«ã䜿çšããŸãããã®ããŒã«ã¯ãå ¥åã§å ¬éããŒãååŸãããCãã³ã³ãã€ã«ã«é©ãã圢åŒã§å ¬éããŒãå«ãããã¹ããã¡ã€ã«ïŒã.hãïŒãçæããŸãã
bin2hex keys/pubkey.der pubkey.h
次ã®æé ã¯ãåçã©ã€ãã©ãªã®æŽåæ§ãã§ãã¯ãsample_app_without_verification.cppã¢ããªã±ãŒã·ã§ã³ã«è¿œå ããã®ã«åœ¹ç«ã¡ãŸãã ãã¹ãŠã®ã³ãŒãããœãŒã¹ãã¡ã€ã«ã«è¿œå ããããsample_app_with_verification.cppãã¡ã€ã«ã«äžèŽããã³ãŒããååŸããå¿ èŠããããŸãã
ãããã£ãŠãå¿ èŠãªããããŒãã¡ã€ã«ãå«ããããšããå§ããŸãããã
#include "codeverify.h" #include "pubkey.h" #include <fstream> #include <memory> #if defined(_WIN32) #include <windows.h> #else #include <dlfcn.h> #endif
次ã«ããšã©ãŒåŠçã®ã³ãŒããšãå¿ èŠãªå€æ°ãšé¢æ°ã®å®£èšãè¿œå ããŸãã
ãšã©ãŒã³ãŒããšå®£èš
enum { V_STATUS_OK = 0, /*!< Indicates no error */ V_STATUS_NULL_PTR = -1, /*!< Input argument is null pointer */ V_STATUS_BAD_ARG = -2, /*!< Bad input argument */ V_STATUS_KEY_GETSIZE_FAILED = -3, /*!< Key get size failed */ V_STATUS_KEY_INIT_FAILED = -4, /*!< Key init failed */ V_STATUS_VER_GETSIZE_FAILED = -5, /*!< Verification get size failed */ V_STATUS_VER_INIT_FAILED = -6, /*!< Verification init failed */ V_STATUS_VERIFICATION_FAILED = -7, /*!< Verification failed */ V_STATUS_RANGE_SAFE_FAILED = -8, /*!< Is Range Safe failed */ V_STATUS_ERR = -9 /*!< Unexpected error */ }; CodeVerify *c_verifier = 0; unsigned char * ReadFromFile(const string & file_name, unsigned int &fsize); int InitVerification(void *handle, unsigned char *sb, unsigned int sb_size);
ã³ãŒããè¿œå ããŠãåçã©ã€ãã©ãªãšçœ²åãã¡ã€ã«ãããŠã³ããŒãããŸã
å€æ°ã®å®£èšãšãã¡ã€ã«ã®èªã¿åã
#if defined _WIN32 string dll_name = "module.dll"; //path to dll. string sb_name = "module.sb"; //path to sb. #else string dll_name = "libmodule.so"; //path to shared library. string sb_name = "module.sb"; //path to sb. #endif //Read SB to buffer: unique_ptr<unsigned char[]> sb; unsigned int sb_size = 0; sb.reset(ReadFromFile(sb_name, sb_size)); if(!sb) { cout << "SB file reading failed!" << endl; return V_STATUS_ERR; }
ãã¡ã€ã«ã®æåŸã«ãã³ãŒãã§äœ¿çšããããã¡ã€ã«èªã¿åãé¢æ°ãè¿œå ããŸãã
ãã¡ã€ã«ããèªã¿åãé¢æ°
unsigned char * ReadFromFile(const string & file_name, unsigned int &fsize) { ifstream f; f.open (file_name, ifstream::in | ifstream::binary); if(f) { f.seekg(0, ios::end); unsigned int size = (unsigned int)f.tellg(); f.seekg(0, ios::beg); // allocate memory to contain file data unique_ptr<unsigned char[]> res(new unsigned char[size]); f.read((char*)res.get(), size); if(!f) { f.close(); return 0; } f.close(); fsize = size; return res.release(); } return 0; }
æŽåæ§ãã§ãã¯ã³ã³ããã¹ãã®åæåã¯ãå ¥åãã©ã¡ãŒã¿ãŒãšããŠçœ²åãã¡ã€ã«ãããã¡ã€ã«ãã€ã³ã¿ãŒãšããŒã¿ãååŸããInitVerificationïŒïŒé¢æ°å ã§çºçããŸãã
åæå
//Get DLL handle: #if defined _WIN32 HMODULE handle = GetModuleHandle(dll_name.c_str()); #else Dl_info dl_info; dladdr((void*)sum, &dl_info); void *handle = dlopen(dl_info.dli_fname, RTLD_NOW); #endif if(!handle) { cout << "Dll handle can't be obtained, dll-name: " << dll_name.c_str() << endl; return V_STATUS_ERR; } int ret = V_STATUS_OK; ret = InitVerification(handle, sb.get(), sb_size); if(V_STATUS_OK != ret) { cout << "InitVerification failed! Error code: " << ret << endl; #if defined _WIN32 if(c_verifier) delete [](char*)c_verifier; #else if(handle) dlclose(handle); if(c_verifier) delete [](char*)c_verifier; #endif return V_STATUS_ERR; }
InitVerificationïŒïŒé¢æ°ã®å®è£ ããã¡ã€ã«ã®æåŸã«è¿œå ããŸãã
InitVerificationïŒïŒé¢æ°
int InitVerification(void *handle, unsigned char *sb, unsigned int sb_size) { DECLARE_pubkey_der; VerificationKey *m_verifier = 0; unsigned int size = 0; int err = V_STATUS_ERR; if(!handle || !sb) return V_STATUS_NULL_PTR; if(!sb_size) return V_STATUS_BAD_ARG; DEFINE_pubkey_der; //Get size of VerificationKey context: if(VK_STATUS_OK != VerificationKey_GetSize(pubkey_der, sizeof(pubkey_der), &size)) { return V_STATUS_KEY_GETSIZE_FAILED; } //VerificationKey context memory allocation: m_verifier = (VerificationKey *)(new char[size]); //Init VerificationKey context: if(VK_STATUS_OK != VerificationKey_Init(m_verifier, pubkey_der, sizeof(pubkey_der))) { err = V_STATUS_KEY_INIT_FAILED; if(m_verifier) delete [] (char*)m_verifier; return err; } //Get size of CodeVerify context: if(CV_STATUS_OK != CodeVerify_GetSize(sb,sb_size,m_verifier,&size)) { err = V_STATUS_VER_GETSIZE_FAILED; if(m_verifier) delete [] (char*)m_verifier; return err; } //CodeVerify context memory allocation: c_verifier = (CodeVerify*)(new unsigned char[size]); //Init CodeVerify context: if(CV_STATUS_OK != CodeVerify_Init(c_verifier,size,(const void *)handle,sb,sb_size,m_verifier)) { err = V_STATUS_VER_INIT_FAILED; if(m_verifier) delete [] (char*)m_verifier; return err; } err = V_STATUS_OK; if(m_verifier) delete [] (char*)m_verifier; return err; }
æŽåæ§ãã§ãã¯ã®ã³ã³ããã¹ããåæåãããšããã¹ãŠãã¡ã¢ãªã«ããŒããããåçã©ã€ãã©ãªã®åçæŽåæ§ãã§ãã¯ãè¿œå ããæºåãæŽããŸãã ããã¯ã CodeVerify_VerifyïŒïŒé¢æ°ãåŒã³åºãããšã«ãã£ãŠè¡ãããŸãã ãã®é¢æ°ã¯ãããŒããããã©ã€ãã©ãªã®æŽåæ§ããã§ãã¯ããããã«ãã³ãŒãå ã®ç°ãªãå Žæã§äœåºŠã§ãåŒã³åºãããšãã§ããŸãã ãã®é¢æ°ã«ã¯å ¥åãã©ã¡ãŒã¿ãŒ-work_factorããããããã䜿çšããŠãããŒããããã©ã€ãã©ãªãŒã®ãã§ãã¯æžã¿ã¡ã¢ãªãŒã®ãµã€ãºãåæžã§ããŸãã ããšãã°ã work_factor = 3ã®å Žå ãããŒããããåçã©ã€ãã©ãªã®å®å šãªãã§ãã¯ã¯3ã€ã®é¢æ°åŒã³åºãã§å®äºããŸãã CodeVerify_VerifyïŒïŒé¢æ°ãåŒã³åºããããã³ã«æž¡ãããpass_countå€æ°ã«ã¯ãåçã©ã€ãã©ãªã®å®å šãã§ãã¯ã®æ°ãå«ãŸããŸãã
ã°ããŒãã«å€æ°ã䜿çšããã¢ããªã±ãŒã·ã§ã³ã³ãŒãã®å®è¡äžã«èª°ãããããå€æŽããããªãå Žåã¯ã CodeVerify_IsRangeSafeïŒïŒé¢æ°ã䜿çšããŠã CodeVerify_VerifyïŒïŒé¢æ°ãåŒã³åºããŠãç®çã®ããŒã¿ã®æŽåæ§ã確èªã§ããŸãã
å€æ°ã®ãã§ãã¯ãšã·ã£ããããŠã³
ret = CodeVerify_IsRangeSafe(c_verifier, global_array, sizeof(global_array)); if(CV_STATUS_OK != ret) { cout << "IsRangeSafe failed!" << endl; #if defined _WIN32 if(c_verifier) delete [](char*)c_verifier; #else if(handle) dlclose(handle); if(c_verifier) delete [](char*)c_verifier; #endif return V_STATUS_RANGE_SAFE_FAILED; } cout << "Range verification was successfully done!" << endl;
codeverifyã©ã€ãã©ãªé¢æ°ã®äœ¿çšãçµäºããããæŽåæ§ãã§ãã¯ã«äœ¿çšããã¡ã¢ãªã解æŸããã¡ã¢ãªããåçã©ã€ãã©ãªãã¢ã³ããŒãããããšãå¿ããªãã§ãã ããã
ãªãœãŒã¹ãªãªãŒã¹
#if defined _WIN32 if(c_verifier) delete [](char*)c_verifier; #else if(handle) dlclose(handle); if(c_verifier) delete [](char*)c_verifier; #endif
æŽåæ§ãã§ãã¯ã³ãŒããæå¹ã«ããŠããã°ã©ã ããã«ãããã«ã¯ã次ã®ã³ã³ãã€ã«ã³ãã³ãã䜿çšã§ããŸãã
cl sample_app_without_verification.cpp /I../../inc /link ../../lib/win-x86/codeverify.lib module.lib
ã³ã³ãã€ã«ãæåããã¢ããªã±ãŒã·ã§ã³ãæ£åžžã«äœæãããå Žåããããéå§ã§ãã以äžãååŸããå¿ èŠããããŸãã
> sample_app_without_verification
ç¯å²æ€èšŒãæ£åžžã«å®äºããŸããïŒ
sumïŒ3,5ïŒã¯8ãè¿ããŸã
sumïŒ3,5ïŒ+ global_array [3]ã¯12ãè¿ããŸã
module.dllã©ã€ãã©ãªé¢æ°ã®ã³ãŒãã³ãŒããå€æŽããŠåæ§ç¯ããããžã¿ã«çœ²åãã¡ã€ã«ãåäœæããã«ãã¹ãã¢ããªã±ãŒã·ã§ã³ã§å®è¡ããããšãããšãå®å šæ§ãã§ãã¯ã§ãµããµãã¢ãŒããèªèããããšã©ãŒãçºçããŸãã
> sample_app_without_verification
InitVerificationã倱æããŸããïŒ ãšã©ãŒã³ãŒãïŒ-6
ãããããããŒãå¯èœãªåçã©ã€ãã©ãªã®æŽåæ§ãæ€èšŒããããã«ã€ã³ãã«Â®ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ãããã䜿çšããå¿ èŠãããã®ã¯ããã ãã§ãã
ã€ã³ãã«Â®ã¿ã³ããŒãããã¯ã·ã§ã³ããŒã«ããããžã®ãã®çããšã¯ã¹ã«ãŒã·ã§ã³ãæçšã§ããããããäœã§ãããäœãã§ãããœãããŠã§ã¢ãä¿è·ããããã«ãããã©ã®ããã«äœ¿çšã§ããããç解ããã®ã«åœ¹ç«ã€ããšãé¡ã£ãŠããŸãã é 匵ã£ãŠ
*ãã®ä»ã®å称ããã³åæšã¯ãããããã®ææè ã®è²¡ç£ã§ãã