0
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                ...
Detours           Принцип работы                  Caller function                          Callee function                ...
Detours        Принцип работы                                …                                CalleeFunction:             ...
Detours          Обзор
Detours     Обзор         Трамплины*:                 •Статические                 •Динамические* - пролог
Detours   Обзор          Статический
Detours               Обзор                 Статический пролог  #include <windows.h>  #include <detours.h>  DETOUR_TRAMPOL...
Detours    Обзор          Динамический
Detours                Обзор                Динамический пролог  #include <windows.h>  #include <detours.h>  typedef void ...
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               •MOC...
Google mock   Mock класс     Use cases:               •Виртуальные методы               •Невиртуальные методы             ...
Google mock       Mock класс            Виртуальные методы           struct Foo           {             virtual bool Trans...
Google mock   Mock класс     Use cases:               •Виртуальные методы               •Невиртуальные методы             ...
Google mock       Mock класс      Невиртуальные методы      struct ConcretePacketStream      {        void AppendPacket( P...
Google mock   Mock класс     Use cases:               •Виртуальные методы               •Невиртуальные методы             ...
Google mock   Mock класс     Use cases:               •Виртуальные методы               •Невиртуальные методы             ...
Google mock        Mock класс           Шаблоны классов       template < typename Elem >       struct StackInterface      ...
Google mock              Ожидания
Google mock   Ожидания      EXPECT_CALL( mock_object, method( matchers ) )        .Times( cardinality )        .WillOnce( ...
Google mock     Ожидания           EXPECT_CALL( turtle, Forward( _ ) );           EXPECT_CALL( turtle, Forward( 10 ) )    ...
Google mock              Действия
Google mock    Действия              •Возвращают значение              •Побочные эффекты              •Функция как действи...
Google mock     Действия    Возвращают значение        struct MockFoo : public Foo        {          MOCK_METHOD0( GetBar,...
Google mock    Действия              •Возвращают значение              •Побочные эффекты              •Функция как действи...
Google mock    Действия    Побочные эффекты   struct MockMutator : public Mutator   {     MOCK_METHOD2( Mutate, void( bool...
Google mock    Действия              •Возвращают значение              •Побочные эффекты              •Функция как действи...
Google mock    Действия     Функция как действие struct MockFoo : public Foo {   MOCK_METHOD1( ComplexJob, bool( int x ) )...
Google mock    Действия              •Возвращают значение              •Побочные эффекты              •Функция как действи...
Google mock    Действия    Составное действие      struct MockMutator : public Mutator      {        MOCK_METHOD1( MutateI...
Google mock    Действия              •Возвращают значение              •Побочные эффекты              •Функция как действи...
Google mock     Действия       ACTION макрос          ACTION_P( Add, n ) { return arg0 + n; }          EXPECT_CALL( foo, C...
Google mock              Совпадения
Google mock     Совпадения              foo.DoThat( “Hello”, 5 );
Google mock   Совпадения  EXPECT_CALL( foo, DoThat( "Hello", 5 ) );
Google mock   Совпадения                    •Wildcards                    •Простые сравнения                    •Строковые...
Google mock   Совпадения         Wildcards              EXPECT_CALL( foo, DoThat( _, 5 ) );
Google mock   Совпадения                    •Wildcards                    •Простые сравнения                    •Строковые...
Google mock    Совпадения      Простые сравнения       EXPECT_CALL( foo, DoThat( NotNull(), Ge( 5 ) ) );
Google mock   Совпадения                    •Wildcards                    •Простые сравнения                    •Строковые...
Google mock   Совпадения    Строковые совпадения       EXPECT_CALL( foo, DoAlso( HasSubstring(“Hey”) ) );
Google mock   Совпадения                    •Wildcards                    •Простые сравнения                    •Строковые...
Google mock    Совпадения   Контейнерные совпаденияMOCK_METHOD1( Foo, void( const vector< int >& numbers ) );EXPECT_CALL( ...
Google mock   Совпадения                    •Wildcards                    •Простые сравнения                    •Строковые...
Google mock    Совпадения       Member совпаденияMOCK_METHOD1( Foo, void( Bar ) );EXPECT_CALL( mock, void( Field(&Bar::fir...
Google mock   Совпадения                    •Wildcards                    •Простые сравнения                    •Строковые...
Google mock   Совпадения    Составные совпадения     EXPECT_CALL( foo, DoAlso( AnyOf(“Hey”, “Dolly”) ) );
Google mock   Совпадения                    •Wildcards                    •Простые сравнения                    •Строковые...
Google mock   Совпадения        MATCHER макрос  MATCHER_P( IsDivisibleBy, n, "" ) { return ( arg % n ) == 0; }  EXPECT_CAL...
Google mock              
Google mock                  Virtual vs. nonvirtual?
Google mock                Демонстрация          Тестирование отреверсенного кода в gmock
Заключение...
Upcoming SlideShare
Loading in...5
×

CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

344

Published on

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
344
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering"

  1. 1. Bondartsov Artyom, Ciklum
  2. 2. Цели •Библиотеки detour и gmock •Есть проблемка с телепортацией... ©The Big Bang Theory
  3. 3. Detours Что такое Detours?
  4. 4. Detours Принцип работы
  5. 5. Detours Принцип работы Caller function Callee function Your function Caller prolog*
  6. 6. Detours Принцип работы Caller function Callee function Your function Caller prolog** - replaced by unconditional jump original instructions
  7. 7. Detours Принцип работы Caller function Callee function Your function Caller prolog** - replaced by unconditional jump original instructions
  8. 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. 9. Detours Обзор
  10. 10. Detours Обзор Трамплины*: •Статические •Динамические* - пролог
  11. 11. Detours Обзор Статический
  12. 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. 13. Detours Обзор Динамический
  14. 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. 15. Detours Обзор Еще Detours “умеет внедрение”
  16. 16. Detours 
  17. 17. Detours  9.999 / 64
  18. 18. Detours Демонстрация Запуск своего кода в контексте IDA Pro
  19. 19. Google mock Что такое Gmock?
  20. 20. Google mock •Mock класс •Ожидания •Действия •Совпадения
  21. 21. Google mock Mock класс
  22. 22. Google mock Mock класс Объявляется: •MOCK_METHODn •MOCK_CONST_METHODn •MOCK_METHODn_T •MOCK_CONST_METHODn_T
  23. 23. Google mock Mock класс Use cases: •Виртуальные методы •Невиртуальные методы •Свободные функции •Шаблоны классов
  24. 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. 25. Google mock Mock класс Use cases: •Виртуальные методы •Невиртуальные методы •Свободные функции •Шаблоны классов
  26. 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. 27. Google mock Mock класс Use cases: •Виртуальные методы •Невиртуальные методы •Свободные функции •Шаблоны классов
  28. 28. Google mock Mock класс Use cases: •Виртуальные методы •Невиртуальные методы •Свободные функции •Шаблоны классов
  29. 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. 30. Google mock Ожидания
  31. 31. Google mock Ожидания EXPECT_CALL( mock_object, method( matchers ) ) .Times( cardinality ) .WillOnce( action ) .WillRepeatedly( action );
  32. 32. Google mock Ожидания EXPECT_CALL( turtle, Forward( _ ) ); EXPECT_CALL( turtle, Forward( 10 ) ) .Times( 2 );*- ожидания просматриваются в порядке обратном их объявлению
  33. 33. Google mock Действия
  34. 34. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  35. 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. 36. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  37. 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. 38. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  39. 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. 40. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  41. 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. 42. Google mock Действия •Возвращают значение •Побочные эффекты •Функция как действие •Составное действие •ACTION макрос
  43. 43. Google mock Действия ACTION макрос ACTION_P( Add, n ) { return arg0 + n; } EXPECT_CALL( foo, Calc( 10 ) ) .WillOnce( ReturnAdd( 5 ) );
  44. 44. Google mock Совпадения
  45. 45. Google mock Совпадения foo.DoThat( “Hello”, 5 );
  46. 46. Google mock Совпадения EXPECT_CALL( foo, DoThat( "Hello", 5 ) );
  47. 47. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  48. 48. Google mock Совпадения Wildcards EXPECT_CALL( foo, DoThat( _, 5 ) );
  49. 49. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  50. 50. Google mock Совпадения Простые сравнения EXPECT_CALL( foo, DoThat( NotNull(), Ge( 5 ) ) );
  51. 51. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  52. 52. Google mock Совпадения Строковые совпадения EXPECT_CALL( foo, DoAlso( HasSubstring(“Hey”) ) );
  53. 53. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  54. 54. Google mock Совпадения Контейнерные совпаденияMOCK_METHOD1( Foo, void( const vector< int >& numbers ) );EXPECT_CALL( mock, void( ElementsAre( 1, Gt( 0 ), _, 5 ) ) );
  55. 55. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  56. 56. Google mock Совпадения Member совпаденияMOCK_METHOD1( Foo, void( Bar ) );EXPECT_CALL( mock, void( Field(&Bar::first, Le( 10 ) ) ) );
  57. 57. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  58. 58. Google mock Совпадения Составные совпадения EXPECT_CALL( foo, DoAlso( AnyOf(“Hey”, “Dolly”) ) );
  59. 59. Google mock Совпадения •Wildcards •Простые сравнения •Строковые совпадения •Контейнерные совпадения •Member совпадения •Составные совпадения •… •MATCHER макрос
  60. 60. Google mock Совпадения MATCHER макрос MATCHER_P( IsDivisibleBy, n, "" ) { return ( arg % n ) == 0; } EXPECT_CALL( mock, Calc(IsDivisibleBy( 10 ) ) );
  61. 61. Google mock 
  62. 62. Google mock  Virtual vs. nonvirtual?
  63. 63. Google mock Демонстрация Тестирование отреверсенного кода в gmock
  64. 64. Заключение...
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×