Advertisement
Guest User

Untitled

a guest
Jul 5th, 2019
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.70 KB | None | 0 0
  1. def kernelbaseDbgOff(startEA):
  2. '''
  3. Суть такова. Мы ищем функцию IsDebuggerPresent в kernelbase.dll. Мы должны сделать так, чтобы она возвращала 0.
  4. Ищем мы ее с помощью бинароного поиска. Тело этой функции, полностью указано в pattern.
  5. В результате мы получим адрес начала функции. Ищем от этого места, адрес инструкции ret.
  6. Ставим conditional brakepoint на возврат, условие - обнуление EAX. Что является обходом
  7. данного анти-отладочного приема.
  8. '''
  9.  
  10. '''
  11. KERNELBASE:75642C98 64 A1 18 00 00 00 mov eax, large fs:18h
  12. KERNELBASE:75642C9E 8B 40 30 mov eax, [eax+30h]
  13. KERNELBASE:75642CA1 0F B6 40 02 movzx eax, byte ptr [eax+2]
  14. KERNELBASE:75642CA5 C3 retn
  15. '''
  16. cnd='EAX=0'
  17. pattern = '64 A1 18 00 00 00 8B 40 30 0F B6 40 02 C3'
  18. print "Searching IsDebuggerPresent implementation"
  19.  
  20. fnd_addr = idc.FindBinary(startEA, SEARCH_DOWN, pattern);
  21.  
  22. if (fnd_addr != idc.BADADDR):
  23. print hex(fnd_addr), idc.GetDisasm(fnd_addr)
  24. # KERNELBASE:75642CA5 C3 retn
  25. pattern = 'C3'
  26. print 'Searching ret...'
  27. ret_addr = idc.FindBinary(fnd_addr, SEARCH_DOWN, pattern);
  28.  
  29. if ret_addr != idc.BADADDR:
  30. print hex(ret_addr), idc.GetDisasm(ret_addr)
  31.  
  32. idc.AddBpt(ret_addr)
  33. #SetBptAttr(ret_addr, BPTATTR_BRK, 0x0); #don't stop
  34. idc.SetBptCnd(ret_addr, cnd)
  35.  
  36. def textDbgOff(startEA):
  37. '''
  38. Вторая антиотладочная техника. Считывания значения поля BeingDebugged.
  39.  
  40. .text:00401622 64 A1 30 00 00 00 mov eax, large fs:30h ; Получает адрес PEB'а
  41. .text:00401628 0F B6 40 02 movzx eax, byte ptr [eax+2] ; BeingDeb
  42. '''
  43. cnd='EAX=0'
  44. pattern = '64 A1 30 00 00 00 0F B6 40 02'
  45.  
  46. print "Searching BeingDebugged extracting code..."
  47.  
  48. fnd_addr = idc.FindBinary(startEA, SEARCH_DOWN, pattern);
  49.  
  50. if (fnd_addr != idc.BADADDR):
  51. end = idc.GetFunctionAttr(fnd_addr, FUNCATTR_END)
  52.  
  53. print hex(fnd_addr), idc.GetDisasm(fnd_addr)
  54.  
  55. #Ищем инструкцию через одну. Так как следующая инструкция это зануления поля BeingDebugged
  56. # check_addr - адрес инструкции, где идет эта проверка
  57. check_addr = idc.NextHead(idc.NextHead(fnd_addr, end), end)
  58. print hex(check_addr), idc.GetDisasm(check_addr)
  59.  
  60. idc.AddBpt(check_addr)
  61. #SetBptAttr(check_addr, BPT_BRK, 0); #don't stop
  62. idc.SetBptCnd(check_addr, cnd)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement