SlideShare a Scribd company logo
1 of 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
Заключение...

More Related Content

What's hot

Производительность в Django
Производительность в DjangoПроизводительность в Django
Производительность в DjangoMoscowDjango
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Декораторы в Python и их практическое использование
Декораторы в Python и их практическое использование Sergey Schetinin
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Python и его тормоза
Python и его тормозаPython и его тормоза
Python и его тормозаAlexander Shigin
 
Лекция 1. Начало.
Лекция 1. Начало.Лекция 1. Начало.
Лекция 1. Начало.Roman Brovko
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Roman Brovko
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf Conference
 
Толстая модель. История разработки ORM
Толстая модель. История разработки ORMТолстая модель. История разработки ORM
Толстая модель. История разработки ORMMikhail Shamin
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.Roman Brovko
 
Лекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILЛекция 13. Многопоточность и GIL
Лекция 13. Многопоточность и GILRoman Brovko
 
C#. От основ к эффективному коду
C#. От основ к эффективному кодуC#. От основ к эффективному коду
C#. От основ к эффективному кодуVasiliy Deynega
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 
Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Лекция 3. Декораторы и модуль functools.
Лекция 3. Декораторы и модуль functools.Roman Brovko
 
Javascript testing
Javascript testingJavascript testing
Javascript testingTCS bank
 
10. java lecture generics&collections
10. java lecture generics&collections10. java lecture generics&collections
10. java lecture generics&collectionsMERA_school
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.Roman Brovko
 
"Погружение в Robolectric" Дмитрий Костырев (Avito)
"Погружение в Robolectric"  Дмитрий Костырев (Avito)"Погружение в Robolectric"  Дмитрий Костырев (Avito)
"Погружение в Robolectric" Дмитрий Костырев (Avito)AvitoTech
 

What's hot (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)
 

Viewers also liked

Google mock for dummies
Google mock for dummiesGoogle mock for dummies
Google mock for dummiesFraboni Ec
 
Secure development of code
Secure development of codeSecure development of code
Secure development of codeSalomeVictor
 
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 StrengthenITCamp
 
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 2010Tsukasa Oi
 
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 whitepaperHarsimran Walia
 
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]RootedCON
 

Viewers also liked (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]
 

Similar to CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

Юнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, GoogleЮнит-тестирование и Google Mock. Влад Лосев, Google
Юнит-тестирование и Google Mock. Влад Лосев, Googleyaevents
 
Фундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоФундаментальные основы разработки под iOS. Павел Тайкало
Фундаментальные основы разработки под iOS. Павел ТайкалоStanfy
 
Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Проектирование программных систем. Занятие 9
Проектирование программных систем. Занятие 9Dima Dzuba
 
Кастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриКастомная кнопка: взгляд изнутри
Кастомная кнопка: взгляд изнутриKirill Averyanov
 
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов —  Кастомная кнопка: взгляд изнутриКирилл Аверьянов —  Кастомная кнопка: взгляд изнутри
Кирилл Аверьянов — Кастомная кнопка: взгляд изнутриCocoaHeads
 
Интуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsИнтуит. Разработка приложений для iOS. Лекция 3. Views
Интуит. Разработка приложений для iOS. Лекция 3. ViewsГлеб Тарасов
 
Moxy – реализация MVP под Android. С щепоткой магии
Moxy – реализация MVP под Android. С щепоткой магииMoxy – реализация MVP под Android. С щепоткой магии
Moxy – реализация MVP под Android. С щепоткой магииYuri Shmakov
 
Архитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьАрхитектура в Agile: слабая связность
Архитектура в Agile: слабая связностьAndrey Bibichev
 
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"
Сергей Бережной "Клиентский JavaScript в БЭМ-терминах: от блока до библиотеки"Yandex
 
WebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловWebCamp: Developer Day: Parse'им бэкенд - Аким Халилов
WebCamp: Developer Day: Parse'им бэкенд - Аким ХалиловGeeksLab Odessa
 
iOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationiOS and Android Mobile Test Automation
iOS and Android Mobile Test AutomationAndrii Dzynia
 
Mobile automation uamobile
Mobile automation uamobileMobile automation uamobile
Mobile automation uamobileUA Mobile
 
Проектирование архитектуры приложений
Проектирование архитектуры приложенийПроектирование архитектуры приложений
Проектирование архитектуры приложенийAndrew Mayorov
 
I tmozg js_school
I tmozg js_schoolI tmozg js_school
I tmozg js_schoolITmozg
 
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 2014Andrey Listochkin
 
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. Крестьянинов М. — Обзор аспектно-ориентированного программиров...CodeFest
 
Типичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverТипичные ошибки начинающих писать тесты на WebDriver
Типичные ошибки начинающих писать тесты на WebDriverIgor Khrol
 

Similar to 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
 

More from Ciklum Ukraine

"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 LoparevCiklum Ukraine
 
"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 LiashenkoCiklum Ukraine
 
Alex Pazhyn: Google_Material_Design
Alex Pazhyn: Google_Material_DesignAlex Pazhyn: Google_Material_Design
Alex Pazhyn: Google_Material_DesignCiklum 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 developersCiklum Ukraine
 
Your 1st Apple watch Application
Your 1st Apple watch ApplicationYour 1st Apple watch Application
Your 1st Apple watch ApplicationCiklum Ukraine
 
Test Driven Development
Test Driven DevelopmentTest Driven Development
Test Driven DevelopmentCiklum Ukraine
 
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 2015Ciklum Ukraine
 
Developing high load systems using C++
Developing high load systems using C++Developing high load systems using C++
Developing high load systems using C++Ciklum Ukraine
 
Collection view layout
Collection view layoutCollection view layout
Collection view layoutCiklum Ukraine
 
Introduction to auto layout
Introduction to auto layoutIntroduction to auto layout
Introduction to auto layoutCiklum Ukraine
 
Unit Testing: Special Cases
Unit Testing: Special CasesUnit Testing: Special Cases
Unit Testing: Special CasesCiklum Ukraine
 
Model-View-Controller: Tips&Tricks
Model-View-Controller: Tips&TricksModel-View-Controller: Tips&Tricks
Model-View-Controller: Tips&TricksCiklum 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
 
Михаил Попчук "Cкрытые резервы команд или 1+1=3"
Михаил Попчук "Cкрытые резервы команд или 1+1=3"Михаил Попчук "Cкрытые резервы команд или 1+1=3"
Михаил Попчук "Cкрытые резервы команд или 1+1=3"Ciklum Ukraine
 

More from 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