четверг, 26 августа 2010 г.

Плагины к Hiew

 Итак, новости которые меня весьма поразили ;)
  1. Hiewplus, ссылка на hiewplus
  2. PyHiew, ссылка на pyhiew 
  Первый представляет собой приложение win32 и позволяет попытаться открыть процессы в стандартном Hiew-шном интерфейсе.
  Второй же служит для добавления возможности написания скриптов на Python и использовать их к открытому в Hiew файле.

среда, 18 августа 2010 г.

Реализация идиомы Pointer to Implementation с применением std::auto_ptr

Сегодня в очередной раз столкнулся с очень интересной ошибкой, которую уже видел этим летом и пока вспомнил в чем дело, и как ее победить в очередной раз сломал себе мозг. В следствии чего решил написать небольшую задачку, думаю изучающим C++ будет интересно знать некоторые нюансы языка.

Цель: Понять почему возникает ошибка компиляции и осознать метод ее решения.

Условия: имеется небольшой файл-хидер header1.hpp:

#include 

class CMain1 {
  class     CAddon;
  typedef   std::auto_ptr< CAddon >  AddonPtr_t;
public:
  CMain1();
private:
  AddonPtr_t m_Addon;
};
а также есть файл-реализации impl1.cpp:

#include "header1.h"

class CMain1::CAddon {
};

CMain1::CMain1()
: m_Addon(new CAddon) 
{}

Ответ (  http://www.base64.ru/ ):
----
 0JTQtdGB0YLRgNGD0LrRgtC+0YAg0LrQu9Cw0YHRgdCwIENNYWluMSDQstGL0LfRi9Cy0LDQtdGCINC00LXRgdGC0YDRg9C60YLQvtGAIHN0ZDo6YXV0b19wdHIsINC90L4g0L/RgNC4INGN0YLQvtC8IH5DTWFpbigpINC/0L7QvdGP0YLQuNGPINC90LUg0LjQvNC10LXRgiDQviDRgtC+0Lwg0LrQsNC6INGD0YHRgtGA0L7QtdC9IENBZGRvbi4g0KfRgtC+INCx0Ysg0LjQt9Cx0LDQstC40YLRjNGB0Y8g0L7RgiDQvtGI0LjQsdC60Lgg0L3Rg9C20L3QviAg0L3QsNC/0LjRgdCw0YLRjCDRgNC10LDQu9C40LfQsNGG0LjRjiB+Q01haW4oKSDQsiDRgtC+0Lwg0LbQtSDRhNCw0LnQu9C1INCz0LTQtSDQuCDQtNC10LrQu9Cw0YDQsNGG0LjRjyBDQWRkb24=
----

пятница, 13 августа 2010 г.

Небезопасные типы в закрытых базовых классах

Наверняка многие сталкивались с готовым кодом, который менять нельзя, хоть ты тресни. А в нем используются небозопасные типы, к примеру метод класса принимает указатель на void, а по нему не зная типа или размера нельзя корректно освободить память!
Читая Джеффа Элджера увидел интересный прием:

class UnsafeNode {
public:
  UnsafeNode(UnsafeNode * next_, void * data_);
  virtual ~UnsafeNode();
  UnsafeNode * Next();
  void * Data();
private:
  UnsafeNode * m_Next;
  void       * m_Data;
};

template < typename T>
class SafeNode : private UnsafeNode {
public:
  SafeNode(SafeNode * next_, T * data_) : UnsafeNode(next_, data_) {}
  virtual ~SafeNode() { delete( (T*)Data() ); }
  SafeNode * Next()   { return( (SafeNode*)UnsafeNode::Next() ); }
  T *  Data()         { return( (T *)UnsafeNode::Data()); } 
};

1) Потомки не видят безобразия в базовом классе, т.к. применяется закрытое наследование
2) Можно применить любой тип, т.к. шаблон
3) Коректно удалится в деструкторе, т.к. задана привязка к типу

Некомпилируется код применением указателя:

Имеется код, приведенный ниже. Почему в случае №1 компилятор не может скомпилировать код, а в случае №2 пусть и громоздко, но все отлично компилируется?


class CUnk {
public:
  void SuperMethod() { std::cout << "CUnk::SuperMethod()" << std::endl; }
};

class CUnkPointer {
public:
  CUnkPointer() : m_UnkPtr(0) {}
  CUnkPointer(CUnk * UnkPtr) : m_UnkPtr(UnkPtr) {}
  ~CUnkPointer()     { if(m_UnkPtr) delete(m_UnkPtr); m_UnkPtr=0;  }
  operator CUnk *()  { return(m_UnkPtr); }
private:
  CUnk * m_UnkPtr;
};

  CUnkPointer UnkPtr( new CUnk);
  UnkPtr->SuperMethod();            // (Случай №1)
  ((CUnk*)UnkPtr)->SuperMethod();   // (Случай №2)

Ответ( http://www.base64.ru/ ):

----
0J/QvtGC0L7QvNGDINGH0YLQviDQsiDRgdC70YPRh9Cw0LUg4oSWMiDRgdGD0YnQtdGB0YLQstGD0LXRgiDQvtC/0LXRgNCw0YLQvtGAINC/0YDQtdC+0LHRgNCw0LfQvtCy0LDQvdC40Y8sINCwINCyINGB0LvRg9GH0LDQtSDihJYxINC90LXRgiDQv9C10YDQtdCz0YDRg9C30LrQuCDQvtC/0LXRgNCw0YLQvtGA0LAgIi0+Ig==
----

четверг, 12 августа 2010 г.

Перевод "%UPX_SOURCE%\upx-3.05-src\doc\filter.txt"

Этот документ поясняет концепцию "фильтрация" в UPX. В основном фильтрация это метод препроцессинга данных, который может улучшить коэффициент сжатия файлов UPX-ом.

среда, 11 августа 2010 г.

понедельник, 9 августа 2010 г.

Моя первая статья

На прошлой неделе вышла моя статья с названием "Некоторые приёмы статического анализа кода из арсенала вирусного аналитика" в журнале "No bunkum". Статья посвящена некоторым полезным приемам использования реверс-тулзы Hiew, которые помогают повысить эффективность и качество работы при анализе исполнимых файлов.
Прошу не судить строго и учесть, что это мой первый опыт написания чего-либо на паблику. Хотя нет, вру,  второй ))) Но между первым и вторым был слишком большой промежуток и можно считать эту статью условно первым моим опытом )

Статью можно  найти тут .

P.S.:
Для справки, первой была статья "Алгоритм шифрования ГОСТ 28147-89. Метод простой замены."  на  wasm.ru , по этой ссылке можно перейти к статье

Операторы преобразования

Сегодня после прочтения подраздела "Операторы преобразования" на стр. 48 книги Джеффа Элджера "Библиотека программиста. C++" пришел к тому, что тот велосипед, что я сконструировал для работы с параметрами можно упростить, вот его текущий код:


  class CParameter {
  public:
    CParameter() : m_Exist(false) { }
    CParameter(std::string & val, bool exist)
      : m_Exist(exist), m_Value(val) {};

    bool        Exist()   { return( m_Exist );                            }
    int         AsInt()   { return( atoi(str::Trim(m_Value).c_str()) );   }
    double      AsFloat() { return( atof(str::Trim(m_Value).c_str()) );   }
    std::string AsString(){ return( m_Value.c_str() );                    }

    bool        AsBool()  {
      std::string s(str::Trim(m_Value));
      if(s.empty())
        return(false);

      std::transform(s.begin(),s.end(),s.begin(),tolower);
      return(1 == strcmp( s.c_str(), "true"));
    }
  private:
    std::string m_Value;
    bool        m_Exist;
  };


его текущее использование выглядит таким:

std::string driver = m_Ini["driver"]["filepath"].AsString();

что является не совсем наглядным. После прочтения этого подраздела, пришел к выводу, что куда удобней будет перегрузить:
  • operator std::string()
  • opertator int() 
  • operator double()
  • operator bool()
Тогда работа с параметрами будет уже более наглядной:

 std::string driver ( m_Ini["driver"]["filepath"] );

т.е. компилятор зная тип, куда присваивается сам определяет нужную версию функции возврата и тем самым избавляет меня от необходимости писать эти громоздкие AsString() , AsInt() , etc

воскресенье, 8 августа 2010 г.

Забывая о методах класса создаваемых по умолчанию

Весьма забавный феномен, если не знать тонкости ;)

class CStr {
public:
  CStr(char * str) {
    if(!str) {
      m_Ch  = new char[1];
      *m_Ch = 0x0;
    }
    else {
      m_Ch = new char[strlen(str)+1];
      strcpy(m_Ch,str);
    }
  }
  ~CStr() { delete(m_Ch); }
  void dump(std::ostream & strm) {
    strm << "\"" << m_Ch << "\"\n";
  }
private:
  char * m_Ch;
};

CStr * s1 = new CStr("First String !!!");
CStr * s2 = new CStr("Second String !!!");

s1->dump(std::cout);
s2->dump(std::cout);

s2 = s1;

s1->dump(std::cout);
s2->dump(std::cout);

delete(s1);

s2->dump(std::cout);
delete(s2);

Думаю этот пример убедил, что нужно быть внимательней при разработке класса ;)