LyScript如何实现绕过反调试保护
导读:本文共2411字符,通常情况下阅读需要8分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要:LyScript插件中内置的方法可实现各类反调试以及屏蔽特定API函数的功能,这类功能在应对病毒等恶意程序时非常有效,例如当程序调用特定API函数时我们可以将其拦截,从而实现保护系统在调试时不被破坏的目的。绕过反调试机制:最常用的反调试机制就是用IsDebuggerPresent该标志检查PEB+2位置处的内容,如果为1则表示正在被调试,我们运行脚本直接将其设置为0即可绕过反调试机制。也就是进程环... ...
目录
(为您整理了一些要点),点击可以直达。LyScript插件中内置的方法可实现各类反调试以及屏蔽特定API函数的功能,这类功能在应对病毒等恶意程序时非常有效,例如当程序调用特定API函数时我们可以将其拦截,从而实现保护系统在调试时不被破坏的目的。
绕过反调试机制:最常用的反调试机制就是用IsDebuggerPresent
该标志检查PEB+2
位置处的内容,如果为1则表示正在被调试,我们运行脚本直接将其设置为0即可绕过反调试机制。
也就是进程环境块中+2的位置,此处是一个字节标志,反调试的机制是,程序调用IsDebuggerPresent
检查此处的标志,如果为1则说明程序正在被调试,为0则说明没有被调试,只需要在运行之前将其设置为0即可绕过反调试。
fromLyScript32importMyDebugifname=="main":
初始化
dbg=MyDebug()
dbg.connect()通过PEB找到调试标志位
peb=dbg.get_peb_address(dbg.get_process_id())
print("调试标志地址:0x{:x}".format(peb+2))flag=dbg.read_memory_byte(peb+2)
print("调试标志位:{}".format(flag))将调试标志设置为0即可过掉反调试
nop_debug=dbg.write_memory_byte(peb+2,0)
print("反调试绕过状态:{}".format(nop_debug))dbg.close()
将程序载入调试器,并运行如上脚本,然后运行程序,你会发现反调试被绕过了。
其次我们还可以动态的在函数开头位置写入sub eax,eax,ret
指令,这样当程序要调用特定函数时,会直接返回退出,从而达到屏蔽函数执行等目的。
fromLyScript32importMyDebug得到所需要的机器码
defset_assemble_opcde(dbg,address):
得到第一条长度
opcode_size=dbg.assemble_code_size("subeax,eax")
写出汇编指令
dbg.assemble_at(address,"subeax,eax")
dbg.assemble_at(address+opcode_size,"ret")ifname=="main":
初始化
dbg=MyDebug()
dbg.connect()得到函数所在内存地址
process32first=dbg.get_module_from_function("kernel32","Process32FirstW")
process32next=dbg.get_module_from_function("kernel32","Process32NextW")
messagebox=dbg.get_module_from_function("user32.dll","MessageBoxA")
messageboxw=dbg.get_module_from_function("user32.dll","MessageBoxW")print(hex(messagebox),"",hex(messageboxw))
替换函数位置为subeax,eaxret
set_assemble_opcde(dbg,messagebox)
set_assemble_opcde(dbg,messageboxw)dbg.close()
如上,我们在弹窗位置写出返回指令,然后运行程序,你会发现,弹窗不会出现了,这也就把这个函数给屏蔽了。
同理,绕过进程枚举,依然可以使用此方式实现。
绕过进程枚举:病毒会枚举所有运行的进程以确认是否有调试器在运行,我们可以在特定的函数开头处写入SUB EAX,EAX RET指令让其无法调用枚举函数从而失效。
fromLyScript32importMyDebug得到所需要的机器码
defset_assemble_opcde(dbg,address):
得到第一条长度
opcode_size=dbg.assemble_code_size("subeax,eax")
写出汇编指令
dbg.assemble_at(address,"subeax,eax")
dbg.assemble_at(address+opcode_size,"ret")ifname=="main":
初始化
dbg=MyDebug()
dbg.connect()得到函数所在内存地址
process32first=dbg.get_module_from_function("kernel32","Process32FirstW")
process32next=dbg.get_module_from_function("kernel32","Process32NextW")
print("process32first=0x{:x}|process32next=0x{:x}".format(process32first,process32next))替换函数位置为subeax,eaxret
set_assemble_opcde(dbg,process32first)
set_assemble_opcde(dbg,process32next)dbg.close()
LyScript如何实现绕过反调试保护的详细内容,希望对您有所帮助,信息来源于网络。