SlideShare uma empresa Scribd logo
1 de 64
Bondartsov Artyom,
     Ciklum
Цели




  •Библиотеки detour и gmock
  •Есть проблемка с телепортацией... ©The Big Bang Theory
Detours




          Что такое Detours?
Detours




          Принцип работы
Detours        Принцип работы




          Caller function       Callee function




          Your function         Caller prolog*
Detours           Принцип работы




                  Caller function                          Callee function




                   Your function                           Caller prolog*




* - replaced by unconditional jump original instructions
Detours           Принцип работы




                  Caller function                          Callee function




                   Your function                           Caller prolog*




* - replaced by unconditional jump original instructions
Detours        Принцип работы




                                …
                                CalleeFunction:
                                 jmp YourFunction
    …
    CalleeFunction:             CalleeFunction+5:
     push ebp                    push edi
     mov ebp,esp                …
     push ebx                   Prolog:
     push esi                    push ebp
     push edi                    mov ebp,esp
    …                            push ebx
                                 push esi
                                 jmp CalleeFunction+5
Detours




          Обзор
Detours     Обзор




         Трамплины*:

                 •Статические
                 •Динамические




* - пролог
Detours   Обзор




          Статический
Detours               Обзор                 Статический пролог


  #include <windows.h>
  #include <detours.h>

  DETOUR_TRAMPOLINE(
    void WINAPI SleepTrampoline( DWORD ),
    Sleep
  );
  void WINAPI SleepDetour( DWORD dw )
  {
    return SleepTrampoline( dw );
  }
  void main( )
  {
    DetourFunctionWithTrampoline( ( PBYTE )SleepTrampoline, ( PBYTE )SleepDetour);
    Sleep( 0 );
    DetourRemove( ( PBYTE )SleepTrampoline, ( PBYTE )SleepDetour);
  }

* - обращайте внимание на соглашения о вызове
Detours    Обзор




          Динамический
Detours                Обзор                Динамический пролог


  #include <windows.h>
  #include <detours.h>

  typedef void (WINAPI *SleepType)( DWORD );
  static SleepType SleepTrampoline = 0;

  void WINAPI DynamicSleep( DWORD dw )
  {
    return SleepTrampoline( dw );
  }
  void main( )
  {
    SleepTrampoline = ( SleepType )DetourFunction( (PBYTE)Sleep, ( PBYTE )DynamicSleep );
    Sleep( 0 );
    DetourRemove( (PBYTE)SleepTrampoline, ( PBYTE )DynamicSleep );
  }


*-обращайте внимание на соглашения о вызове
Detours    Обзор




    Еще Detours “умеет внедрение”
Detours




          
Detours   




          9.999 / 64
Detours




              Демонстрация
          Запуск своего кода в контексте IDA Pro
Google mock




              Что такое Gmock?
Google mock




              •Mock класс
              •Ожидания
              •Действия
              •Совпадения
Google mock




              Mock класс
Google mock   Mock класс




     Объявляется:

               •MOCK_METHODn
               •MOCK_CONST_METHODn
               •MOCK_METHODn_T
               •MOCK_CONST_METHODn_T
Google mock   Mock класс




     Use cases:

               •Виртуальные методы
               •Невиртуальные методы
               •Свободные функции
               •Шаблоны классов
Google mock       Mock класс            Виртуальные методы


           struct Foo
           {
             virtual bool Transform( Gadget* g ) = 0;

            protected:
            virtual void Resume();

            private:
             virtual int GetTimeOut();
           };

           struct MockFoo : public Foo
           {
             MOCK_METHOD1( Transform, bool( Gadget* g ) );
             MOCK_METHOD0( Resume, void() );
             MOCK_METHOD0( GetTimeOut, int() );
           };

*- mock-методы в секции public
Google mock   Mock класс




     Use cases:

               •Виртуальные методы
               •Невиртуальные методы
               •Свободные функции
               •Шаблоны классов
Google mock       Mock класс      Невиртуальные методы




      struct ConcretePacketStream
      {
        void AppendPacket( Packet* packet );
        const Packet* GetPacket( size_t number) const;
        size_t NumberOfPackets() const;
      };

      struct MockPacketStream
      {
        MOCK_CONST_METHOD1( GetPacket, const Packet*( size_t number) );
        MOCK_CONST_METHOD0( NumberOfPackets, size_t() );
      };




*- AppendPacket отстутствует
Google mock   Mock класс




     Use cases:

               •Виртуальные методы
               •Невиртуальные методы
               •Свободные функции
               •Шаблоны классов
Google mock   Mock класс




     Use cases:

               •Виртуальные методы
               •Невиртуальные методы
               •Свободные функции
               •Шаблоны классов
Google mock        Mock класс           Шаблоны классов




       template < typename Elem >
       struct StackInterface
       {
         virtual ~StackInterface();

         virtual int GetSize() const = 0;
         virtual void Push( const Elem& x ) = 0;
       };

       template < typename Elem >
       struct MockStack : public StackInterface< Elem >
       {
         MOCK_CONST_METHOD0_T( GetSize, int() );
         MOCK_METHOD1_T( Push, void( const Elem& x ) );
       };


*- обратите внимание на _T
Google mock




              Ожидания
Google mock   Ожидания




      EXPECT_CALL( mock_object, method( matchers ) )
        .Times( cardinality )
        .WillOnce( action )
        .WillRepeatedly( action );
Google mock     Ожидания




           EXPECT_CALL( turtle, Forward( _ ) );

           EXPECT_CALL( turtle, Forward( 10 ) )
             .Times( 2 );




*- ожидания просматриваются в порядке обратном их объявлению
Google mock




              Действия
Google mock    Действия




              •Возвращают значение
              •Побочные эффекты
              •Функция как действие
              •Составное действие
              •ACTION макрос
Google mock     Действия    Возвращают значение



        struct MockFoo : public Foo
        {
          MOCK_METHOD0( GetBar, Bar&() );
          MOCK_METHOD1( Calculate, int( int ) );
        };
        ...
        MockFoo foo;
        Bar bar;
        EXPECT_CALL( foo, GetBar() )
            .WillOnce( ReturnRef( bar ) );
        EXPECT_CALL(foo, Calculate( 10 ) )
            .WillOnce( ReturnArg< 0 >( ) );
Google mock    Действия




              •Возвращают значение
              •Побочные эффекты
              •Функция как действие
              •Составное действие
              •ACTION макрос
Google mock    Действия    Побочные эффекты




   struct MockMutator : public Mutator
   {
     MOCK_METHOD2( Mutate, void( bool mutate, int* value ) );
   };
   ...
   MockMutator mutator;
   EXPECT_CALL( mutator, Mutate( true, _ ) )
       .WillOnce( SetArgPointee< 1 >( 5 ) );
Google mock    Действия




              •Возвращают значение
              •Побочные эффекты
              •Функция как действие
              •Составное действие
              •ACTION макрос
Google mock    Действия     Функция как действие



 struct MockFoo : public Foo
 {
   MOCK_METHOD1( ComplexJob, bool( int x ) );
 };
 struct Helper
 {
   bool ComplexJob( int x );
 };
 ...
 MockFoo foo;
 Helper helper;
 EXPECT_CALL( foo, ComplexJob( _ ) )
     .WillOnce( Invoke( &helper, &Helper::ComplexJob ) );
Google mock    Действия




              •Возвращают значение
              •Побочные эффекты
              •Функция как действие
              •Составное действие
              •ACTION макрос
Google mock    Действия    Составное действие




      struct MockMutator : public Mutator
      {
        MOCK_METHOD1( MutateInt, bool( int* value ) );
      };
      ...
      MockMutator mutator;
      EXPECT_CALL( mutator, MutateInt( _ ) )
          .WillOnce( DoAll( SetArgPointee< 0 >( 5 ),
                            Return( true ) ) );
Google mock    Действия




              •Возвращают значение
              •Побочные эффекты
              •Функция как действие
              •Составное действие
              •ACTION макрос
Google mock     Действия       ACTION макрос




          ACTION_P( Add, n ) { return arg0 + n; }

          EXPECT_CALL( foo, Calc( 10 ) )
            .WillOnce( ReturnAdd( 5 ) );
Google mock




              Совпадения
Google mock     Совпадения




              foo.DoThat( “Hello”, 5 );
Google mock   Совпадения




  EXPECT_CALL( foo, DoThat( "Hello", 5 ) );
Google mock   Совпадения




                    •Wildcards
                    •Простые сравнения
                    •Строковые совпадения
                    •Контейнерные совпадения
                    •Member совпадения
                    •Составные совпадения
                    •…
                    •MATCHER макрос
Google mock   Совпадения         Wildcards




              EXPECT_CALL( foo, DoThat( _, 5 ) );
Google mock   Совпадения




                    •Wildcards
                    •Простые сравнения
                    •Строковые совпадения
                    •Контейнерные совпадения
                    •Member совпадения
                    •Составные совпадения
                    •…
                    •MATCHER макрос
Google mock    Совпадения      Простые сравнения




       EXPECT_CALL( foo, DoThat( NotNull(), Ge( 5 ) ) );
Google mock   Совпадения




                    •Wildcards
                    •Простые сравнения
                    •Строковые совпадения
                    •Контейнерные совпадения
                    •Member совпадения
                    •Составные совпадения
                    •…
                    •MATCHER макрос
Google mock   Совпадения    Строковые совпадения




       EXPECT_CALL( foo, DoAlso( HasSubstring(“Hey”) ) );
Google mock   Совпадения




                    •Wildcards
                    •Простые сравнения
                    •Строковые совпадения
                    •Контейнерные совпадения
                    •Member совпадения
                    •Составные совпадения
                    •…
                    •MATCHER макрос
Google mock    Совпадения   Контейнерные совпадения




MOCK_METHOD1( Foo, void( const vector< int >& numbers ) );

EXPECT_CALL( mock, void( ElementsAre( 1, Gt( 0 ), _, 5 ) ) );
Google mock   Совпадения




                    •Wildcards
                    •Простые сравнения
                    •Строковые совпадения
                    •Контейнерные совпадения
                    •Member совпадения
                    •Составные совпадения
                    •…
                    •MATCHER макрос
Google mock    Совпадения       Member совпадения




MOCK_METHOD1( Foo, void( Bar ) );

EXPECT_CALL( mock, void( Field(&Bar::first, Le( 10 ) ) ) );
Google mock   Совпадения




                    •Wildcards
                    •Простые сравнения
                    •Строковые совпадения
                    •Контейнерные совпадения
                    •Member совпадения
                    •Составные совпадения
                    •…
                    •MATCHER макрос
Google mock   Совпадения    Составные совпадения




     EXPECT_CALL( foo, DoAlso( AnyOf(“Hey”, “Dolly”) ) );
Google mock   Совпадения




                    •Wildcards
                    •Простые сравнения
                    •Строковые совпадения
                    •Контейнерные совпадения
                    •Member совпадения
                    •Составные совпадения
                    •…
                    •MATCHER макрос
Google mock   Совпадения        MATCHER макрос




  MATCHER_P( IsDivisibleBy, n, "" ) { return ( arg % n ) == 0; }

  EXPECT_CALL( mock, Calc(IsDivisibleBy( 10 ) ) );
Google mock




              
Google mock    




              Virtual vs. nonvirtual?
Google mock




                Демонстрация
          Тестирование отреверсенного кода в gmock
Заключение...

Mais conteúdo relacionado

Mais procurados

ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf Conference
 
Javascript testing
Javascript testingJavascript testing
Javascript testing
TCS bank
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
MERA_school
 

Mais procurados (20)

Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в Django
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормоза
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORM
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GIL
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному коду
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.
 
Javascript testing
Javascript testingJavascript testing
Javascript testing
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collections
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
 
Bytecode
BytecodeBytecode
Bytecode
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)
 

Destaque (8)

Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummies
 
Secure development of code
Secure development of codeSecure development of code
Secure development of code
 
ITCamp 2012 - Paula Januszkiewicz - Stronghold to Strengthen
ITCamp 2012 - Paula Januszkiewicz - Stronghold to StrengthenITCamp 2012 - Paula Januszkiewicz - Stronghold to Strengthen
ITCamp 2012 - Paula Januszkiewicz - Stronghold to Strengthen
 
A New Tracer for Reverse Engineering - PacSec 2010
A New Tracer for Reverse Engineering - PacSec 2010A New Tracer for Reverse Engineering - PacSec 2010
A New Tracer for Reverse Engineering - PacSec 2010
 
Taller2
Taller2Taller2
Taller2
 
I haz you and pwn your maal whitepaper
I haz you and pwn your maal whitepaperI haz you and pwn your maal whitepaper
I haz you and pwn your maal whitepaper
 
Inside winnyp
Inside winnypInside winnyp
Inside winnyp
 
Sebastián Guerrero - Pimp your Android [RootedCON 2012]
Sebastián Guerrero - Pimp your Android [RootedCON 2012]Sebastián Guerrero - Pimp your Android [RootedCON 2012]
Sebastián Guerrero - Pimp your Android [RootedCON 2012]
 

Semelhante a CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
yaevents
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
Stanfy
 
Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9
Dima Dzuba
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. Views
Глеб Тарасов
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
UA Mobile
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложений
Andrew Mayorov
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
ITmozg
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Andrey Listochkin
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
Igor Khrol
 

Semelhante a CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering (20)

Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Google
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел Тайкало
 
Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9
 
Кастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриКастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутри
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
 
BDD
BDDBDD
BDD
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. Views
 
Moxy – реализация MVP под Android. С щепоткой магии
Moxy – реализация MVP под Android. С щепоткой магииMoxy – реализация MVP под Android. С щепоткой магии
Moxy – реализация MVP под Android. С щепоткой магии
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связность
 
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test Automation
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobile
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложений
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_school
 
Ember.js ответ на почти все вопросы - java script frameworks day 2014
Ember.js   ответ на почти все вопросы - java script frameworks day 2014Ember.js   ответ на почти все вопросы - java script frameworks day 2014
Ember.js ответ на почти все вопросы - java script frameworks day 2014
 
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
2014-10-04 02 Владислав Безверхий. Mocha - покрой frontend по полной
 
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
CodeFest 2011. Крестьянинов М. — Обзор аспектно-ориентированного программиров...
 
Refactoring
RefactoringRefactoring
Refactoring
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriver
 

Mais de Ciklum Ukraine

Introduction to amazon web services for developers
Introduction to amazon web services for developersIntroduction to amazon web services for developers
Introduction to amazon web services for developers
Ciklum Ukraine
 
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Ciklum Ukraine
 

Mais de Ciklum Ukraine (20)

"How keep normal blood pressure using TDD" By Roman Loparev
"How keep normal blood pressure using TDD" By Roman Loparev"How keep normal blood pressure using TDD" By Roman Loparev
"How keep normal blood pressure using TDD" By Roman Loparev
 
"Through the three circles of the it hell" by Roman Liashenko
"Through the three circles of the it hell" by Roman Liashenko"Through the three circles of the it hell" by Roman Liashenko
"Through the three circles of the it hell" by Roman Liashenko
 
Alex Pazhyn: Google_Material_Design
Alex Pazhyn: Google_Material_DesignAlex Pazhyn: Google_Material_Design
Alex Pazhyn: Google_Material_Design
 
Introduction to amazon web services for developers
Introduction to amazon web services for developersIntroduction to amazon web services for developers
Introduction to amazon web services for developers
 
Your 1st Apple watch Application
Your 1st Apple watch ApplicationYour 1st Apple watch Application
Your 1st Apple watch Application
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven Development
 
Back to the future: ux trends 2015
Back to the future: ux trends 2015Back to the future: ux trends 2015
Back to the future: ux trends 2015
 
Developing high load systems using C++
Developing high load systems using C++Developing high load systems using C++
Developing high load systems using C++
 
Collection view layout
Collection view layoutCollection view layout
Collection view layout
 
Introduction to auto layout
Introduction to auto layoutIntroduction to auto layout
Introduction to auto layout
 
Groovy on Android
Groovy on AndroidGroovy on Android
Groovy on Android
 
Unit Testing: Special Cases
Unit Testing: Special CasesUnit Testing: Special Cases
Unit Testing: Special Cases
 
Material design
Material designMaterial design
Material design
 
Kanban development
Kanban developmentKanban development
Kanban development
 
Mobile sketching
Mobile sketching Mobile sketching
Mobile sketching
 
More UX in our life
More UX in our lifeMore UX in our life
More UX in our life
 
Model-View-Controller: Tips&Tricks
Model-View-Controller: Tips&TricksModel-View-Controller: Tips&Tricks
Model-View-Controller: Tips&Tricks
 
Unit Tesing in iOS
Unit Tesing in iOSUnit Tesing in iOS
Unit Tesing in iOS
 
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
Future of Outsourcing report published in The Times featuring Ciklum's CEO To...
 
Михаил Попчук "Cкрытые резервы команд или 1+1=3"
Михаил Попчук "Cкрытые резервы команд или 1+1=3"Михаил Попчук "Cкрытые резервы команд или 1+1=3"
Михаил Попчук "Cкрытые резервы команд или 1+1=3"
 

CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

  • 2. Цели •Библиотеки detour и gmock •Есть проблемка с телепортацией... ©The Big Bang Theory
  • 3. Detours Что такое Detours?
  • 4. Detours Принцип работы
  • 5. Detours Принцип работы Caller function Callee function Your function Caller prolog*
  • 6. Detours Принцип работы Caller function Callee function Your function Caller prolog* * - replaced by unconditional jump original instructions
  • 7. Detours Принцип работы Caller function Callee function Your function Caller prolog* * - replaced by unconditional jump original instructions
  • 8. Detours Принцип работы … CalleeFunction: jmp YourFunction … CalleeFunction: CalleeFunction+5: push ebp push edi mov ebp,esp … push ebx Prolog: push esi push ebp push edi mov ebp,esp … push ebx push esi jmp CalleeFunction+5
  • 9. Detours Обзор
  • 10. Detours Обзор Трамплины*: •Статические •Динамические * - пролог
  • 11. Detours Обзор Статический
  • 12. Detours Обзор Статический пролог #include <windows.h> #include <detours.h> DETOUR_TRAMPOLINE( void WINAPI SleepTrampoline( DWORD ), Sleep ); void WINAPI SleepDetour( DWORD dw ) { return SleepTrampoline( dw ); } void main( ) { DetourFunctionWithTrampoline( ( PBYTE )SleepTrampoline, ( PBYTE )SleepDetour); Sleep( 0 ); DetourRemove( ( PBYTE )SleepTrampoline, ( PBYTE )SleepDetour); } * - обращайте внимание на соглашения о вызове
  • 13. Detours Обзор Динамический
  • 14. Detours Обзор Динамический пролог #include <windows.h> #include <detours.h> typedef void (WINAPI *SleepType)( DWORD ); static SleepType SleepTrampoline = 0; void WINAPI DynamicSleep( DWORD dw ) { return SleepTrampoline( dw ); } void main( ) { SleepTrampoline = ( SleepType )DetourFunction( (PBYTE)Sleep, ( PBYTE )DynamicSleep ); Sleep( 0 ); DetourRemove( (PBYTE)SleepTrampoline, ( PBYTE )DynamicSleep ); } *-обращайте внимание на соглашения о вызове
  • 15. Detours Обзор Еще Detours “умеет внедрение”
  • 16. Detours
  • 17. Detours  9.999 / 64
  • 18. Detours Демонстрация Запуск своего кода в контексте IDA Pro
  • 19. Google mock Что такое Gmock?
  • 20. Google mock •Mock класс •Ожидания •Действия •Совпадения
  • 21. Google mock Mock класс
  • 22. Google mock Mock класс Объявляется: •MOCK_METHODn •MOCK_CONST_METHODn •MOCK_METHODn_T •MOCK_CONST_METHODn_T
  • 23. Google mock Mock класс Use cases: •Виртуальные методы •Невиртуальные методы •Свободные функции •Шаблоны классов
  • 24. Google mock Mock класс Виртуальные методы struct Foo { virtual bool Transform( Gadget* g ) = 0; protected: virtual void Resume(); private: virtual int GetTimeOut(); }; struct MockFoo : public Foo { MOCK_METHOD1( Transform, bool( Gadget* g ) ); MOCK_METHOD0( Resume, void() ); MOCK_METHOD0( GetTimeOut, int() ); }; *- mock-методы в секции public
  • 25. Google mock Mock класс Use cases: •Виртуальные методы •Невиртуальные методы •Свободные функции •Шаблоны классов
  • 26. Google mock Mock класс Невиртуальные методы struct ConcretePacketStream { void AppendPacket( Packet* packet ); const Packet* GetPacket( size_t number) const; size_t NumberOfPackets() const; }; struct MockPacketStream { MOCK_CONST_METHOD1( GetPacket, const Packet*( size_t number) ); MOCK_CONST_METHOD0( NumberOfPackets, size_t() ); }; *- AppendPacket отстутствует
  • 27. Google mock Mock класс Use cases: •Виртуальные методы •Невиртуальные методы •Свободные функции •Шаблоны классов
  • 28. Google mock Mock класс Use cases: •Виртуальные методы •Невиртуальные методы •Свободные функции •Шаблоны классов
  • 29. Google mock Mock класс Шаблоны классов template < typename Elem > struct StackInterface { virtual ~StackInterface(); virtual int GetSize() const = 0; virtual void Push( const Elem& x ) = 0; }; template < typename Elem > struct MockStack : public StackInterface< Elem > { MOCK_CONST_METHOD0_T( GetSize, int() ); MOCK_METHOD1_T( Push, void( const Elem& x ) ); }; *- обратите внимание на _T
  • 30. Google mock Ожидания
  • 31. Google mock Ожидания EXPECT_CALL( mock_object, method( matchers ) ) .Times( cardinality ) .WillOnce( action ) .WillRepeatedly( action );
  • 32. Google mock Ожидания EXPECT_CALL( turtle, Forward( _ ) ); EXPECT_CALL( turtle, Forward( 10 ) ) .Times( 2 ); *- ожидания просматриваются в порядке обратном их объявлению
  • 33. Google mock Действия
  • 34. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  • 35. Google mock Действия Возвращают значение struct MockFoo : public Foo { MOCK_METHOD0( GetBar, Bar&() ); MOCK_METHOD1( Calculate, int( int ) ); }; ... MockFoo foo; Bar bar; EXPECT_CALL( foo, GetBar() ) .WillOnce( ReturnRef( bar ) ); EXPECT_CALL(foo, Calculate( 10 ) ) .WillOnce( ReturnArg< 0 >( ) );
  • 36. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  • 37. Google mock Действия Побочные эффекты struct MockMutator : public Mutator { MOCK_METHOD2( Mutate, void( bool mutate, int* value ) ); }; ... MockMutator mutator; EXPECT_CALL( mutator, Mutate( true, _ ) ) .WillOnce( SetArgPointee< 1 >( 5 ) );
  • 38. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  • 39. Google mock Действия Функция как действие struct MockFoo : public Foo { MOCK_METHOD1( ComplexJob, bool( int x ) ); }; struct Helper { bool ComplexJob( int x ); }; ... MockFoo foo; Helper helper; EXPECT_CALL( foo, ComplexJob( _ ) ) .WillOnce( Invoke( &helper, &Helper::ComplexJob ) );
  • 40. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  • 41. Google mock Действия Составное действие struct MockMutator : public Mutator { MOCK_METHOD1( MutateInt, bool( int* value ) ); }; ... MockMutator mutator; EXPECT_CALL( mutator, MutateInt( _ ) ) .WillOnce( DoAll( SetArgPointee< 0 >( 5 ), Return( true ) ) );
  • 42. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  • 43. Google mock Действия ACTION макрос ACTION_P( Add, n ) { return arg0 + n; } EXPECT_CALL( foo, Calc( 10 ) ) .WillOnce( ReturnAdd( 5 ) );
  • 44. Google mock Совпадения
  • 45. Google mock Совпадения foo.DoThat( “Hello”, 5 );
  • 46. Google mock Совпадения EXPECT_CALL( foo, DoThat( "Hello", 5 ) );
  • 47. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  • 48. Google mock Совпадения Wildcards EXPECT_CALL( foo, DoThat( _, 5 ) );
  • 49. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  • 50. Google mock Совпадения Простые сравнения EXPECT_CALL( foo, DoThat( NotNull(), Ge( 5 ) ) );
  • 51. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  • 52. Google mock Совпадения Строковые совпадения EXPECT_CALL( foo, DoAlso( HasSubstring(“Hey”) ) );
  • 53. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  • 54. Google mock Совпадения Контейнерные совпадения MOCK_METHOD1( Foo, void( const vector< int >& numbers ) ); EXPECT_CALL( mock, void( ElementsAre( 1, Gt( 0 ), _, 5 ) ) );
  • 55. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  • 56. Google mock Совпадения Member совпадения MOCK_METHOD1( Foo, void( Bar ) ); EXPECT_CALL( mock, void( Field(&Bar::first, Le( 10 ) ) ) );
  • 57. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  • 58. Google mock Совпадения Составные совпадения EXPECT_CALL( foo, DoAlso( AnyOf(“Hey”, “Dolly”) ) );
  • 59. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  • 60. Google mock Совпадения MATCHER макрос MATCHER_P( IsDivisibleBy, n, "" ) { return ( arg % n ) == 0; } EXPECT_CALL( mock, Calc(IsDivisibleBy( 10 ) ) );
  • 61. Google mock
  • 62. Google mock  Virtual vs. nonvirtual?
  • 63. Google mock Демонстрация Тестирование отреверсенного кода в gmock