zoukankan      html  css  js  c++  java
  • 反调试:检测进程名

    基于文件名的反调试:发现改了名字之后再载入OD就不会进行反调试的操作了

    GetProcAddress 获取隐藏的函数地址间接调用


    反调试的过程:

    1、载入OD,进行GetProcAddress这个windows api函数下CC断点,然后进行多次F9运行,直到获取到EnumProcesses该windows api函数然后执行到返回

    2、然后对接下来的获取到的三个主要的api函数进行断点,EnumProcesses,EnumProcessModules,GetModuleBaseNameA,依次如上操作

    EnumProcesses:枚举进程的PID
    EnumProcessModules:获取进程的基址
    GetModuleBaseNameA:得到进程的名字

    3、接下来的F9运行就是反复的进行判断,流程:枚举进程的所有的PID->获取当前进程的句柄->获取当前进程的名字->比较是否为OD的名称->是的话则关闭,不是的话就下一个继续比较直到比较完所有的,再次执行到EnumProcesses,然后堆栈窗口进行跟随,找到当前OD的PID转换的十六进制数

    4、然后对当前的十六进制数进行设置内存访问,继续跟踪,来到如下,0D4C是自己的OD的PID转换为十六进制的数值

    5、来到如下,OpenProcess windows api函数是用来获取当前进程的句柄,相当于得到控制权

    6、OpenProcess获取到的句柄值返回到eax中,句柄窗口中同样也可以发现

    7、继续F9,执行到返回,来到EnumProcessModules结束的retn,跟随数据,这个00400000就是当前进程的基址

    8、继续F9,来到GetModuleBaseNameA,执行到返回,来到GetModuleBaseNameA结束的retn,跟随数据窗口,获取到进程的名字

    9、走出当前call,F8,就来到了关闭句柄的函数CloseHandle

    10、最后TerminateProcess 直接结束进程

    SharkHeng老师的总结:

    因为可疑函数被隐藏,或者说在函数列表中未找到可疑函数。
    所以,我们利用GetProcAddress,捕捉他是否间接加载调用其他隐藏函数。
    
    GetProcAddress获取
    EnumProcesses
    EnumProcessesModules
    GetModuleBaseNameA
    这3个函数所在的地址(调用处,或者说是段首)
    
    然后利用EnumProcesses获取当前所有进程PID
    然后通过PID,利用OpenProcess获取当前参数PID的句柄。
    然后通过句柄,利用EnumProcessesModules获取当前参数句柄模块基址。
    然后通过句柄和模块基址,利用GetModuleBaseNameA获取当前符合两参数的模块名称。(或者叫做进程名)
    然后通过进程名与指定字符串进行比较。
    如果相等,通过PID,利用OpenProcess获取当前参数PID的句柄。
    然后,利用句柄,通过TerminateProcess结束进程。
    
  • 相关阅读:
    Katta:基于Lucene可伸缩分布式实时搜索方案
    cnprog
    Eclipse开发struts完全指南(二)安装与配置
    MYSQL 数据库导入导出命令
    ubuntuapache下隐藏thinkphp入口文件index.php
    PHP过滤指定字符串,过滤危险字符
    // 关闭调试模式  define('APP_DEBUG', false);
    Javascript读书笔记(1):从零开始
    Facebook messages实现解读
    《推荐系统实践》
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12076595.html
Copyright © 2011-2022 走看看