精华内容
下载资源
问答
  • 今天小编就为大家分享一篇关于易语言实现反OD调试反复附加的代码,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
  • 反反调试OD

    2018-06-21 14:08:30
    反反调试工具,这一款工具能过掉很多的VMP加密壳,TMD壳 解压密码:1
  • 我们要研究他们这些安全软件如何反调试的 比如软件发现被OD打开,直接自爆。。。 开始 第一个程序 F8运行程序 找到了弹出反调试报错的call F7 程序调用了 IsDebuggerPresent 函...

    病毒、木马、外挂等必须要有的 “安全工作”

    因为你一个安全软件一旦被成功调试了,就等同于被调戏了,一切主要操作顺序都被人掌握了,只要开发出逆向的突破即可。

    我们要研究他们这些安全软件如何反调试的

    比如软件发现被OD打开,直接自爆。。。

    开始

     

     

    第一个程序

    F8运行程序

    找到了弹出反调试报错的call

     F7

    程序调用了 IsDebuggerPresent 函数

    IsDebuggerPresent :是确定调用进程是否由用户模式的调试器调试。

    修改跳转Z,将指令改为nop不让他跳转就OK了

     

    第二个程序

    程序在OD中运行,什么也没有

    这次直接跳转到了错误的位置,我们nop跳转就OK了

     

    第三个程序

    遇到被调试,直接退出进程,我们也可以nop到跳转

     

    第四个程序

    运行 ,程序选择和你同归于尽,大家一起死

    程序直接跳转到00000001 ,同样改跳转为nop

     

     

    高级

    探讨程序使怎么做到反调试的

    F8这行指令直接就错误了,此call为win32API创建模式对话框

    alt+F9也回不去用户领空了,

    DialogBoxParanA的第二个参数为过程函数,就是我们自己编写要做的事

    找到函数地址,下断点

    call处再次报错,下图

    进入call

    研究反调试过程

    1. CreateToolhelp32Snapshot:可以通过获取进程信息为指定的进程、进程使用的堆[HEAP]、模块[MODULE]、线程建立一个快照。(所有进程拍照),返回句柄

    2. Process32First:是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用process32First函数来获得第一个进程的句柄。

    3. 将进程名称和我们打开的OD进行字符串对比

    4. Process32Next:是一个进程获取函数,当我们利用函数CreateToolhelp32Snapshot()获得当前运行进程的快照后,我们可以利用Process32Next函数来获得下一个进程的句柄。

    5. 循环比较进程名称

    6. 如果有OD就跳转退出程序,自爆。

     

     

     

    展开全文
  • OD反调试

    2017-06-30 15:28:18
  • 防止od调试

    2019-02-19 17:34:56
    互相学习使用,这个模块是我暂时所收集到的反od的方法
  • 标 题: 【原创】hook api 反OD调试的一种思路作 者: 蓝云时 间: 2007-07-23,15:32链 接: http://bbs.pediy.com/showthread.php?t=48413hook api 反OD调试的一种思路by胡华本程序在backer的耐心指导下完成,非常感谢...

    标 题: 【原创】hook api 反OD调试的一种思路
    作 者: 蓝云
    时 间: 2007-07-23,15:32
    链 接: http://bbs.pediy.com/showthread.php?t=48413

    hook api 反OD调试的一种思路
    by胡华

    本程序在backer的耐心指导下完成,非常感谢backer的帮助!!!
    关于OD怎样在程序中下断点相信大家都知道,就是用WriteProcessMemory函数在要下断点的地方写入0xCC,也就是int 3的中断,
    如果我们挂钩OD的WriteProcessMemory函数不让它下断点是不是就可以让OD不能正常跟踪了呢?有了这个思路,下面就是实践了。

    首先得解决几个问题:
    1.我们的目标是最好在OD正常加载本程序后就已经被hook,怎么解决?

    这个问题其实很简单,我们知道全局类的初始化工作在main函数之前,OD正常加载后会停在WinMain函数处,如果把hook api 代
    码放在一个全局类的构造函数中就可以了,呵呵,就这么简单。


    2.要得到OD的输入表中的WriteProcessMemory函数的跳转地址

    呵呵,用OD来调试OD不就很容易得到了么?
    用OD调试OD后我们得到WriteProcessMemory函数的跳转地址放在0x0050D450这个地方。

    3.如果前面的两个问题解决,现在剩下的就是程序在运行期间要判断自己的父进程是否是OD,如果是OD那么就可以肯定被OD加载,
    问题是怎么方便的取得父进程?如果用列取进程列表的方式来获的父进程,这比较麻烦,但是的确是一种思路。我们不采取这种
    思路,其实在ntdll.dll中有一个函数可以得到父进程,下面用代码来说话吧:

    NTDLL.DLL中有一个函数叫NtQueryInformationProcess,用它可以将指定类型的进程信息拷贝到某个缓冲。其原型如下:
    NTSYSAPI
    NTSTATUS
    NTAPI
    NtQueryInformationProcess (
    IN HANDLE ProcessHandle, // 进程句柄
    IN PROCESSINFOCLASS InformationClass, // 信息类型
    OUT PVOID ProcessInformation, // 缓冲指针
    IN ULONG ProcessInformationLength, // 以字节为单位的缓冲大小
    OUT PULONG ReturnLength OPTIONAL // 写入缓冲的字节数
    );
         第一个参数是希望操作的进程句柄,这个句柄必须以PROCESS_QUERY_INFORMATION模式存取。为了取得一个句柄,我们必须用
    OpenProcess函数:
    HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID);
         第二个参数是请求信息的类型,这个参数可以有许多个值,本文例子中将用ProcessBasicInformation (值为0)。
         因此,如果第二个参数是ProcessBasicInformation的话,则第三个参数必须为一个指针指向结构PROCESS_BASIC_INFORMATION:
    typedef struct
    {
           DWORD ExitStatus; // 接收进程终止状态
           DWORD PebBaseAddress; // 接收进程环境块地址
           DWORD AffinityMask; // 接收进程关联掩码
           DWORD BasePriority; // 接收进程的优先级类
           ULONG UniqueProcessId; // 接收进程ID
           ULONG InheritedFromUniqueProcessId; //接收父进程ID
    } PROCESS_BASIC_INFORMATION;

       这个结构的最后一个参数是InheritedFromUniqueProcessId,它就是我们所要的东西。

    得到了父进程id之后,呵呵,现在开始打开进程了
             DWORD dwId=GetCurrentProcessId();
       DWORD dwParentId;
             dwParentId=GetParentProcessID(dwId); //获取父进程id
       hParentProcess=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwParentId);
    又有一个问题怎么判断是否是OD呢?
    我们可以用读取内存的方式查看某一段代码是不是OD的就行了,要检查哪段代码那就随你了,
    我这里是读取OD的0x00401000开始的几个字节。
    更简单的方法是读取0x0050D450这个地址判断是不是WriteProcessMemory这个函数的真实跳转地址,如果是那就基本可以断定是OD了,呵呵,不会那么巧其它的有的程序也会是这个地址吧!

    判断是OD后,现在要做的就是在OD中申请一段空间把要执行的代码写在这个地址了
    BYTE bRet=0xC3; //这是hook api后转到这要执行的代码
    LPVOID lpWriteFunAddress=(void*)0x0050D450;
    LPVOID lpNewWriteFunAddress=NULL;
    lpNewWriteFunAddress=VirtualAllocEx(hParentProcess,NULL,sizeof(bRet),MEM_COMMIT,PAGE_READWRITE);
    //插入函数返回代码
    if(lpNewWriteFunAddress==NULL)
    {
        MessageBox(NULL,"virtualalloc err","error",MB_OK);
          
    }
    if(WriteProcessMemory(hParentProcess, lpNewWriteFunAddress, &bRet, sizeof(bRet), NULL)==0)
    {
       MessageBox(NULL,"insert retn err","error",MB_OK);      
    }
    写入后现在就是把0x0050D450这个地址的WriteProcessMemory函数的真实跳转地址改为我们上面申请的地址了:
            //改变api地址
        
       DWORD flOldProtect;
       VirtualProtect(lpWriteFunAddress,sizeof                (lpWriteFunAddress),PAGE_READWRITE,&flOldProtect);
       if(WriteProcessMemory(hParentProcess, lpWriteFunAddress, &lpNewWriteFunAddress,                                                 sizeof(lpNewWriteFunAddress), NULL)==0)
       {
            MessageBox(NULL,"insert fun addr err","error",MB_OK);
          
       }

    不知道大家注意没,我插入的要执行的代码只有一个字节BYTE bRet=0xC3,
    其实就是ret,呵呵,知道了吧,只要在OD中按F2下断点就会执行WriteProcessMemory这个函数,而这个函数现在是什么都不做就直接返 回了,也不用考虑堆栈平衡,我们要的就是OD悄无声息的挂掉!如果想忽悠一下而不让OD挂掉,那就用ret14了,大家尽情的发挥吧!!!

    好了,到这里已经结束了,再次感谢backer的指导!!!

    展开全文
  • sysenter HOOK反OD调试

    千次阅读 2016-05-12 20:01:08
    OD载入程序时会在目标地址写入0xCC(int 3)断点,只要我们HOOK掉WriteProcessMemory这个API即可防止OD下断点。 我这里是将任何程序使用WriteProcessMemory这个API来写CC断点都会拒绝。 先放一下图片 ...

    sysenter指令:

    SYSENTER用来快速调用一个0层的系统过程。SYSENTER是SYSEXIT的同伴指令。该指令经过了优化,它可以使将由用户代码(运行在3层)向操作系统或执行程序(运行在0层)发起的系统调用发挥最大的性能。

     

    在调用SYSENTER指令前,软件必须通过下面的MSR寄存器,指定0层的代码段和代码指针,0层的堆栈段和堆栈指针:

    1.       IA32_SYSENTER_CS:一个32位值。低16位是0层的代码段的选择子。该值同时用来计算0层的堆栈的选择子。

    2.       IA32_SYSENTER_EIP:包含一个32位的0层的代码指针,指向第一条指令。

    3.       IA32_SYSENTER_ESP:包含一个32位的0层的堆栈指针。

     

    MSR寄存器可以通过指令RDMSR/WRMSR来进行读写。寄存器地址如下表。这些地址值在以后的intel 64和IA32处理器中是固定不变的。

    MSR

    地址

    IA32_SYSENTER_CS

    174H

    IA32_SYSENTER_ESP

    175H

    IA32_SYSENTER_EIP

    176H

     

    当执行SYSENTER,处理器会做下面的动作:

    1.       从IA32_SYSENTER_CS从取出段选择子加载到CS中。

    2.       从IA32_SYSENTER_EIP取出指令指针放到EIP中

    3.       将IA32_SYSENTER_CS的值加上8,将其结果加载到SS中。

    4.       从IA32_SYSENTER_ESP取出堆栈指针放到ESP寄存器中

    5.       切换到0层。

    6.       若EFLAGS中VM标志已被置,则清除VM标志。

    7.       开始执行选择的系统过程。

     

    处理器不保存返回地址和调用过程的其他状态信息。

     

    SYSENTER指令总是转移到DPL为0的保护模式下的代码段。这条指令需要操作系统首先满足下面的条件:

    1.       选择的系统代码段必须是一个平坦的、32位最大为4G的代码段。此段必须是可执行的、可读、已存取、非一致的。

    2.       选择的系统堆栈段必须是一个平坦的、32位最大为4G的数据段。此段必须可读写、已存取、可向上扩展。

     

    SYSENTER可在除实地址模式外所有其他模式下执行。

     

    SYSENTER和SYSEXIT是同伴指令,但是它们并不像CALL/RET指令对。当执行SYSENTER时,处理器并不会为用户代码保存状态信息。而且无论是SYSENTER还是SYSEXIT都不能通过堆栈传递参数。

     

    为了能通过SYSENTER/SYSEXIT指令,使控制在3层用户代码和0层操作系统代码之间相互转移,必须满足下面的条件:

    1.       0层的代码段和0层堆栈段段以及3层的代码段和3层堆栈段在GDT中必须连续。这样就可以使处理器能从从SYSENTER_CS_MSR的值计算出其他的选择子的值了。

     

    2.       .若要返回调用过程,由用户代码执行的快速系统调用“桩”(STUB)例程(通常在共享库或DLL中)必须保存返回地址以及处理器的状态信息;当要返回至用户代码时,操作系统或者由SYSENTER调用的执行程序必须使用这些保存的地址和状态信息。

     

    SYSENTER和SYSEXIT指令是从Pentium II开始新加入到IA32位架构中来的。这两个指令在处理器上是否有效要看CPUID指令返回的EDX寄存器中SEP标记(SYSENTER/SYSEXIT存在标记)是否置上。操作系统若要检查SEP标记必须要同时检查处理器族(family)和型号(model),这样才能确保结果的准确性。例如:

     

    IF (CPUID SEP bit is set)

    IF (Family == 6) AND (Model < 3) AND (Stepping < 3)

    THEN

    Fast System Call NOT supported

    FI;

    ELSE Fast System Call is supported

    FI

     

    当CPUID指令在Penitum Pro(Model 1)上执行,虽然返回的SEP标志是置上的,但该处理器还是不支持SYSENTER/SYSEXIT指令的。

    实现方法:

    OD载入程序时会在目标地址写入0xCC(int 3)断点,只要我们HOOK掉WriteProcessMemory这个API即可防止OD下断点。

    我这里是将任何程序使用WriteProcessMemory这个API来写CC断点都会拒绝。

    先放一下图片


    可以看到,OD载入这个程序时这个被载入的程序直接跑了起来,并没有被OD断下。

    有的时候即使OD成功断下,但是设置断点的时候:


    代码写的很烂,大神勿喷!

    IDE:RadASM

    编译器:MASM

    操作系统:WINDOWS XP 32位

    .686p
    .model flat, stdcall
    option casemap:none
    include SysenterHook.inc
    .data
    	szHello		db	'Alg & Sec lab of China [254394017]',0
    	szHello_	db	'By:yeeeee QQ:2308902347',0
    	szErr		db	'OllyDbg'
    .data?
    	MSR_EIP		dd	?
    	CallNumber	dd	?
    .code
    
    MyKiFastCallEntry proc
    	mov CallNumber,eax
    	xor CallNumber,115h
    	.if CallNumber!=0
    		jmp NEXT
    	.else
    		mov eax,dword ptr ds:[edx+16]
    		mov eax,dword ptr ds:[eax]
    		xor eax,0CCh
    		.if eax==0
    			pushad
    			mov ebx,dword ptr ds:[edx+16]
    			sub ebx,4
    			mov dword ptr ds:[edx+12],ebx
    			invoke DbgPrint,addr szErr
    			popad
    		.endif
    		mov eax,115h
    	.endif
    NEXT:
    	jmp MSR_EIP ;Jump to KiFastCallEntry
    	ret
    MyKiFastCallEntry endp
    UnloadDriver proc pDriverObject:PDRIVER_OBJECT
    	mov ecx,176h
    	mov eax,MSR_EIP
    	xor edx,edx
    	wrmsr ;sysenter UnHook
    	xor eax,eax
    	ret
    UnloadDriver endp
    DriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING
    	invoke DbgPrint,addr szHello
    	invoke DbgPrint,addr szHello_
    	mov ecx,176h
    	rdmsr ;Read the IA32_SYSENTER_EIP register
    	mov MSR_EIP,eax ;Same the IA32_SYSENTER_EIP register
    	jmp Entry
    Entry:
    	mov ecx,176h
    	xor edx,edx
    	mov eax,MyKiFastCallEntry
    	wrmsr ;sysenter Hook
    	xor eax,eax
    	ret
    DriverEntry endp
    end DriverEntry
    

    SysenterHook.inc代码:

    include w2k\ntstatus.inc
    include w2k\ntddk.inc
    include w2k\ntoskrnl.inc 
    includelib D:\aRadASM\masm32\lib\w2k\ntoskrnl.lib 
    




    展开全文
  • od反调试的对策(使用除0异常)

    千次阅读 2015-11-30 15:29:54
    除0指令的二进制为: BF 00 00 00 00 99 F7 FF MOV edi 0 cdq idiv edi ...使用od修改内存指令,程序执行到这里会异常退出 或者使用int 3指令 CC int 3
  • 一、OD 附加进程、 二、OD 调试器面板简介 ( 汇编窗口 | 寄存器窗口 | 数据窗口 | 堆栈窗口 )
  • 反调试插件

    2018-09-24 19:05:27
    强大的反调试插件,使用插件后能躲过很多程序的检测!
  • od反调试技术

    2017-08-16 03:12:45
    od不能调试来看看吧
  • 纯源码实现用易语言实现,检测OD附加,运行环境检测,相关进行处理和判断。
  • 它hook用户模式(ring3)中的各种函数以隐藏调试。 此工具旨在保留在用户模式(ring3)中。 如果您需要内核模式(ring0)Anti-Anti-Debug,请参阅TitanHide。 ScyllaHide在用户模式中尽可能隐蔽,目标是不干扰任何...
  • OD StrongOD是ollydbg调试器的强大插件,它可以抵抗各种调试器检测技术。 这是StrongOD驱动程序的源代码,我几年前已将其反转,有关更多信息,请访问: : 。 原谅我不是很好的编码风格。 实际上,您可以将此...
  • 源码用了6种检测方法,内存分配反调试,子窗口反调试,时间差反调试,启动信息反调试,时间间隔反调试,检测调试反调试
  • 这个反调试具有很好的防止OD等动态调试器对 VB软件的调试。是依据OD调试器原理进行设计的反调试功能,其中包括隐藏字符串等技术。防止单步调试等技术等 csdn下载地址 ... ...
  • OD调试工具

    2015-01-06 22:18:58
    OD 吾爱破解版 调试破解必备工具,很稳定,用过的都说好~
  • 反调试技术(以OD为例附核心原代码),word文档,实例简单易懂,里面包括7个短实例,
  • 最新易语言反调试跟踪最新易语言反调试跟踪最新易语言反调试跟踪最新易语言反调试跟踪最新易语言反调试跟踪最新易语言反调试跟踪最新易语言反调试跟踪最新易语言反调试跟踪最新易语言反调试跟踪最新易语言反调试跟踪...
  • 看雪论坛版的OD调试工具

    热门讨论 2011-03-20 03:50:24
    看雪论坛打造的一款OD工具,用来一段时间,感觉确实还蛮不错的,个人感觉比郁金香版的要好一点,因为这款的检测能力比郁金香版的却是要好很多,另外里面我还添加了一些常用工具
  • TLS反调试 反反调试

    2021-07-19 18:47:05
  • 易语言检测OD模块源码,检测OD模块,空虚_是否被调试,空虚_驱动检测OD,空虚_菜单检测OD,空虚_蓝屏,启动信息反调试,操作_取路径目录,文件是否运行中,枚举驱动,检测fengyue区段,文件_枚举,枚举窗口_强力,窗口取类名,窗口...
  • 这些珍贵的VB代码不多,全部是原创的。可以强力保护软件被人调试分析,比如OD在这个软件上就无法调试,包括其他调试器,从原理上封调试器。
  • OD跟踪调试与技巧(外挂编),好东西不断有,我也正在学习OD内挂
  • 文章目录个人理解静态反调试PEBTEB原始API攻击调试器打开进程检查TLS回调函数使用普通API动态反调试使用SEH时间检查单步检查补丁检查反反汇编偷取代码分页保护壳虚拟机 个人理解   2019.6.19 在汇编面前没有任何...
  • IDA反调试反反调试

    千次阅读 2020-05-15 21:14:18
    IDA在动态调试os文件的时候经常遇到在步进的时候或者是在启动的时候直接崩掉 一,端口检测: IDA调试端口检测 原理: 调试器远程调试时,会占用一些固定的端口号。 做法: 读取/proc/net/tcp,查找IDA远程调试所用的...
  • 我们选择Whole line拷贝整行,Whole Table可以拷贝整个列表的断点信息。 Breakpoints, item 0 ...接下来我们来了解一下当设置一个断点以后,OD调试器在底层二进制代码是如何将程序中断的,会发生什么变化。 单击鼠标
  • OLLYDBG是一个新的动态追踪工具,将IDA与SoftICE结合起来的思想,Ring 3级调试器,非常容易上手,己代替SoftICE成为当今最为流行的调试解密工具了。同时还支持插件扩展功能,是目前最强大的调试工具。
  • reverse_OD调试基础

    2020-11-02 21:44:25
    OllyDbg(简称OD)是一个 32 位动态调试器,用在逆向分析方面比较多; 下面以 bugku 中 Eazy-Re 作为例子来学习OllyDbg 的简单应用; 首先打开程序,先看一下这个程序的主要是干什么,方便下一步分析: 它提示输入...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,222
精华内容 1,688
关键字:

反od调试