Задать вопрос
akokarev
@akokarev
Начинающий программист

Как в JS объявить объект-функцию?

Пришел на почту обфусцированный js файл, по сути загрузчик вируса. Стало интересно что он делает, решил дебажитьи используя script.google.com, так безопаснее.
Вся работа в скрипте идет через объект ActiveX. Ясное дело в гугле нет такого объекта, но нам это наруку, объявим свой. Классы использовать не удалось, по-этому через функцию.
function cFields() {
  this.append = function(a,b,c){Logger.log('ActiveXObject ('+this.fileName+'.fields) append('+a+','+b+','+c+')');return 'fields.append'};
}

function ActiveXObject(file_name) {
  this.fileName = file_name;
  Logger.log('ActiveXObject ('+this.fileName+') NEW');
  this.Status = 200;
  this.fields = new cFields();
  
  this.open = function(a,b,c){Logger.log('ActiveXObject ('+this.fileName+') open: ('+a+','+b+','+c+')');return 'open'};
  this.send = function(a,b,c){Logger.log('ActiveXObject ('+this.fileName+') send()');return 'send'};
  this.GetSpecialFolder = function(a){Logger.log('ActiveXObject ('+this.fileName+') GetSpecialFolder('+a+')'); return 'SpecFolder'};
  this.GetTempName = function(a){Logger.log("ActiveXObject ("+this.fileName+") GetTempName()"); return 'TempName'};
  this.Open = function(){Logger.log('ActiveXObject ('+this.fileName+') Open()');return 'Open'};
  this.Write = function(a){Logger.log('ActiveXObject ('+this.fileName+') Write('+a+')');return 'Write'};
  this.Read = function(a){Logger.log('ActiveXObject ('+this.fileName+') Read('+a+')');return 'Read'};
  this.addNew = function(a){Logger.log('ActiveXObject ('+this.fileName+'.fields) addNew('+a+')');return 'fields.addNew'};
}

Таким нехитрым образом в логах вижу все что творит скрипт. На каком-то этапе скрипт останавливается:
TypeError: [object Object] является не функцией, а object.

uKi = new ActiveXObject('ADODB.Recordset')
St = 'appendChunk'
q = 'Read'
uKi(Z)[St](q);

Собственно вопрос, как в исходном объекте объявить метод, который будет вызываться при обращении к объекту подобно функции?

UPD:
По этой ссылке можете сами посмотреть полный скрипт.
https://script.google.com/d/1IrkYN_Sg0j_uiMD4fAmEP...
Для запуска выполните функцию doGet или пройдите по ссылке:
https://script.google.com/macros/s/AKfycbyiYp4kX07...
  • Вопрос задан
  • 262 просмотра
Подписаться 2 Средний Комментировать
Пригласить эксперта
Ответы на вопрос 3
dollar
@dollar
Делай добро и бросай его в воду.
Так и добавьте.
this.appendChunk = function(a){Logger.log('ActiveXObject ('+this.fileName+') appendChunk('+a+')');return 'appendChunk'};
Ответ написан
@StockholmSyndrome
например, так
function ActiveXObject() {
 // ...
  return Object.assign(() => {
    // ...
  }, this);
}
Ответ написан
Vlad_IT
@Vlad_IT Куратор тега JavaScript
Front-end разработчик
Собственно, функции и есть объекты.
function func() {
    alert("Hello world");
}

func.prop1 = "prop";
func.prop2 = "prop";

func(); // Hello world
console.warn(func.prop1); // prop
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы