垃圾代码
无意义的代码,也就是用来磨炼逆向人员的。。
扰乱代码对齐
这个的话,利用了代码对齐的状况,就中间插入了一个或者两个字节的指令,使得指令解析的时候,发送事故。但是在执行的时候并不会出现报错,利用跳转来控制运行流程。举个例子:
例1:
0041510F FFE3 JMP EBX //EBX=415117
00415111 C9 LEAVE
00415112 C2 0800 RETN 8
00415115 A3 687801FF MOV DWORD PTR DS:[FF017268],EAX
0041511A 5D POP EBP
例2:
00415117 72 01 JB SHORT 0041511A
00415119 FF5D 33 CALL FAR FWORD PTR SS:[EBP+33]
0041511C C9 LEAVE
0041511E 41 INC ECX
通常把纠缠混合在一起的代码称为“混合代码”
Stolen Bytes
将OEP的部分代码转移到另一个地方,使得很难Dump;另一方面对OEP的查找也会变得困难,OEP有时还会被处理。。。
API重定向
简单操作:把API 的实现代码重新拷贝一份,放在内存中,然后修改IAT,执行API代码时,去执行拷贝的那份。这样可以防止那些直接通过API下断点的反调试。
复杂操作:利用ASProtect进行混淆代码生成,然后一行代码的功能被替换成了3万多行。不得不说。。很强。。
Debug Blocker
自我创建技术(以子进程形式运行自身进程)的演进形式。自我创建技术中,子进程负责执行实际源代码,父进程负责负责创建子进程,修改内存(代码/数据),更改EP位置等。
仅仅调试父进程将无法转到OEP代码处,但调试时若用附加命令将子进程附加到调试器,这种反调试手法将会失效。
优点:
- 防止代码调试,因子进程运行实际的原代码已经处于调试中,原则上就无法再使用其它调试器进行附加操作了(后面会讲,但我还没学)
- 能够控制子进程(Debuggee,被调试者)。调试器-被调试者关系中,调试器具有很大权限,可以处理被调试进程的异常,控制代码执行流程等。
常规的SEH技术中,异常处理器代码位于相同的进程内存空间;但Debug Blocker技术中,(处理被调试进程所发生异常的)异常处理器代码位于调试进程(请注意,对于被调试进程所发的异常,调试器拥有优先处理权),为了调试子程序,必须先断开与已有的调试器的连接,但这样子程序又无法正常运行。。
补充:
Nanomite技术由Debug Blocker 技术发展而来,该技术会查找被调试进程内部的代码,将所有跳转指令(Jcc指令)修改为INT3(0xCC)指令,或其它触发异常的代码。并且,调试器内部由表格,含有被修改的Jcc指令的实际地址位置以及要跳转的地址。执行被调试者内部修改后的指令就会触发异常,控制权即被转交给调试器。调试器通过发送异常的地址从(自身持有的)表格中获取要跳转的地址,然后通知被调试者。
破解方法就是:通过写脚本(目前不会)。如果手动改的话,我感觉心态会崩。
反调试技术系列:
静态反调试技术(1)https://blog.csdn.net/CSNN2019/article/details/113105292
静态反调试技术(2)https://blog.csdn.net/CSNN2019/article/details/113147820
静态反调试技术(3)https://blog.csdn.net/CSNN2019/article/details/113178232
动态反调试技术 https://blog.csdn.net/CSNN2019/article/details/113181558
高级反调试技术 https://blog.csdn.net/CSNN2019/article/details/113263215