مبهم سازی کد به منظور جلوگیری از اجرای نمادین

نویسندگان

دانشگاه علم و صنعت ایران

چکیده

امروزه حفاظت از نرم‌افزار در مقابل تحلیل‌گران به یکی از مسائل مهم عرصه رایانه تبدیل شده است. در این میان، روش اجرای نمادین به‌عنوان رویکردی برای کشف مسیرهای اجرایی و شروط وقوع برنامه، اخیراً مورد توجه قرار گرفته است. لذا، برنامه‌نویسان جهت محافظت از برنامه خود، مقابله با روش‏های تحلیل کد را نیز در نظر می‌گیرند. یک اجرای نمادین موفق، کلیه مسیرهای اجرایی برنامه به همراه شروط وقوع آن‌ها را در قالب یک درخت نمادین استخراج می‌کند. بنابراین، با جلوگیری از اجرای نمادین کد، می‏توان از یک برنامه حفاظت نمود و مسیرهای اجرایی آن را از دید تحلیل‌گران پنهان نگه داشت. در این میان، برخی روش‌ها با تکیه بر چالش‌های مختلف موجود در اجرای نمادین سعی بر پنهان‌سازی رفتار کد در مقابل اجرای نمادین دارند. در این مقاله، روشی جهت مبهم‌سازی شرط وقوع رفتارها در کد برنامه ارائه داده شده است تا درصورت تحلیل نمادین کد، کاربران از شروط واقعی یک رخداد مطلع نگردند. برای این منظور، یک راه‌کار نوین با اعمال معادلات خطی ارائه داده شده است. در این روش با جایگذاری برخی شروط غیرواقعی و جدید در مسیر برنامه و مرتبط‌نمودن متغیرهای آن با متغیرهای اصلی برنامه، حل‌کننده را دچار اشتباه می‏نماید. این امر موجب ایجاد شاخه-های متعدد و غیرواقعی در درخت نمادین برنامه می‏گردد. لذا، تحلیل کد را دچار پیچیدگی می‏کند. ارزیابی‌ها نشان می‌دهد که این مبهم‌سازی، ابزار اجرای نمادین کد را در تولید همه مسیرهای اجرایی برنامه با شکست مواجه می‏کند.

کلیدواژه‌ها


J. C. King and T. J. N. Yorktown Heights, “Symbolic execution and program testing,” Communications of the ACM, vol. 19, pp. 385-394, 1976.
D. Brumley, C. Hartwig, Z. Liang, J. Newsome, J. Poosankam, D. Song, and H. Yin, “Automatically identifying trigger-based behavior in malware,” in Botnet Analysis in Defense, p. 36, 2007.
M. Sharif, A. Lanzi, J. Giffin, and W. Lee, “Impeding malware analysis using conditional code onfuscation,” in Annual Network and Distributed System Security Symposium, 2008.
J. Lagarias, “The 3x+1 problem and its generations,” Amer. Math. Monthly, vol. 92, pp. 3–23, 1985.
E. Schwartz, T. Avgerinos, and D. Brumley, “All you ever wanted to know about dynamic taint analysis and forward symbolic execution,” in IEEE Symposium on Security and Privacy, 2010.
R. Crandall, “On the 3x + 1 problem,” Mathematics of Computation, vol. 32, pp. 1281–1292, 1978.
D. Brumley, J. Newsome, D. Song, H. Wang, and S. Jha, “Towards automatic generation of vulnerability-based signatures,” in IEEE Symposimu on Security and Privacy, 2006.
The R&D lab team, “Fuzzgrind an automatic fuzzing tool Fuzzgrind,” [Online]. Available: http://esec-lab.sogeti.com/pages/fuzzgrind.html. Last seen 3/1/2018.
C. Cadar, D. Dunbar, and D. R. Engler, “Klee: unassisted and automatic generation of high-coverage tests for complex systems programs,” in Proceedings of the USENIX Symposium on Operating System Design and Implementation, 2008.
C. Cadar, V. Ganesh, P. Pawlowski, D. Dill, and D. Engler, “EXE: a system for automatically generating inputs of death using symbolic execution,” in Proceedings of the ACM Conference on Computer and Communications Security, 2006.
P. Godefroid, N. Klarlund and K. Sen, “DART: directed automated random testing,” in Proceedings of the ACM SIGPLAN Conference on Programming Language Design and Implementation, 2005.
K. Sen, D. Marinov and G. Agha, “CUTE: a concolic unit testing engine for C,” in ESEC, and 13th ACM SIGSOFT Symposium on the Foundations of Software Engineering, FSE-13, pp. 263–272, 2005.
T. Chen, X.-s. Zhang, S.-z. Guo, H.-y. Li, and Y. Wu, “State of the art: Dynamic symbolic execution for automated test generation,” Future Generation Computer Systems, vol. 29, no. 7, pp. 1758-1773, 2013.
A. G. M. Bernard Botella, “Symbolic execution of floating-point computations,” Software Testing, Verification & Reliability, vol. 16, no. 2, pp. 97 - 121, June 2006.
C. Collberg, C. Thomborson, and D. Low, “A taxonomy of obfuscating transformations,” Technical Report 148, Dept. of Computer Science, The Univ. of Auckland, 1997.
C. Collberg, C. Thomborson, and D. Low, “Manufacturing cheap, resilient, and stealthy opaque constructs,” in Proceedings of the 25th ACM SIGPLAN-SIGACT Symposium on Principles of programming languages (POPL ’98), 1998.
C. Wang, J. Hill, J. Knight, and J. Davidson, “Software tamper resistance: obstructing static analysis of programs,” Technical report CS-2000-12, Department of Computer Science, University of Virginia, 2000.
J. Marciniak, “Encyclopedia of software engineering,” J. Wiley & Sons, 1994.
M. H. Halstead, “Elements of software science,” Elsevier North-Holland, 1977.
W. A. Harrison and K. I. Magel, “A complexity measure based on nesting level,” SIGPLAN Notices, vol. 16, pp. 63–74, 1981.
E. I. Oviedo, “Control flow, data flow and programmers complexity,” in Proc. of COMPSAC 80, 1980.
H. Lai, “A comparative survey of Java obfuscators,” in Computer Science Department, The University of Auckland, 2001.
H. Lin, X. Zhang, M. Yong, and B. Wang, “Branch Obfuscation Using Binary Code Side Effects,” Advances in Intelligent Systems Research, 2013.
Y. Yubo, Y. Yixian, F. Wenqing, H. Wei, and L. Zhongxian, “Dynamic Obfuscation Algorithm based on Demand-Driven Symbolic Execution,” Journal of Multimedia, vol. 9, no. 6, 2014.
M. D. Preda, “Code Obfuscation and Malware Detection by Abstract Interpretation,” Verona: Universit`a di Verona, 2005.
J. M. C. J. D. G. Zhi Wang, “Linear Obfuscation to Combat Symbolic Execution,” Computer Security – ESORICS, vol. 6879, pp. 210-226, 2011.
R. Guy, “Unsolved problems in number theory,” in Problem Books in Mathematics, 2004.
M. Alaeiyan, “Code obfuscation by abstract interpretation,” Iran university of sience and technology, tehran, 2015. (In persion)
P. Cousot and R. Cousot, “Abstract interpretation: A unified lattice model for static analysis of programs by construction or approximation of fixpoints,” in Proceedings of the 4th ACM Symp. on Principles of Programming Languages (POPL ’77), New York, 1977.
V. Chipounov, V. Kuznetsov, and G. Candea, “Systems, S2E: A Platform for In-Vivo Multi-Path Analysis of Software,” in ASPLOS XVI, New York, 2011.