Your SlideShare is downloading. ×
CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

CiklumCPPSat24032012:ArtyomBondartsov-MicrosoftDetours&GoogleMockForC++InDevelopmentUsingReverseEngineering

336
views

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
336
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
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. Заключение...