Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def kernelbaseDbgOff(startEA):
- '''
- Суть такова. Мы ищем функцию IsDebuggerPresent в kernelbase.dll. Мы должны сделать так, чтобы она возвращала 0.
- Ищем мы ее с помощью бинароного поиска. Тело этой функции, полностью указано в pattern.
- В результате мы получим адрес начала функции. Ищем от этого места, адрес инструкции ret.
- Ставим conditional brakepoint на возврат, условие - обнуление EAX. Что является обходом
- данного анти-отладочного приема.
- '''
- '''
- KERNELBASE:75642C98 64 A1 18 00 00 00 mov eax, large fs:18h
- KERNELBASE:75642C9E 8B 40 30 mov eax, [eax+30h]
- KERNELBASE:75642CA1 0F B6 40 02 movzx eax, byte ptr [eax+2]
- KERNELBASE:75642CA5 C3 retn
- '''
- cnd='EAX=0'
- pattern = '64 A1 18 00 00 00 8B 40 30 0F B6 40 02 C3'
- print "Searching IsDebuggerPresent implementation"
- fnd_addr = idc.FindBinary(startEA, SEARCH_DOWN, pattern);
- if (fnd_addr != idc.BADADDR):
- print hex(fnd_addr), idc.GetDisasm(fnd_addr)
- # KERNELBASE:75642CA5 C3 retn
- pattern = 'C3'
- print 'Searching ret...'
- ret_addr = idc.FindBinary(fnd_addr, SEARCH_DOWN, pattern);
- if ret_addr != idc.BADADDR:
- print hex(ret_addr), idc.GetDisasm(ret_addr)
- idc.AddBpt(ret_addr)
- #SetBptAttr(ret_addr, BPTATTR_BRK, 0x0); #don't stop
- idc.SetBptCnd(ret_addr, cnd)
- def textDbgOff(startEA):
- '''
- Вторая антиотладочная техника. Считывания значения поля BeingDebugged.
- .text:00401622 64 A1 30 00 00 00 mov eax, large fs:30h ; Получает адрес PEB'а
- .text:00401628 0F B6 40 02 movzx eax, byte ptr [eax+2] ; BeingDeb
- '''
- cnd='EAX=0'
- pattern = '64 A1 30 00 00 00 0F B6 40 02'
- print "Searching BeingDebugged extracting code..."
- fnd_addr = idc.FindBinary(startEA, SEARCH_DOWN, pattern);
- if (fnd_addr != idc.BADADDR):
- end = idc.GetFunctionAttr(fnd_addr, FUNCATTR_END)
- print hex(fnd_addr), idc.GetDisasm(fnd_addr)
- #Ищем инструкцию через одну. Так как следующая инструкция это зануления поля BeingDebugged
- # check_addr - адрес инструкции, где идет эта проверка
- check_addr = idc.NextHead(idc.NextHead(fnd_addr, end), end)
- print hex(check_addr), idc.GetDisasm(check_addr)
- idc.AddBpt(check_addr)
- #SetBptAttr(check_addr, BPT_BRK, 0); #don't stop
- idc.SetBptCnd(check_addr, cnd)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement