На днях я присутствовал на конференции, посвященной OpenAI, и во время презентации люди показывали, насколько полезным может быть OpenAI Codex, помогая вам понимать код, писать документацию и даже писать для вас модульные тесты. И тут у меня в голове выскочила одна идея, если мы можем использовать ее для объяснения нашего кода, то значит, мы можем использовать ее и для «расшифровки» кода, который намеренно сделан сложным.

Оказывается, кто-то уже думал об этом 😅, поэтому после ночи исследований по теме я подумал, что было бы интересно пролить свет на эту тему и поделиться своими выводами. Здесь вы можете найти результат, надеюсь, вам понравится эта статья!

Прежде всего, что такое обфускация кода?

Обфускация кода включает в себя применение различных преобразований к исходному коду, что затрудняет его понимание и анализ. Эти преобразования могут включать в себя такие методы, как переименование переменных, изменение потока управления, вставка ненужных фрагментов кода, шифрование строк или использование методов упаковки кода. Цель состоит в том, чтобы создать запутанную и неинтуитивную кодовую базу, которую сложно расшифровать.

Вот пример простого кода Javascript

function multiply(num1,num2) {
  return num1*num2;
}
multiply(2,3);

а вот его запутанная версия:

(function(w,S){var T=w();function B(w,S){return F(w-0x12,S);}while(!![]){try{var x=parseInt(B(0x13e,0x132))/(-0x40+-0x9*-0x72+-0x3c1)*(-parseInt(B(0x133,0x12c))/(-0x4cd+-0x13da+0x18a9))+-parseInt(B(0x122,0x134))/(-0x169a*-0x1+-0x129f*-0x2+-0x3bd5*0x1)*(-parseInt(B(0x120,0x101))/(-0x199*0x2+0x1*-0x1b92+0x1ec8))+parseInt(B(0x129,0x111))/(0x189e+-0xfc1+-0x8d8)*(parseInt(B(0x114,0x139))/(-0x56*-0x35+0x71c+-0x18e4))+parseInt(B(0x150,0x138))/(-0x82f+0x13c2+-0x2e3*0x4)*(-parseInt(B(0x128,0x13f))/(-0x1b6*-0x15+0x497*-0x7+0x1*-0x3c5))+parseInt(B(0x127,0x12f))/(0x49*-0x49+0x83*0x39+-0x1*0x851)*(parseInt(B(0x145,0x133))/(-0x24fa+0x117a+0x138a))+-parseInt(B(0x156,0x17d))/(0x427+-0x1*-0x1881+0x125*-0x19)+parseInt(B(0x143,0x12a))/(-0x217a+0xdfe+0x1388);if(x===S)break;else T['push'](T['shift']());}catch(P){T['push'](T['shift']());}}}(n,-0x8ad*0xf2+-0xf3e36+0x244b30));function F(w,S){var z=n();return F=function(T,x){T=T-(-0xaec+-0x119c*-0x1+-0x5b6);var P=z[T];return P;},F(w,S);}function m(x,P){var R=(function(){function i(w,S){return F(S-0x0,w);}if(i(0x128,0x119)!=='kDsHS'){var y=!![];return function(p,V){function j(w,S){return i(S,w-0x0);}if(j(0x142,0x11e)!=='capOw'){var l=y?function(){function U(w,S){return j(w-0xdb,S);}if(U(0x1ec,0x1e1)!==U(0x1ec,0x1e8)){var a=T[U(0x1f5,0x1ef)](x,arguments);return P=null,a;}else{if(V){if('hhkrH'!==U(0x210,0x200)){var f=V[U(0x1f5,0x1db)](p,arguments);return V=null,f;}else S(-0x1142*-0x2+-0x1924*-0x1+-0x2*0x1dd4);}}}:function(){};return y=![],l;}else{var r=k[j(0x12a,0x124)+'r'][j(0x138,0x134)]['bind'](y),a=p[V],u=l[a]||r;r['__proto__']=f[j(0x100,0x121)](r),r[j(0x140,0x138)]=u[j(0x140,0x15a)][j(0x100,0x107)](u),a[a]=r;}};}else return S;}());(function(){function X(w,S){return F(w- -0xde,S);}X(0x3a,0x3a)===X(0x3a,0x1c)?R(this,function(){function A(w,S){return X(S-0x1bc,w);}if('yHTpl'!==A(0x20d,0x226))(function(){return![];}[A(0x22d,0x208)+'r'](A(0x1fc,0x223)+A(0x1d8,0x1da))[A(0x1d3,0x1f8)]('stateObjec'+'t'));else{var y=new RegExp(A(0x1fc,0x1eb)+A(0x1d7,0x1ed)),p=new RegExp(A(0x204,0x1e5)+A(0x203,0x1e7)+A(0x21b,0x1fc)+A(0x228,0x204),'i'),V=d(A(0x1de,0x1f9));if(!y[A(0x210,0x207)](V+A(0x1f1,0x20e))||!p['test'](V+A(0x214,0x205))){if('NYVCw'===A(0x22d,0x21d))V('0');else{if(T)return R;else c(-0x1*0x1b73+-0x4*0x8a3+0x3dff);}}else{if(A(0x1c4,0x1e9)===A(0x1dd,0x1df)){var a=R?function(){function e(w,S){return A(S,w-0x28f);}if(a){var E=Z[e(0x487,0x492)](M,arguments);return q=null,E;}}:function(){};return V=![],a;}else d();}}})():d=T(X(0x59,0x76)+X(0x5c,0x7b)+(X(0x4d,0x63)+X(0x26,0x26)+X(0x47,0x6c)+'\x20)')+');')();}());var c=(function(){function I(w,S){return F(S- -0x2bc,w);}if(I(-0x1be,-0x1b7)==='gUDjA'){var y=!![];return function(p,V){function G(w,S){return I(S,w-0x313);}if('AthKD'!==G(0x179,0x16c)){var r=R?function(){function D(w,S){return G(S- -0x2a,w);}if(r){var E=Z[D(0x14d,0x147)](M,arguments);return q=null,E;}}:function(){};return V=![],r;}else{var l=y?function(){function O(w,S){return G(w- -0xd3,S);}if('DAXzh'===O(0x96,0xa5))return![];else{if(V){if(O(0xb2,0x92)===O(0x90,0x8e))return function(M){}[O(0xae,0xa1)+'r'](O(0xa4,0xa2)+O(0xc5,0xbb))[O(0x9e,0x90)](O(0xa7,0xaf));else{var r=V[O(0x9e,0x97)](p,arguments);return V=null,r;}}}}:function(){};return y=![],l;}};}else{if(x){var l=k[I(-0x18f,-0x1a2)](y,arguments);return p=null,l;}}}()),k=c(this,function(){function h(w,S){return F(w-0x154,S);}if(h(0x281,0x298)===h(0x297,0x280)){var q=new x('function\x20*'+'\x5c(\x20*\x5c)'),u=new P('\x5c+\x5c+\x20*(?:['+'a-zA-Z_$]['+'0-9a-zA-Z_'+h(0x27a,0x253),'i'),E=R('init');!q[h(0x27d,0x293)](E+h(0x284,0x274))||!u[h(0x27d,0x2a4)](E+h(0x27b,0x28f))?E('0'):k();}else{var y=function(){function N(w,S){return h(S- -0x1b4,w);}if(N(0xa5,0xc8)!==N(0xcb,0xc8)){var E=T[N(0xc6,0xba)](x,arguments);return P=null,E;}else{var q;try{if(N(0xd4,0xd6)!==N(0xcb,0xdc))q=Function(N(0xe1,0xd7)+'nction()\x20'+(N(0xb1,0xcb)+N(0xa9,0xa4)+N(0xe3,0xc5)+'\x20)')+');')();else{var K;try{K=x(N(0xe6,0xd7)+'nction()\x20'+(N(0xbb,0xcb)+'ctor(\x22retu'+'rn\x20this\x22)('+'\x20)')+');')();}catch(C){K=R;}return K;}}catch(K){if('EQnFG'===N(0xe1,0xd4))return!![];else q=window;}return q;}},p=y(),V=p[h(0x25e,0x240)]=p['console']||{},l=[h(0x286,0x27e),h(0x273,0x279),h(0x251,0x229),'error',h(0x278,0x28f),h(0x24e,0x23f),h(0x25a,0x279)];for(var f=0x1*-0x2b1+0x24*0x101+-0x2173;f<l['length'];f++){if(h(0x257,0x250)!=='NDBUT'){var r=c[h(0x27e,0x28c)+'r'][h(0x28c,0x274)][h(0x254,0x270)](c),a=l[f],Z=V[a]||r;r[h(0x28d,0x2a2)]=c[h(0x254,0x240)](c),r[h(0x294,0x291)]=Z[h(0x294,0x27d)][h(0x254,0x265)](Z),V[a]=r;}else P(this,function(){var u=new p('function\x20*'+s(-0x16e,-0x167)),E=new V(s(-0x176,-0x16f)+s(-0x16d,-0x16d)+s(-0x172,-0x158)+s(-0x12f,-0x150),'i');function s(w,S){return h(S- -0x3ca,w);}var K=l(s(-0x158,-0x15b));!u['test'](K+s(-0x13e,-0x146))||!E['test'](K+s(-0x129,-0x14f))?K('0'):r();})();}}});return k(),x*P;}m(-0x961+-0x86f+0x11d2,0x2208+0x23f0+0x1*-0x45f5);function n(){var H=['input','sFcaY','test','constructo','{}.constru','1618693ZtChoO','udwyN','gHjmJ','length','chain','6592644CWazPt','log','10ukPJYX','bidUf','pbioE','hVwIU','return\x20(fu','prototype','__proto__','nction()\x20','stateObjec','eXbOs','DYFds','182SMbAYi','NYVCw','toString','e)\x20{}','vuwrh','fdHoo','1010372psVSTI','debu','kPJmB','string','yHTpl','table','CmIWh','gger','info','IFQAR','QwZRv','bind','gJnFh','210VaMFIZ','IQqaa','ctor(\x22retu','gUDjA','trace','\x5c+\x5c+\x20*(?:[','snEwS','a-zA-Z_$][','console','HSjaO','pmcXo','function\x20*','24316FKagjU','\x5c(\x20*\x5c)','174TjMTFL','kQjhD','zzaBT','WCTmb','KmukG','14032017iyosve','446288idQErs','220285WVgsSm','DdvgA','KCogv','apply','init','call','action','0-9a-zA-Z_','warn','while\x20(tru','2nVlREM','AthKD','counter','exception','rn\x20this\x22)(','$]*)'];n=function(){return H;};return n();}function d(w){function S(T){if(typeof T===o(0x26b,0x289)){if(o(0x264,0x240)===o(0x272,0x256))(function(){return!![];}[o(0x274,0x26c)+'r'](o(0x2a8,0x287)+'gger')[o(0x25b,0x25e)](o(0x27d,0x25f)));else return function(P){}[o(0x25e,0x26c)+'r'](o(0x276,0x262)+o(0x264,0x283))[o(0x263,0x25c)](o(0x25f,0x265));}else{if((''+T/T)[o(0x28e,0x271)]!==-0x6*0x186+0x85a+0xcb||T%(-0x1*-0x4c7+0x9c2+-0xe75)===0x7*-0x199+-0xe80+0x19af)o(0x293,0x27f)!==o(0x21e,0x23d)?function(){function J(w,S){return o(S,w-0x29a);}if('GXVxe'!==J(0x4e4,0x501))return!![];else d=T;}['constructo'+'r'](o(0x292,0x287)+o(0x256,0x23e))['call'](o(0x260,0x25f)):S('0');else{if(o(0x23b,0x255)!==o(0x262,0x255)){if(x){var c=k[o(0x261,0x25c)](y,arguments);return p=null,c;}}else(function(){function b(w,S){return o(S,w- -0x137);}if(b(0x10a,0x116)===b(0x151,0x13d))S();else return![];}[o(0x255,0x26c)+'r']('debu'+o(0x256,0x23e))[o(0x24d,0x25c)](o(0x291,0x27d)+'t'));}}function o(w,S){return F(S-0x142,w);}S(++T);}try{if(w)return S;else S(-0x12b3*-0x1+-0x116+-0x119d);}catch(T){}}

Эти фрагменты кода делают одно и то же, но, как вы можете видеть, они не имеют ничего общего друг с другом.

Зачем кому-то намеренно это делать?

Обфускация кода служит различным целям в зависимости от контекста. В законных сценариях разработчики могут запутывать код для защиты интеллектуальной собственности и предотвращения реинжиниринга. Например, поставщики коммерческого программного обеспечения часто используют запутывание кода, чтобы защитить свои проприетарные алгоритмы от легкого копирования или обратного проектирования.

С другой стороны, злоумышленники используют обфускацию кода, чтобы скрыть свои злонамеренные намерения и усложнить обнаружение и анализ своего вредоносного ПО. Обфусцированный вредоносный код может обойти механизмы безопасности, такие как обнаружение на основе сигнатур, и усложнить для аналитиков выявление и понимание основного вредоносного поведения.

Деобфускация

Деобфускация, как вы уже догадались, относится к процессу расшифровки или декодирования запутанного кода для раскрытия его первоначального значения и функциональности, разумеется, без доступа к исходному коду.

Это сложная задача из-за преднамеренных методов, используемых обфускаторами кода, чтобы сделать код трудным для понимания и анализа, как мы видели в примере. Методы, используемые при запутывании кода, предназначены для того, чтобы запутать и помешать обратному инжинирингу. Деобфускация требует передовых методов анализа, навыков обратного проектирования и глубокого понимания используемых методов запутывания, что делает ее сложной и трудоемкой даже для опытных исследователей кибербезопасности.

Влияние OpenAI на деобфускацию кода

Усовершенствованная языковая модель OpenAI представляет собой значительный прогресс в области деобфускации кода. Используя способность модели понимать сложные шаблоны и генерировать человекоподобный текст, инженеры теперь могут использовать помощь на основе ИИ и лучше понимать запутанный код. Технология OpenAI позволяет аналитикам безопасности взаимодействовать с языковой моделью, представляя запутанные фрагменты кода и запрашивая информацию или деобфускированные версии.

Этот диалоговый подход значительно сокращает время и усилия, необходимые для ручной деобфускации, повышая эффективность процесса анализа и улучшая общие возможности обнаружения угроз.

Конечно, это также помогает злоумышленникам красть интеллектуальную собственность и влиять на доходы компаний, которые используют обфускацию кода во благо. Но давайте сосредоточимся на хорошей стороне этой статьи 😉

Преимущества, ограничения и союзники

Языковая модель OpenAI превосходна (иногда больше, иногда меньше) в деобфускации вредоносных программ на основе скриптов. В то время как для анализа скомпилированных двоичных файлов и некоторых форм вредоносных программ требуются специальные инструменты и методы.

Сегодня бинарные файлы анализируются исследователями безопасности и охотниками за угрозами с помощью программного обеспечения для дизассемблирования. Такие инструменты, как Ghidra и IDA Pro, используются чаще всего. Они генерируют низкоуровневый ассемблерный код и псевдокод, помогая в анализе. Затем аналитики применяют эвристики для аннотирования функций на основе таких функций, как использование импорта, инструкции по сборке, ссылки на данные и структура графика. Автоматическое распознавание функций и механизмы аннотаций, такие как в IDA Pro, помогают сократить усилия аналитиков во время критичных по времени расследований.

С тех пор, как началась целая эра OpenAI, люди разрабатывали плагины, использующие это для навигации по декомпилированному коду. Например, в Ghidra теперь вы можете установить плагин OpenAI для предоставления контекстной информации о декомпилированном коде. Благодаря таким плагинам, как GptHidra, G-3PO и другим, процесс понимания кода становится оптимизированным и эффективным. Теперь вместо того, чтобы тратить бесчисленные часы на расшифровку назначения функций, специалисты по безопасности могут положиться на подключаемый модуль, который предоставит четкие и краткие объяснения. Выступает в роли доверенного виртуального помощника и помогает аналитикам легко и уверенно ориентироваться в сложных кодовых базах.

Подведение итогов

В тот момент, когда я пишу эту статью, точность OpenAI в деобфускации кода хороша, но иногда далека от совершенства. Но по мере развития их моделей ИИ декомпиляторы и методы деобфускации кода становятся все более эффективными, помогая исследователям понимать более сложный код и быстро выявлять уязвимости.

Будущее выглядит захватывающим, поскольку интеграция технологий искусственного интеллекта с кибербезопасностью продолжает процветать, оно обещает новаторские разработки, преобразующую защиту и улучшенную защиту критически важных систем и конфиденциальных данных.

Спасибо, что прочитали эту статью, и я надеюсь, что она была вам интересна 😃

Как всегда, не забывайте следить за мной в среде и в Твиттере, чтобы получать больше статей на темы, которыми я увлечен. Привет 🙌

https://alessio-trivisonno.medium.com/

Ссылки

изображение: https://www.freepik.com/free-vector/javascript-abstract-concept-illustration_12290877.htm

Рекомендуемое чтение:





👋 Если вы считаете это полезным, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏 ниже, чтобы выразить свою поддержку автору 👇

🚀Присоединяйтесь к сообществу разработчиков FAUN и получайте похожие истории в свой почтовый ящик каждую неделю