Engenharia reversa de Javascript ofuscado de forma rápida e simples com a I.A ChatGPT
Introdução
Na minha publicação anterior eu comentei sobre a nova I.A disponibilizada ao público pela OpenIA, neste artigo eu quero mostrar como é possível a ChatGPT nos auxiliar em entender código que um humano experiente em programação poderia levar um tempo considerável para entender.
O que é engenharia reversa na programação?
Irei dar um breve resumo para que consigamos entender como a ChatGPT iria nos auxiliar no processo de engenharia reversa.
Engenharia reversa é uma técnica para entender o funcionamento de algum produto que não temos acesso diretamente a como ele foi feito, essa técnica é muito usada para crackear programas de computador.
Existem programas que conseguem pegar o código assembly de outros programas e através desse código assembly é possível tentar entender o que o programa está fazendo e assim burlar ele de diversas formas.
Para empresas como Google, Meta e etc, essa técnica não é interessante, por isso as empresas utilizam uma técnica em seus sites chamada "ofuscação de código", o objetivo dessa técnica é deixar o código javascript extremamente difícil de ser lido e entendido.
Para quem faz pentest ou bug bounty, essa técnica é muito importante para ajudar a entender como o site funciona e facilitar o descobrimento de falhas de segurança.
Utilizando a ferramenta
O uso é simples, no input do chat só precisamos colocar o código ofuscado que queremos entender, segue o exemplo:
Este será o código que irei ofuscar e colocar como input para a I.A:
function geoFindMe() {
const status = document.querySelector('#status');
const mapLink = document.querySelector('#map-link');
mapLink.href = '';
mapLink.textContent = '';
function success(position) {
const latitude = position.coords.latitude;
const longitude = position.coords.longitude;
status.textContent = '';
mapLink.href = `https://www.openstreetmap.org/#map=18/${latitude}/${longitude}`;
mapLink.textContent = `Latitude: ${latitude} °, Longitude: ${longitude} °`;
}
function error() {
status.textContent = 'Unable to retrieve your location';
}
if (!navigator.geolocation) {
status.textContent = 'Geolocation is not supported by your browser';
} else {
status.textContent = 'Locating…';
navigator.geolocation.getCurrentPosition(success, error);
}
}
document.querySelector('#find-me').addEventListener('click', geoFindMe);
Esse código foi retirado do MDN WEB DOCS. O objetivo do código é mostrar como é a utilização da API de geolocalização do navegador.
Input:
function _0x5f18(){const _0x5e2715=['549636IExKTM','getCurrentPosition','Latitude:\x20','413908sLgieA','coords','click','https://www.openstreetmap.org/#map=18/','233185CwXWqm','202680lGlgOv','#map-link','textContent','href','13725YaMvIH','Geolocation\x20is\x20not\x20supported\x20by\x20your\x20browser','longitude','119875cLCuxr','#find-me','16WdCziu','#status','Locating…','querySelector','\x20°,\x20Longitude:\x20','19AGxfmO','geolocation','11686xniRqG'];_0x5f18=function(){return _0x5e2715;};return _0x5f18();}const _0x72e2af=_0x5f47;(function(_0x3526ab,_0x41a115){const _0x329b28=_0x5f47,_0x189427=_0x3526ab();while(!![]){try{const _0x1f71cd=-parseInt(_0x329b28(0x9d))/0x1*(-parseInt(_0x329b28(0x9f))/0x2)+parseInt(_0x329b28(0x93))/0x3+parseInt(_0x329b28(0x8a))/0x4+parseInt(_0x329b28(0x8e))/0x5+-parseInt(_0x329b28(0xa0))/0x6+-parseInt(_0x329b28(0x96))/0x7+parseInt(_0x329b28(0x98))/0x8*(-parseInt(_0x329b28(0x8f))/0x9);if(_0x1f71cd===_0x41a115)break;else _0x189427['push'](_0x189427['shift']());}catch(_0x1b5fd0){_0x189427['push'](_0x189427['shift']());}}}(_0x5f18,0x1b53f));function _0x5f47(_0x4ed53f,_0x348946){const _0x5f1849=_0x5f18();return _0x5f47=function(_0x5f47af,_0x1e6b0c){_0x5f47af=_0x5f47af-0x89;let _0x2e631c=_0x5f1849[_0x5f47af];return _0x2e631c;},_0x5f47(_0x4ed53f,_0x348946);}function geoFindMe(){const _0x33c662=_0x5f47,_0x1c7204=document[_0x33c662(0x9b)](_0x33c662(0x99)),_0xee5972=document[_0x33c662(0x9b)](_0x33c662(0x90));_0xee5972[_0x33c662(0x92)]='',_0xee5972[_0x33c662(0x91)]='';function _0xfae8f4(_0x45014f){const _0x3dd6d9=_0x33c662,_0x6ee6fc=_0x45014f[_0x3dd6d9(0x8b)]['latitude'],_0x37fa4b=_0x45014f[_0x3dd6d9(0x8b)][_0x3dd6d9(0x95)];_0x1c7204['textContent']='',_0xee5972[_0x3dd6d9(0x92)]=_0x3dd6d9(0x8d)+_0x6ee6fc+'/'+_0x37fa4b,_0xee5972['textContent']=_0x3dd6d9(0x89)+_0x6ee6fc+_0x3dd6d9(0x9c)+_0x37fa4b+'\x20°';}function _0x1330ce(){const _0x18fbe7=_0x33c662;_0x1c7204[_0x18fbe7(0x91)]='Unable\x20to\x20retrieve\x20your\x20location';}!navigator[_0x33c662(0x9e)]?_0x1c7204[_0x33c662(0x91)]=_0x33c662(0x94):(_0x1c7204[_0x33c662(0x91)]=_0x33c662(0x9a),navigator['geolocation'][_0x33c662(0xa1)](_0xfae8f4,_0x1330ce));}document[_0x72e2af(0x9b)](_0x72e2af(0x97))['addEventListener'](_0x72e2af(0x8c),geoFindMe);
Output:
Tradução:
Este código é uma função JavaScript que utiliza o HTML5 Geolocation API para obter a latitude e longitude actuais do dispositivo do utilizador e depois mostra-o na página. Tem três partes principais:
A função geoFindMe é chamada quando o utilizador clica no botão "Find me". Primeiro limpa os elementos de latitude e longitude do texto na página e define o elemento de estado para "Localizar...".
O método navigator.geolocation.getCurrentPosition é utilizado para obter a posição actual do dispositivo do utilizador. Se tiver êxito, a função showPosition é chamada com o objecto de posição como argumento.
A função showPosition é chamada com o objecto de posição como um argumento. Extrai a latitude e longitude do objecto e utiliza-as para actualizar os elementos de texto de latitude e longitude na página. Também actualiza o elemento de estado para mostrar a latitude e a longitude actuais. Além disso, actualiza o atributo href da ligação "Abrir nos mapas" para incluir a latitude e longitude, para que o utilizador possa clicar na ligação para abrir a localização num mapa.
Traduzido com a versão gratuita do tradutor - www.DeepL.com/Translator
O ponto interessante a ser observado é que não dei o código html para a I.A e mesmo assim ela conseguiu ter uma ideia bem confiável do que aquele código fazia em segundos!!
Conclusão
Apesar de ajudar bastante e agilizar o entendimento do código, ela não é perfeita, como no próprio exemplo, ela acabou ficando confusa no nome da função por causa do ofuscamento. Mas sem dúvidas é uma ferramenta que vai ajudar não só na área da programação mas em todas as áreas de conhecimento possíveis.