CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

  • 320 views
Uploaded on

 

More in: Technology
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
320
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. Bondartsov Artyom, Ciklum
  • 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
  • 64. Заключение...