Сейчас на форуме: vsv1, Alf (+4 невидимых)

 eXeL@B —› Вопросы новичков —› Помощь с pin tools
Посл.ответ Сообщение

Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 17 сентября 2015 23:59 · Поправил: rev4you
· Личное сообщение · #1

Написал минимальный трейсер с pin tools.
Логика такова: ожидает загрузки нужной длл, после того как начнет исполняется нужная мне функций - проверяю имя файла которое она получила, если подошло - начинаю записывать все исполненые инструкции в этом модуле..

Все вроде как просто, но лог какой то странный..

Вот пример выдачи
Code:
  1. 0x70224bde  push 0x70804294
  2. 0x70224be3  push edi
  3. 0x70224be4  call 0x707c9b50   
  4. 0x7072f80c  cmp dword ptr [ebp+0x189c], edi  - вот тут странный прыжок, пропущены инструкции..
  5. 0x7072f812  jnz 0x7072f820
  6. 0x7072f814  cmp dword ptr [ebp+0x2410], edi
  7. 0x7072f81a  jz 0x7072fbd8


В дизасме код после вызова такой

Code:
  1. 6FB54BE3                 push    edi
  2. .text:6FB54BE4                 call    sub_700F9B50
  3. .text:6FB54BE9                 add     esp, 14h - эти инструкции почему то опущены (...
  4. .text:6FB54BEC                 test    eax, eax



Трейсер
Code:
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. #include "pin.H"
  5.  
  6. std::ofstream TraceFile;
  7. KNOB<string> KnobOutputFile(KNOB_MODE_WRITEONCE, "pintool", "o", "calltrace.out", "specify trace file name");
  8. KNOB<BOOL>   KnobPrintArgs(KNOB_MODE_WRITEONCE, "pintool", "a", "1", "print call arguments ");
  9.  
  10.  
  11. BOOL is_intresting_file = FALSE;
  12.  
  13.  
  14. ADDRINT offset0 = 0x136920 + 0x23;
  15. ADDRINT ptr_v34 = 0;
  16. ADDRINT aeheurBase = 0;
  17. ADDRINT aeheurSizeOf = 0;
  18. ADDRINT aeheurEnd = 0;
  19.  
  20. ADDRINT calle_ret = 0;
  21.  
  22.  
  23. VOID getFirstPTR(ADDRINT edi, ADDRINT esp)
  24. {
  25.          //struct_v34_from_scan_api *ptr;
  26.          ptr_v34 = edi;
  27.  
  28.          
  29.          calle_ret = *(ADDRINT*)esp;
  30.          ADDRINT new_ptr = *(ADDRINT*)(ptr_v34 + 0x158);
  31.          wchar_t* file_name_ptr = **(wchar_t***)(ptr_v34 + 0x38);
  32.  
  33.          char buff[512];
  34.          for ( int i = 0; file_name_ptr[i]; ++i )
  35.          {
  36.                  buff[i] = file_name_ptr[i];
  37.                  buff[i+1] = 0;
  38.          }
  39.  
  40.          is_intresting_file = strstr(buff,"C:\123") != 0;
  41.  
  42.          
  43.          if ( is_intresting_file ){
  44.                  TraceFile << "calle_ret " << calle_ret;
  45.                  TraceFile << " ptr " << ptr_v34;
  46.                  TraceFile <<"( " << buff << ") " << new_ptr << endl;
  47.          }
  48. };
  49.  
  50. VOID Trace(INS trace, VOID *v)
  51.  
  52. {
  53.     if ( aeheurBase == 0 )
  54.                  return ;
  55.  
  56.          do
  57.     {
  58.         INS tail = trace;
  59.                  
  60.                  ADDRINT instAddr =  INS_Address(tail);
  61.  
  62.                  //
  63.                  //
  64.                  //
  65.                  if ( !(instAddr >= aeheurBase && instAddr < aeheurEnd) )
  66.                         continue;
  67.  
  68.                  if ( instAddr == (aeheurBase + offset0) )
  69.                  {
  70.                         calle_ret = 0;
  71.                         INS_InsertPredicatedCall(tail, IPOINT_BEFORE, AFUNPTR(getFirstPTR), IARG_REG_VALUE, REG_EDI,  IARG_REG_VALUE, REG_ESP, IARG_END);
  72.                         continue;
  73.                  }
  74.          
  75.                  if ( !is_intresting_file )
  76.                         continue;
  77.  
  78.                  TraceFile <<instAddr << " " << INS_Disassemble(tail).c_str() << endl;
  79.     }while(0);
  80. }
  81.  
  82. /* ===================================================================== */
  83.  
  84. VOID Fini(INT32 code, VOID *v)
  85. {
  86.     TraceFile << "# eof" << endl;
  87.     
  88.     TraceFile.close();
  89. }
  90.  
  91. VOID ImgLoadNotifyier(IMG  img, VOID * vi) 
  92. {
  93.          const char *= IMG_Name(img).c_str();
  94.          while ( *) ++p;
  95.          while ( *!= '') --p;
  96.                                   
  97.          if ( _stricmp("\aeheur.dll", p) != 0 )
  98.                  return ;
  99.  
  100.          TraceFile << "FOUND\n";
  101.          aeheurBase = IMG_StartAddress(img);
  102.          aeheurEnd = IMG_HighAddress(img);
  103.          aeheurSizeOf = aeheurEnd - IMG_LowAddress(img);
  104.  
  105.          printf("Loading %s\n", p );
  106.  
  107.          TraceFile << p << " at " << aeheurBase << " SizeOfImage " <<  aeheurSizeOf << endl;
  108. }
  109.  
  110. int  main(int argc, char *argv[])
  111. {
  112.     
  113.     PIN_InitSymbols();
  114.  
  115.     if( PIN_Init(argc,argv) )
  116.     {
  117.         return -1;
  118.     }
  119.     
  120.  
  121.     TraceFile.open(KnobOutputFile.Value().c_str());
  122.  
  123.     TraceFile << hex;
  124.     TraceFile.setf(ios::showbase);
  125.     
  126.     IMG_AddInstrumentFunction(ImgLoadNotifyier, 0);
  127.          INS_AddInstrumentFunction(Trace, 0);
  128.          
  129.  
  130.     PIN_AddFiniFunction(Fini, 0);
  131.  
  132.     PIN_StartProgram();
  133.     
  134.     return 0;
  135. }


Вопрос - Как собственно pin tools планирует свои call back ? на каждую инструкцию ? Возникает ощущение что он как то пропускает их..

Еще пример, а также приложил весь лог.
При этом программа не генерирует в этих местах exceptions, и исполняется "линейно" .

Code:
  1. 0x70667e43  call 0x7057ce00 - тут все правильно , возврат +5 байт
  2. 0x70667e48  test eax, eax
  3. 0x70667e4a  jz 0x70667fef
  4. 0x70667e50  push edi
  5. 0x70667e51  mov edx, 0x70808eec
  6. 0x70667e56  mov ecx, 0x70804380
  7. 0x70667e5b  call 0x7057ce00 - опять хрень... 
  8. 0x706686cb  cmp dword ptr [esi+0x740], ebp
  9. 0x706686d1  jz 0x706686df
  10. 0x706686d3  cmp dword ptr [esi+0x2674], ebp
  11. 0x706686d9  jz 0x70668882
  12. 0x706686df  push edi
  13. 0x706686e0  mov edx, 0x70808ed8
  14. 0x706686e5  mov ecx, 0x70804a8c
  15. 0x706686ea  call 0x7057ce00 - опять хрень... 
  16. 0x706686df  push edi
  17. 0x706686e0  mov edx, 0x70808ed8
  18. 0x706686e5  mov ecx, 0x70804a8c
  19. 0x706686ea  call 0x7057ce00 - а тут все ок, функция таже..
  20. 0x706686ef  test eax, eax
  21. 0x706686f1  jz 0x70668882
  22. 0x706686f7  push edi
  23. 0x706686f8  mov edx, 0x70804bf0
  24. 0x706686fd  mov ecx, 0x70804380
  25. 0x70668702  call 0x7057ce00 - опять хрень... 
  26. 0x704fa3ec  cmp word ptr [esi+0x2b7c], 0x0
  27. 0x704fa3f4  jnz 0x704facdf
  28. 0x704fa3fa  cmp dword ptr [esi+0x790], 0x1e


a390_18.09.2015_EXELAB.rU.tgz - calltrace.out



Ранг: 64.9 (постоянный), 47thx
Активность: 0.120.02
Статус: Участник

Создано: 18 сентября 2015 09:58
· Личное сообщение · #2

мож INS_InsertPredicatedCall замениь на InsertCall ?



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 18 сентября 2015 13:44 · Поправил: rev4you
· Личное сообщение · #3

hash87szf пишет:
мож INS_InsertPredicatedCall замениь на InsertCall ?

В данном случае она используется только один раз, для определения имени файла.
Так что это не влияет на результат, трассы..

П.С также сменил ее ради интереса на InsertCall ничего не изменилось, если бы изменилось это было бы странно.




Ранг: 568.2 (!), 464thx
Активность: 0.550.57
Статус: Участник
оптимист

Создано: 18 сентября 2015 14:04 · Поправил: ClockMan
· Личное сообщение · #4

rev4you
может почитать мануалы на сайте--> Link <--

-----
Чтобы правильно задать вопрос, нужно знать большую часть ответа. Р.Шекли.




Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 18 сентября 2015 14:08
· Личное сообщение · #5

Это было сделано первым делом.



Ранг: 64.9 (постоянный), 47thx
Активность: 0.120.02
Статус: Участник

Создано: 18 сентября 2015 14:43 · Поправил: hash87szf
· Личное сообщение · #6

>> данном случае она используется только один раз, для определения имени файла.
INS_AddInstrumentFunction(Trace, 0); --> Трэйс() на каждой инстракшн вызывается, a ImgLoadNotifyier на каждой дллки.

Я в код не вникал...
Как вариан мож с адресами/чеками что-то не в ряд?

Попробуйте не фильтровать а сделать тупой трэйс.
Это канешн будет длиться... и весить...

А не проше ли руками под антивирь подпиливать?? Или какая другая цель приследуется?

>>
0x70667e5b call 0x7057ce00 - опять хрень...
0x706686cb cmp dword ptr [esi+0x740], ebp

Почему хрень? Может Колл не возвращяется через Рет. Попробуйте ловить все Брэнч после Коллов.



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 18 сентября 2015 15:05 · Поправил: rev4you
· Личное сообщение · #7

он возвращается через рет, в отладчике именно так. и антиотладки у него нету.

Добавлено спустя 8 часов 6 минут
хм тесты на cmd.exe показывают что все впорядке.
Значит проблема на моей строне..




Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 20 сентября 2015 02:51 · Поправил: rev4you
· Личное сообщение · #8

Странное поведение InsertCall
Code:
  1. VOID Trace(INS trace, VOID *v){
  2.    if ( aeheurBase == 0 )
  3.                   return ;
  4.     INS tail = trace;
  5.                  
  6.     ADDRINT instAddr =  INS_Address(tail);
  7.  
  8.      if ( !(instAddr >= aeheurBase && instAddr < aeheurEnd) )
  9.              return ;
  10.  
  11.  
  12.      INS_InsertCall(tail, IPOINT_BEFORE, AFUNPTR(TEST), IARG_REG_VALUE, REG_EBP,  IARG_REG_VALUE, REG_EIP, IARG_END);
  13.  
  14.                  TraceFile << "thread id: " << PIN_ThreadId()<<" " <<  instAddr  << " ";
  15.                  TraceFile<< INS_Disassemble(tail).c_str() << endl;
  16.  
  17.  
  18. }
  19. VOID TEST(ADDRINT ebp, ADDRINT eip){
  20.          TraceFile << "Test trace \n";
  21.          return ;
  22. };

Вывод:
Code:
  1. thread id: 0x1  0x70c5b439  cmp dword ptr [esp+0x8], 0x1
  2. thread id: 0x1  0x70c5b43e  jnz 0x70c5b445
  3. thread id: 0x1  0x70c5b440  call 0x70c5e602
  4. Test trace 
  5. Test trace 
  6. Test trace 
  7. thread id: 0x1  0x70c5e602  push ebp
  8. thread id: 0x1  0x70c5e603  mov ebp, esp
  9. thread id: 0x1  0x70c5e605  sub esp, 0x10
  10. thread id: 0x1  0x70c5e608  mov eax, dword ptr [0x70cc12bc]
  11. thread id: 0x1  0x70c5e60d  and dword ptr [ebp-0x8], 0x0
  12. thread id: 0x1  0x70c5e611  and dword ptr [ebp-0x4], 0x0
  13. thread id: 0x1  0x70c5e615  push ebx
  14. thread id: 0x1  0x70c5e616  push edi
  15. thread id: 0x1  0x70c5e617  mov edi, 0xbb40e64e
  16. thread id: 0x1  0x70c5e61c  cmp eax, edi
  17. thread id: 0x1  0x70c5e61e  mov ebx, 0xffff0000
  18. thread id: 0x1  0x70c5e623  jz 0x70c5e632
  19. thread id: 0x1  0x70c5e625  test ebx, eax
  20. thread id: 0x1  0x70c5e627  jz 0x70c5e632
  21. thread id: 0x1  0x70c5e629  not eax
  22. thread id: 0x1  0x70c5e62b  mov dword ptr [0x70cc12c0], eax
  23. thread id: 0x1  0x70c5e630  jmp 0x70c5e692
  24. Test trace 
  25. Test trace 
  26. Test trace 
  27. Test trace 
  28. Test trace 
  29. Test trace 
  30. Test trace 
  31. Test trace 
  32. Test trace 
  33. Test trace 
  34. Test trace 
  35. Test trace 
  36. Test trace 
  37. Test trace 
  38. Test trace 
  39. Test trace 
  40. Test trace 
  41. thread id: 0x1  0x70c5e692  pop edi
  42. thread id: 0x1  0x70c5e693  pop ebx
  43. thread id: 0x1  0x70c5e694  leave 
  44. thread id: 0x1  0x70c5e695  ret 


Это конечно не то что ожидалось, оказывается все добавленные обработчики срабатывают после jmp\call\ret ..



Ранг: 64.9 (постоянный), 47thx
Активность: 0.120.02
Статус: Участник

Создано: 20 сентября 2015 16:53
· Личное сообщение · #9

AFUNPTR(TEST)?
В примерах (AFUNPTR)docount. (AFUNPTR)TEST?

>> оказывается все добавленные обработчики срабатывают после jmp\call\ret ..
Я думаю это из за Basic Block "формата".
Если вставить
TraceFile<< INS_Disassemble(tail).c_str() << endl;
в TEST() то он будет правильно делать.
Пин инлайнит ТЕСТ() перед каждой инстракшн, а шо он делает с Trace(), хз.

Also, В манах есть Order of Instrumentation.



Ранг: 5.6 (гость)
Активность: 0.010
Статус: Участник

Создано: 21 сентября 2015 01:43 · Поправил: rev4you
· Личное сообщение · #10

Пин инлайнит ТЕСТ() перед каждой инстракшн, а шо он делает с Trace(), хз.
Я TRACE_ из пин не используют, просто имя функции такое. там INS_AddInstrumentFunction(Trace, 0);



Ранг: 64.9 (постоянный), 47thx
Активность: 0.120.02
Статус: Участник

Создано: 21 сентября 2015 12:27
· Личное сообщение · #11

// Pin calls this function every time a new instruction is encountered
VOID Instruction(INS ins, VOID *v)

// This function is called before every instruction is executed
VOID docount() { icount++; }

Как я понимаю docount инлайнится, а Instruction() хз
У вас ТЕСТ инлайн, а Trace хз



Ранг: 64.9 (постоянный), 47thx
Активность: 0.120.02
Статус: Участник

Создано: 13 октября 2015 21:39
· Личное сообщение · #12

Подниму тред.
Так оно и естъ имхо изза бэйзик блоков.
http://deroko.phearless.org/rce.html
pinlog.zip

Чел парзит как и в Пин примерах все инстракшн одного BBL.

Чел с shell-stom на гитхабе сорцы его пинтулз, делает похожеe. Но он нигде весь трэйс не записывает.


 eXeL@B —› Вопросы новичков —› Помощь с pin tools
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати