![](https://habrastorage.org/files/613/3b0/ab9/6133b0ab9f0b4f368aa49f5712a7b8ae.jpg)
1.ã¯ããã«
ãããè¡ããŸãããã ãã®èšäºã¯é·ããªãããšãçŽæããŸãããªããªããããªãã質åãããªãããã«ãããæžãããããã§ãã QMSãããã¯ã«é¢ããèšäºã¯ãã§ã«100äžä»¶ãããŸãããããã§åé¡ã«é¢ããç§ã®ããžã§ã³ã瀺ããŸããQMSãäœçŸæéãæžããåŸ...ããã§ãã¹ãŠã®äœæ¥ãããã·ã¥ããããšããŸãã ããã§ãã¹ãŠãããããžã¥ãŒã¹ïŒãŸãã¯ããã§é£²ã¿ãããã®ïŒãæã«å ¥ããé³æ¥œã倧ããããŠãã¢ããªããåå¿è ã®ã¯ã©ãã«ãŒãåãé€ãæ¹æ³ãåŠã¶æºåãã§ããŸããïŒ ãã®éçšã§ãWindowsã®ã¡ã¢ãªããããªããçããªããã®ä»ã®ããšã«ã€ããŠã話ãããŸãã
2.èªå·±ä¿®æ£ã³ãŒãã®ç°¡åãªæŽå²
æè¿ã§ã¯ãããã°ã©ããŒã¯ãèªå·±ä¿®æ£ã³ãŒãã奜ããªå Žæã§äœ¿çšããããšãã§ããŸããã 10ã20幎åãããã°ã©ã ãä¿è·ããããã®å€ããå°ãªããæ·±å»ãªè©Šã¿ã¯QMSïŒèªå·±ä¿®æ£ã³ãŒãïŒã䜿çšããŠããŸããã ããã€ãã®ã³ã³ãã€ã©ã§ãããã¡ã¢ãªå ã®ã³ãŒãã§åäœããQMSã䜿çšããŸããã
ãã®åŸã90幎代åã°ã«äœããèµ·ãããŸããã ããã¯Windows 95 / NTãšåŒã°ãããã®ã§ãã çªç¶ãç§ãã¡ããã°ã©ããŒã¯ãåã«ãã£ãããšãã¹ãŠãã§ãããã§ãããšããããšãç解ããããã«ãªããæ°ãããã©ãããã©ãŒã ãåŠã¶å¿ èŠããããŸããã 以åã«çºæããããã¹ãŠã®ããªãã¯ã¯å¿ããããå¯èœæ§ããããŸããã¡ã¢ãªãããŒããŠã§ã¢ãããã³ãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãå¿ èŠãšããã«ãã¬ã€ã§ããªããªã£ãããã§ãã ã»ãšãã©ã®äººã¯ãVxDã䜿çšããªããšQMSãæžãããšã¯ã§ããªããšèããŠããŸããããã®ãããWindowsã«äžè¬çã§ããããã«ãå€ããå°ãªããæèœãªããã¥ã¡ã³ãã¯ãããŸããã§ããã ãã°ããããŠãããã°ã©ã ã§åŒãç¶ãQMSã䜿çšããå Žåãããããšãå€æããŸããã 1ã€ã®æ¹æ³ã¯ãKernel32ã©ã€ãã©ãªã«ãã£ãŠãšã¯ã¹ããŒããããWriteProcessMemoryé¢æ°ã䜿çšããããšã§ãããã1ã€ã®æ¹æ³ã¯ãã³ãŒããã¹ã¿ãã¯ã«é 眮ããŠããå€æŽããããšã§ãã
èšäºã®æ®ãã®éšåã¯ãäž»ã«Microsoft Visual C ++ããã³32ããããµãã·ã¹ãã ã«åœãŠãããŠããŸãã
3.ãã®ãŸãŸã®Windowsã¡ã¢ãª
Windowsã§ã®QMSã®äœæã¯ãç§ãã¡ãæãã»ã©ç°¡åã§ã¯ãããŸããã ããã§ã¯ãWindowsã®äœæè ã«ãã£ãŠæ³šææ·±ãã¬ã€ã¢ãŠããããããã€ãã®èœãšãç©Žã«ééããŸãã ãªãã§ïŒ ã¯ããããã¯ãã€ã¯ããœããã ããã§ãã
ãåãã®ãšãããWindowsã¯åããã»ã¹ã«4ã®ã¬ãã€ãã®ä»®æ³ã¡ã¢ãªãå²ãåœãŠãŸãã ãã®ã¡ã¢ãªã«å¯ŸåŠããããã«ãWindowsã¯2ã€ã®ã»ã¬ã¯ã¿ãŒã䜿çšããŸãã 1ã€ã¯CSã»ã°ã¡ã³ãã¬ãžã¹ã¿ã«ããŒãããããã1ã€ã¯DSãSSãããã³ESã¬ãžã¹ã¿ã«ã¹ããŒãããŸãã ãããã¯ãã¹ãŠåãããŒã¹ã¢ãã¬ã¹ïŒ0ã«çããïŒã䜿çšãã4ã®ã¬ãã€ãã®ã¹ããŒã¹ã«å¶éãããŠããŸãã
ããã°ã©ã ã¯ãã³ãŒããšããŒã¿ã®äž¡æ¹ãå«ã1ã€ã®ã»ã°ã¡ã³ããšã1ã€ã®ããã»ã¹ã¹ã¿ãã¯ã®ã¿ãæã€ããšãã§ããŸãã MIDDLEããã·ãŒãžã£ã³ãŒã«ã䜿çšããããã¹ã¿ãã¯ã«ããå¶åŸ¡ã³ãŒãã«åãæ¿ããããšãã§ããŸãã åŸè ã®å ŽåãSSã䜿çšããŠã¹ã¿ãã¯ã«ã¢ã¯ã»ã¹ããªãã§ãã ããã CSã¬ãžã¹ã¿ã®å€ã¯DSãSSãããã³ESãšäžèŽããŸããããMOV destãCSïŒ[src]ãMOV destãDSïŒ[src]ãããã³MOV destãSSïŒ[src]ã³ãã³ãã¯ãã¹ãŠåãã¡ã¢ãªãã±ãŒã·ã§ã³ã«ã¢ã¯ã»ã¹ããŸãã
ããŒã¿ãã³ãŒããããã³ã¹ã¿ãã¯ãå«ãã¡ã¢ãªé åïŒããŒãžïŒã«ã¯ãããã€ãã®å±æ§ããããŸãã ããšãã°ãã³ãŒãããŒãžã§ã¯ãèªã¿åããšå®è¡ãããŒã¿ããŒãž-èªã¿åããšæžã蟌ã¿ãã¹ã¿ãã¯-èªã¿åããæžã蟌ã¿ãšå®è¡ãåæã«è¡ãããšãã§ããŸãã
ãããã®ããŒãžã«ã¯ãå€ãã®ã»ãã¥ãªãã£å±æ§ããããŸãã ãããã«ã€ããŠã¯ãå¿ èŠãªãšãã«å°ãåŸã§èª¬æããŸãã
4. WriteProcessMemory-æ°ãã芪å
ïŒç§ã®æèŠã§ã¯ïŒããã»ã¹å ã®æ°ãã€ããå€æŽããæãç°¡åãªæ¹æ³ã¯ãWriteProcessMemoryé¢æ°ã䜿çšããããšã§ãïŒä¿è·ãã©ã°ãèšå®ãããŠããªãå ŽåïŒã
ãã®ããã«æåã«è¡ãããšã¯ãã¢ã¯ã»ã¹å±æ§PROCESS_VM_OPERATIONããã³PROCESS_VM_WRITEã䜿çšããŠOpenProcessé¢æ°ã䜿çšããŠãã¡ã¢ãªã«ããŒããããããã»ã¹ã«ã¢ã¯ã»ã¹ããããšã§ãã 以äžã¯ãç°¡åãªQMSã®äŸã§ãããã«ã€ããŠèª¬æããŸãã C ++ã§ã¯ããã®ã¡ã«ããºã ãå®è£ ããã«ã¯ãèšèªã®çµã¿èŸŒã¿æ©èœãããã€ãå¿ èŠã§ãã ãã¡ãããããã¯ãã¹ãŠä»ã®èšèªã§ãå®è¡ã§ããŸãããããã«ã€ããŠã¯æ¹ããŠèª¬æããŸãã ããã«ãä»ã®èšèªã§ã¯ãããã¯ãã¹ãŠã¯ããã«è€éã«èŠããŸãã
ãªã¹ã1. QMSãµãŒãã¹ã®WriteProcessMemory
int WriteMe(void *addr, int wb) { HANDLE h=OpenProcess(PROCESS_VM_OPERATION| PROCESS_VM_WRITE, true, GetCurrentProcessId()); return WriteProcessMemory(h, addr, &wb, 1, NULL); } int main(int argc, char* argv[]) { _asm { push 0x74 ; JMP >> JZ push offset Here call WriteMe add esp, 8 Here: JMP short Here } printf("Holy Sh^& OsIX, it worked! #JMP SHORT $2 was changed to JZ $2n"); return 0; }
ã芧ã®ãšãããããã°ã©ã ã¯ç¡éã«ãŒããåçŽãªJZé·ç§»ã«çœ®ãæããŸãã ããã«ãããããã°ã©ã ã¯æ¬¡ã®æ瀺ã«é²ãããšãã§ãã眮æã®äºå®ã確èªããã¡ãã»ãŒãžã衚瀺ãããŸãã ãããã ç§ã¯ããªããä»æããšæãã«...ããŒããé¢çœãããç§ã¯ãã®ãããªäœããããããšãã§ããŸããïŒ ããããããã§ãïŒ
ãã ãããã®ã¡ãœããïŒWriteProcessMemoryã䜿çšïŒã«ã¯å€ãã®è匱æ§ããããŸãã ãŸããçµéšè±å¯ãªã¯ã©ãã«ãŒãã€ã³ããŒãããŒãã«ãåæããçãããæ©èœãæ€åºããŸãã 圌ã¯ãããããããã®åŒã³åºãã«ããã€ãã®äŒæ©ãå ¥ããè¿ãã®ã³ãŒããåæããå¿ èŠãªãã®ãèŠã€ããŸãã WriteProcessMemoryã®äœ¿çšãäžè¬çãªã®ã¯ãã¡ã¢ãªå ã®ã³ãŒããåéããã³ã³ãã€ã©ãŒããŸãã¯å®è¡å¯èœãã¡ã€ã«ã®ã¢ã³ããã«ãŒã®ã¿ã§ãã ãã ãããã®ããªãã¯ã䜿çšãããšãåå¿è ã®ã¯ã©ãã«ãŒãèªç±ã«åãè©°ããããšãã§ããŸãã ç§ã¯èªåã®ããã°ã©ã ã§ãã®ãã¯ããã¯ããã䜿çšããŠããŸãã
ãã1ã€ã®Sax WriteProcessMemoryã¯ãã¡ã¢ãªã«æ°ããããŒãžãäœæã§ããªãããšã§ãã ãã®æ©èœã®ããªãã¯ã¯ãæ¢åã®ããŒãžã§ã®ã¿æ©èœããŸãã ãããã£ãŠããã®é¢æ°ã®ã¢ããªã±ãŒã·ã§ã³ãæãæµ®ãã¹ãæ¹æ³ã¯ããã€ããããŸãããã¹ã¿ãã¯äžã®ã³ãŒãã®å®è¡ã«æ³šæãåããŸãã
5.ã¹ã¿ãã¯ã«ã³ãŒããé 眮ããå®è¡ããŸãïŒ
ã¹ã¿ãã¯ã«ã³ãŒããé 眮ããããšã¯èš±å®¹ãããã ãã§ãªããæã«ã¯å¿ èŠã«ãªãããšãããããŸãã ç¹ã«ãã³ã³ãã€ã©ãŒããã®å Žã§ã³ãŒããçæã§ããããã«ããããšã§ãã³ã³ãã€ã©ãŒã®äœæ¥ã楜ã«ããŸãã ããããã¹ã¿ãã¯ãšã®ãã®ãããªèªç±ã¯ã·ã¹ãã ã®ã»ãã¥ãªãã£ãå±éºã«ãããã§ããããïŒ ãã¡ããã圌ãã¯ããªãã®ãå°»ã«ãã©ãã«ãããããå¯èœæ§ããããŸãã ããã«ãããã¯ããã°ã©ã ã«æé©ãªãã¯ãããžãŒã§ã¯ãããŸãããã¹ã¿ãã¯äžã§ã³ãŒãã®å®è¡ãçŠæ¢ããããããã€ã³ã¹ããŒã«ãããšãã»ãšãã©ã®äœæã麻çºããããã§ãã äžæ¹ããã®ãããªãããã¯ãããŸãããç¹ã«LinuxãSolarisã«ã¯éåžžã«äŸ¿å©ã§ããããããã€ã³ã¹ããŒã«ããã®ã¯2人ã ãã ãšæããŸãïŒèè èªèº«ãhee heeïŒã
äžèšã®WriteProcessMemoryã®è匱æ§ããŸã èŠããŠããŸããïŒ ã¹ã¿ãã¯ã«å®è¡å¯èœã³ãŒããé 眮ããããªãã¯ã¯ãããããåé€ããããã®2ã€ã®çŽ æŽããããªãã·ã§ã³ãæäŸããŸãã ãŸããã³ãŒããå€æŽããåœä»€ã¯ã¡ã¢ãªã®æªç¥ã®ã»ã¯ã·ã§ã³ã«ãããããã¯ã©ãã«ãŒããããã远跡ããããšã¯ã»ãšãã©äžå¯èœã§ãã ä¿è·ãããã³ãŒããåæããã«ã¯ã圌ã¯ç§ãã¡ã®ããã°ã©ã ã®ããªãŒãåœæèªäœã®äžã§åãåããªããã°ãªããªãã®ã§ããããã圌ã®äœåã¯å€§æåãåããããšã¯ãããŸããïŒ ã¹ã¿ãã¯ã§ã³ãŒããå®è¡ããããšãæ¯æãããã1ã€ã®è°è«ã¯ãããã°ã©ã ã¯ãã€ã§ãå¿ èŠãªã ãã¡ã¢ãªãå²ãåœãŠããã€ã§ã解æŸã§ãããšããããšã§ãã ããã©ã«ãã§ã¯ããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯ã¹ã¿ãã¯ã«1 MBã®ã¡ã¢ãªãå²ãåœãŠãŸãã å®è¡äžã®ã¿ã¹ã¯ãããå€ãã®ã¡ã¢ãªãå¿ èŠãšããå Žåãããã°ã©ã ã¯è¿œå ã®ã¯ã©ãŒã¿ãèŠæ±ããå ŽåããããŸãã
ãã ããã¹ã¿ãã¯ã«ã³ãŒããé 眮ããåã«ç¥ã£ãŠããå¿ èŠã®ãããã¥ã¢ã³ã¹ãããã€ããããŸãããããã£ãŠãããã§ãããã«ã€ããŠèª¬æããŸãã
6.ããŒãã³ã°ã³ãŒããå¥åº·ã«æªãçç±
Windows 9xãWindows NTãããã³Windows 2kã§ã¯ãã¹ã¿ãã¯ãç°ãªãå Žæã«ã¹ã¿ãã¯ãããããšã«æ³šæããŠãã ããã ãããã£ãŠãããã°ã©ã ãã¯ãã¹ãã©ãããã©ãŒã ã«ããããã«ã¯ãçžå¯Ÿã¢ãã¬ã¹æå®ã䜿çšããããšãéèŠã§ãã ãã®èŠä»¶ãå®çŸããããšã¯ããã»ã©é£ãããããŸããããã®ããã«ã¯ãããã€ãã®ç°¡åãªã«ãŒã«ã«åŸãã ãã§ãã
80x86ã®äžçã§ã¯ããã¹ãŠã®ãã·ã§ãŒããžã£ã³ãããšãnir-kalaãã¯çžå¯Ÿçãªãã®ã§ãã ã€ãŸããç·åœ¢ã¢ãã¬ã¹ã䜿çšããå¿ èŠã¯ãããŸããããå®å ã¢ãã¬ã¹ãšæ¬¡ã®ããã°ã©ã åœä»€ã®ã¢ãã¬ã¹ã®å·®ã䜿çšããå¿ èŠããããŸãã ãã®ãããªçžå¯Ÿçãªã¢ãã¬ã¹æå®ã¯ç§ãã¡ã®ç掻ãå€§å¹ ã«ç°¡çŽ åããŸãããããã«ãéçããããŸãã
ããšãã°ãvoid OSIXDemoïŒïŒ{printfïŒ "Hi from OSIXn"ïŒ;}é¢æ°ãã¹ã¿ãã¯ã«ã³ããŒãããŠåŒã³åºãããå Žåã¯ã©ããªããŸããïŒ ãã®ãããªåŒã³åºãã¯ãprintfã¢ãã¬ã¹ãå€æŽãããŠããããããšã©ãŒã«ãªãå¯èœæ§ããããŸãã
ã¢ã»ã³ãã©ã§ã¯ãã¢ãã¬ã¹æå®ã¬ãžã¹ã¿ã䜿çšããŠããã®åé¡ãç°¡åã«ä¿®æ£ã§ããŸãã ããšãã°ãLEA EAXãprintfNCALL EAXãªã©ãprintfé¢æ°ã®ããŒãã³ã°åŒã³åºããéåžžã«ç°¡åã«å®è£ ã§ããŸãã ããã§ãçžå¯Ÿã§ã¯ãªã絶察ç·åœ¢ã¢ãã¬ã¹ãEAXã¬ãžã¹ã¿ã«é 眮ãããŸãã ãããã£ãŠãprintfé¢æ°ãã©ãããåŒã³åºããããã¯é¢ä¿ãããŸãããæ£ããæ©èœããŸãã
ãã®ãããªããªãã¯ãåçŸããã«ã¯ãã³ã³ãã€ã©ãã¢ã»ã³ãã©ãŒæ¿å ¥ããµããŒãããŠããå¿ èŠããããŸãã ããªããäœã¬ãã«ã®ããã°ã©ãã³ã°ã«èå³ããªããªããããã¯ããªãã«ãšã£ãŠå®å šãªãµãã¯ã¹ã§ãããé«ã¬ãã«ã®èšèªã«ãã£ãŠæäŸãããå µåšåº«ã«èªåèªèº«ãå¶éããããšã§ãŸã£ããåãããšãã§ãããããããŸããã 以äžã«ç°¡åãªäŸã瀺ããŸãã
ãªã¹ã2.é¢æ°ãã¹ã¿ãã¯ã«ã³ããŒããŠå®è¡ããæ¹æ³
void Demo(int (*_printf) (const char *,...)) { _printf("Hello, OSIX!n"); return; } int main(int argc, char* argv[]) { char buff[1000]; int (*_printf) (const char *,...); int (*_main) (int, char **); void (*_Demo) (int (*) (const char *,...)); _printf=printf; int func_len = (unsigned int) _main (unsigned int) _Demo; for (int a=0; a<func_len; a++) buff[a] = ((char *) _Demo)[a]; _Demo = (void (*) (int (*) (const char *,...))) &buff[0]; _Demo(_printf); return 0; }
ãããã£ãŠãé«ã¬ãã«ã®èšèªã§ã¯ã¹ã¿ãã¯äžã§ã³ãŒããå®è¡ã§ããªãããšã誰ãè³ã«ã€ããªãã§ãã ããã
7.æé©åãä»ããéå§ããŸãïŒ
QMSãèšè¿°ããããã¹ã¿ãã¯ã§å®è¡ãããã³ãŒãã䜿çšããå Žåãã³ã³ãã€ã©ãŒã®éžæã«çå£ã«åãçµã¿ããã®æ©èœãç 究ããå¿ èŠããããŸãã æãå¯èœæ§ãé«ãã®ã¯ãç¹ã«ã³ã³ãã€ã©ããæé©åãã¢ãŒãã«èšå®ãããŠããå Žåãããã°ã©ã ããããã°ã©ã ãžã®æåã®ã¢ã¯ã»ã¹ã§ã³ãŒãããšã©ãŒãæããããããšã§ãã
ãªããããèµ·ãã£ãŠããã®ã§ããïŒ CãPascalã®ãããªçŽç²ã«é«ã¬ãã«ã®ããã°ã©ãã³ã°èšèªã§ã¯ãé¢æ°ã³ãŒããã¹ã¿ãã¯ãä»ã®å Žæã«ã³ããŒããã®ã¯éåžžã«é£ããããã§ãã ããã°ã©ãã«ã¯é¢æ°ãžã®ãã€ã³ã¿ãååŸããæ©äŒããããŸãããåæã«ããã®äœ¿çšãæšæºåããã«ãŒã«ã¯ãããŸããã ããã°ã©ããŒã®éã§ã¯ãããã¯ãããžãã¯ãã³ããŒããšåŒã°ããã³ã³ãã€ã©ãŒã ããç¥ã£ãŠããŸãã
幞ããªããšã«ãã»ãšãã©ãã¹ãŠã®ã³ã³ãã€ã©ã¯ã³ãŒããçæãããšãã«åãããžãã¯ã䜿çšããŸãã ãããã¯ãããçš®ã®æªèšè¿°ã®ã³ãŒãã³ã³ãã€ã«èŠåã§ãã ãããã£ãŠãããã°ã©ããŒã䜿çšã§ããŸãã
ãªã¹ã2ãããäžåºŠèŠãŠã¿ãŸããããDemoïŒïŒé¢æ°ãžã®ãã€ã³ã¿ãŒã¯ãã®éå§ãšäžèŽããé¢æ°ã®æ¬äœã¯ãã®é¢æ°ã®éå§çŽåŸã«ãããšæ£ããä»®å®ããŸãã ã»ãšãã©ã®ã³ã³ãã€ã©ã¯ããã®ãåžžèçãªã³ã³ãã€ã«ãã«æºæ ããŠããŸããããã¹ãŠãããã«åŸããšã¯æ³å®ããŠããŸããã ãŸããå°ãªããšã倧ç©ïŒVC ++ãBorlandãªã©ïŒã¯ãŸã ãã®ã«ãŒã«ãé å®ããŠããŸãã ãããã£ãŠãæªç¥ãŸãã¯æ°ããã³ã³ãã€ã©ãŒã䜿çšããŠããªãå Žåããåžžèçãªã³ã³ãã€ã«ãã®æ¬ åŠãå¿é ããªãã§ãã ããã VC ++ã«é¢ãã1ã€ã®æ³šæïŒãããã°ã¢ãŒãã§äœæ¥ããŠããå Žåãã³ã³ãã€ã©ã¯ããã€ãã®ãã¢ããã¿ãŒããæ¿å ¥ããé¢æ°ãå¥ã®å Žæã«é 眮ããŸãã ãããŒãã€ã¯ããœããã ãã ããèšå®ã§ãã€ã³ã¯ãªã¡ã³ã¿ã«ã«ãªã³ã¯ããã©ã°ãèšå®ãããŠããããšã確èªããã ãã§ãã³ã³ãã€ã©ãé©åãªã³ãŒããçæããããã«åŒ·å¶ããŸãã ã³ã³ãã€ã©ã«ãã®ãããªãªãã·ã§ã³ããªãå ŽåãQMSã䜿çšã§ããªãããå¥ã®ã³ã³ãã€ã©ã䜿çšã§ããŸããïŒ
å¥ã®åé¡ã¯ãé¢æ°ã®é·ãã決å®ããããšã§ãã ããã«ã¯ãã·ã³ãã«ã§ä¿¡é Œã§ããããªãã¯ããããŸãã C ++ã§ã¯ãsizeofã¹ããŒãã¡ã³ãã¯ãé¢æ°èªäœã®ãµã€ãºã§ã¯ãªããé¢æ°ãã€ã³ã¿ãŒã®ãµã€ãºãè¿ããŸãã ãã ããååãšããŠãã³ã³ãã€ã©ã¯ãªããžã§ã¯ãããœãŒã¹ã³ãŒãã«è¡šç€ºãããé åºã«åŸã£ãŠããªããžã§ã¯ãã«ã¡ã¢ãªãå²ãåœãŠãŸãã ãã®ããã...é¢æ°ã®ãµã€ãºã¯ãé¢æ°ãžã®ãã€ã³ã¿ãŒãšããã«ç¶ãé¢æ°ãžã®ãã€ã³ã¿ãŒã®å·®ã§ãã ãšãŠãç°¡åã§ãïŒ ãã®ããªãã¯ãèŠããŠãããŠãã ãããæé©åã³ã³ãã€ã©ã¯ãããã®èŠåã«åŸããªãã®ã§ãããã¯ããªãã«ãšã£ãŠæçšã§ãããããã£ãŠãä»èª¬æããæ¹æ³ã¯æ©èœããŸããã QMSãæžããšãã³ã³ãã€ã©ã®æé©åãå¥åº·ã«æªãã®ã¯ãªãã§ããïŒïŒïŒïŒïŒ
ã³ã³ãã€ã©ãæé©åãããã1ã€ã®ããšã¯ãTHINKã䜿çšãããªãå€æ°ãåé€ããããšã§ãã ãªã¹ã2ã®äŸã«æ»ããšããããã¡ãŒã«äœããã®å€ãæžã蟌ãŸããŸãããããããã¯äœãèªã¿åãããŸããã ã»ãšãã©ã®ã³ã³ãã€ã©ã¯ãå¶åŸ¡ããããã¡ã«è»¢éãããšããäºå®ãèªèã§ããªããããã³ãŒãããããã¡ã«ã³ããŒããåœä»€ãåé€ããŸãã ããã§ãªãïŒ ããããå¶åŸ¡ãåæåãããŠããªããããã¡ã«è»¢éãããŠãã...ããŒã ã«ãªãçç±ã§ãã ã¯ã©ãã·ã¥ã ãã®ãããªåé¡ãçºçããå Žåã¯ããã°ããŒãã«æé©åãããã¯ã¹ã®ãã§ãã¯ãå€ããšãã¹ãŠãæ£åžžã«ãªããŸãã
ããã§ãããã°ã©ã ãæ©èœããªãå Žåã¯ãgiveããªãã§ãã ããã èããããçç±ã¯ãåé¢æ°ã®æåŸã«ã³ã³ãã€ã©ãŒãã¹ã¿ãã¯ãå¶åŸ¡ãããµãã«ãŒãã³åŒã³åºããæ¿å ¥ããããšã§ãã ãããMicrosoft VC ++ã®æ©èœã§ãã ãããã°ããããããžã§ã¯ãã«__chkespé¢æ°åŒã³åºããè¿œå ããŸãã ãã®é¢æ°ã®èª¬æãããããæ¢ããŠã¯ãããŸãããããã¥ã¡ã³ãã«ã¯ãããŸããïŒ ãã®åŒã³åºãã¯çžå¯Ÿçã§ããããããæé€ããæ¹æ³ã¯ãããŸããã ãã ããæçµãããžã§ã¯ãã§ã¯ãVC ++ã¯é¢æ°ãçµäºãããšãã«ã¹ã¿ãã¯ã®ç¶æ ããã§ãã¯ãããããããã°ã©ã ã¯æèšã®ããã«æ©èœããŸãã
8.ç¬èªã®ããã°ã©ã ã§ã®QMS
ã§ãããããããããçãããåŸ ã¡æãã§ããããšã®æãæ¥ãŸããã èšäºã§èª¬æãããŠãããã®é·ãéã®ãããã¹ãŠèšªããå Žåãç§ã¯ããªããæè¿ããŸãã ïŒé·ã®ææïŒ
ããŠãããªãã¯èªåã«ãã¹ã¿ãã¯ã§ã³ãŒãïŒé¢æ°ïŒãå®è¡ããããšã®å©ç¹ã¯äœã§ããïŒã ããã«å¿ããŠã矀è¡ã¯æ¬¡ã®ããã«èšããŸãïŒAhhhhhhhhhhhhhã
æå·åãããã³ãŒãã¯ãéã¢ã»ã³ãã«ã¯ã©ãã«ãŒã®ãå°»ã«éåžžã«å€§ããªç Žçã§ãã ãã¡ããããããã¬ãŒã䜿çšããŠã圌ã¯åœŒã®äººçãå°ã楜ã«ããŸãããããã§ãæå·åãããã³ãŒãã¯åœŒ/圌女ã®äººçãä¿¡ããããªãã»ã©é£ããããŸãã
ããšãã°ãXORæäœãã³ãŒãã®åè¡ã«é 次é©çšããåå©çšæã«ãœãŒã¹ã³ãŒãã埩å ããæãåçŽãªæå·åã¢ã«ãŽãªãºã ïŒ
次ã«ãDemoïŒïŒé¢æ°ã®å 容ãèªã¿åããæå·åããçµæããã¡ã€ã«ã«æžã蟌ãäŸã瀺ããŸãã
ãªã¹ã3. Demoé¢æ°ãæå·åããæ¹æ³
void _bild() { FILE *f; char buff[1000]; void (*_Demo) (int (*) (const char *,...)); void (*_Bild) (); _Demo=Demo; _Bild=_bild; int func_len = (unsigned int) _Bild (unsigned int) _Demo; f=fopen("Demo32.bin", "wb"); for (int a=0; a<func_len; a++) fputc(((int) buff[a]) ^ 0x77, f); fclose(f); }
æå·åã®çµæã¯æååå€æ°ã«é 眮ãããŸãã ããã§ãé¢æ°DemoïŒïŒããœãŒã¹ã³ãŒãããåé€ã§ããŸãã åŸã§å¿ èŠã«ãªã£ããã埩å·åããŠããŒã«ã«ãããã¡ã«ã³ããŒããå®è¡ã®ããã«åŒã³åºãããšãã§ããŸãã ãå°»ã蹎ããŸããïŒ
ãã®ã¢ã«ãŽãªãºã ã®å®è£ äŸã¯æ¬¡ã®ãšããã§ãã
ãªã¹ã4.æå·åãããããã°ã©ã
int main(int argc, char* argv[]) { char buff[1000]; int (*_printf) (const char *,...); void (*_Demo) (int (*) (const char *,...)); char code[]="x22xFCx9BxF4x9Bx67xB1x32x87 x3FxB1x32x86x12xB1x32x85x1BxB1 x32x84x1BxB1x32x83x18xB1x32x82 x5BxB1x32x81x57xB1x32x80x20xB1 x32x8Fx18xB1x32x8Ex05xB1x32x8D x1BxB1x32x8Cx13xB1x32x8Bx56xB1 x32x8Ax7DxB1x32x89x77xFAx32x87 x27x88x22x7FxF4xB3x73xFCx92x2A xB4"; _printf=printf; int code_size=strlen(&code[0]); strcpy(&buff[0], &code[0]); for (int a=0; a<code_size; a++) buff[a] = buff[a] ^ 0x77; _Demo = (void (*) (int (*) (const char *,...))) &buff[0]; _Demo(_printf); return 0; }
printfïŒïŒé¢æ°ãæšæ¶ã衚瀺ããããšã«æ³šæããŠãã ããã äžç®èŠãã ãã§äœãå€ãã£ãããšã¯ãããŸãããããHelloãOSIXïŒããšããè¡ãèŠããã¯ãã§ãã 圌女ã¯ã³ãŒãã»ã°ã¡ã³ãã«å ŽæããããŸããïŒããŒã©ã³ãã¯äœããã®çç±ã§ããã«è¡ãé 眮ããŸããïŒãããŒã¿ã»ã°ã¡ã³ãããã§ãã¯ããããšã§ããã®å Žæã«ããããšãããããŸãã
ããŠãããšãã¯ã©ãã«ãŒã圌ã®åã«ãœãŒã¹ã³ãŒããæã£ãŠãããšããŠãã圌ã®ããã«ç§ãã¡ã®ããã°ã©ã ã¯ãŸã å°çã®ããºã«ã®1ã€ã®ãŸãŸã§ãã ãã®æ¹æ³ã䜿çšããŠããç§å¯ã®ãæ å ±ïŒããã°ã©ã ã®ã·ãªã¢ã«çªå·ãšããŒãªã©ïŒãé ããŸãã
ãã®æ¹æ³ã䜿çšããŠã·ãªã¢ã«çªå·ã確èªããå Žåã¯ã解èªããå Žåã§ãã¯ã©ãã«ãŒã®ããºã«ãä¿æãããããã«æ€èšŒãæŽçããå¿ èŠããããŸãã 次ã®ãªã¹ãã§ãããè¡ãæ¹æ³ã瀺ããŸãã
QMSãå®è£ ãããšãã¯ãå€æŽãããã€ãã®æ£ç¢ºãªå Žæãç¥ãå¿ èŠãããããšã«æ³šæããŠãã ããã ãããã£ãŠãé«æ°Žæºèšèªã®ä»£ããã«ãã¢ã»ã³ãã©ãŒã䜿çšããå¿ èŠããããŸãã ãããç§ãšäžç·ã«ããŠãããçµããã ïŒ
äžèšã®ã¡ãœããã®å®è£ ã§ã¢ã»ã³ãã©ã䜿çšããå Žåã1ã€ã®åé¡ããããŸãã MOVåœä»€ã䜿çšããŠãã€ããå€æŽããã«ã¯ããã©ã¡ãŒã¿ãŒãšããŠABSOLUTEç·åœ¢ã¢ãã¬ã¹ïŒãããããã³ã³ãã€ã«åã¯äžæã ã£ããšæãããŸãïŒãæž¡ãå¿ èŠããããŸãã ããã...ããã°ã©ã ã®å®è¡äžã«ãã®æ å ±ãååŸã§ããŸãã CALL $ + 5 / POP REG / MOV [reg + relative_address]ãxx-ç§ã«éåžžã«äººæ°ã®ããã³ãŒãã 次ã®ããã«æ©èœããŸãã CALLåœä»€ãå®è¡ããçµæãã¢ãã¬ã¹ïŒãŸãã¯ãã®åœä»€ã®çµ¶å¯Ÿã¢ãã¬ã¹ïŒã¯ã¹ã¿ãã¯ã«æ®ããŸãã ãã®ã¢ãã¬ã¹ã¯ãã¹ã¿ãã¯æ©èœã³ãŒãã®ã¢ãã¬ã¹ã®ããŒã¹ã¢ãã¬ã¹ãšããŠäœ¿çšãããŸãã
ãããŠãããã¯ç§ãããªãã«çŽæããã·ãªã¢ã«çªå·ã®æ€èšŒã®äŸã§ã...
ãªã¹ã5.ã·ãªã¢ã«çªå·ã®çæãšã¹ã¿ãã¯ã®å®è¡
MyFunc: push esi ; ESI mov esi, [esp+8] ; ESI = &username[0] push ebx ; push ecx push edx xor eax, eax ; xor edx, edx RepeatString: ; Lodsb ; AL test al, al ; ? jz short Exit ; , 1 ; , , ; () , XOR mov ecx, 21h RepeatChar: xor edx, eax ; XOR ADC ror eax, 3 rol edx, 5 call $+5 ; EBX = EIP pop ebx ; / xor byte ptr [ebx0Dh], 26h; ; ; XOR ADC. loop RepeatChar jmp short RepeatString Exit: xchg eax, edx ; (.) EAX pop edx ; pop ecx pop ebx pop esi retn ;
ãã®ã³ãŒãã¯ãå¥åŠãªããã«èŠããŸããåãåŒæ°ãç¹°ãè¿ãæž¡ããšãåãçµæãŸãã¯ãŸã£ããç°ãªãçµæãåŸãããããã§ãã ãŠãŒã¶ãŒåã®é·ãã«äŸåããŸãã å¥æ°ã®å Žåãé¢æ°ãçµäºãããšãã®XORã¯ADCã«çœ®ãæããããŸãã ãã以å€ã®å Žåã¯ãäœãèµ·ãããŸããïŒ
ããŠãããã§ãã¹ãŠã§ãã ãã®èšäºãå°ãªããšãããªãã«ãšã£ãŠæçãªãã®ã§ãã£ãããšãé¡ã£ãŠããŸãã 圌女ã®çç»ã¯ç§ã«2æéããããŸããïŒ ãã£ãŒãããã¯ã¯ãã€ã§ãæè¿ããŸãã
è±èªãœãŒã¹ïŒ Giovanni Tropeanoã èªå·±ä¿®æ£ã³ãŒã// CodeBreakers Journalã å·» 1ãããã 2006幎2æã