• 反调试:检测进程名


    基于文件名的反调试:发现改了名字之后再载入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结束进程。
    
  • 相关阅读:
    (七)android开发中两种方式监听短信的原理和实现
    (三)android中Toast的使用
    (二)、Android ListView滑动过程中图片显示重复错位闪烁问题解决
    (一)PagerAdapter、FragmentPagerAdapter、FragmentStatePagerAdapter的区别
    (六)Android中使用CountDownTimer实现倒计时功能
    (五)在android 4.4上设置手机状态栏的背景
    (四)使用PagerSlidingTabStrip和ViewPager实现可左右滑动和点击效果功能
    devexpress表格gridcontrol实现列统计,总计,平均,求和等。
    常用GDB命令行调试命令
    新浪微博SSO授权后回调客户端没有执行sinaweiboDidLogIn&无法返回应用
  • 原文地址:https://www.cnblogs.com/zpchcbd/p/12076595.html
Copyright © 2020-2023  润新知