乐于分享
好东西不私藏

APP整体加固原理

APP整体加固原理

之前,我们完成了一个简单的整体加固 Demo 以及自动化加壳工具,也通过 Android 源码分析了 mClassLoader的重要性。但回过头来看,这两个话题之间其实存在一段逻辑上的跳跃:我们知道了要这么做,也知道了必须这么做,却还没有系统地理解为什么这么做能生效

仔细想想其实跳过了几个基础但是比较重要的问题:

  • mClassLoader 到底是什么?
     它是 PathClassLoader 还是 DexClassLoader?它的内部结构长什么样?
  • 为什么系统要通过它来找类?
     它的查找规则是什么?为什么我们自己 new 一个 DexClassLoader 加载 dex,系统却不认?
  • 除了替换 mClassLoader,还有没有别的方案?
网上说的"热修复"跟加固本质上是不是一回事?

这些问题导致我对整个加固逻辑只是一知半解,偶然间发现了一些资源课程帮我解决了这一部分的问题,遂写下这篇文章记录下来,希望会有所帮助。

一、类加载器

什么是类加载器

类加载器(ClassLoader)是Java/Android虚拟机中负责加载类的组件。这里以Android为例,dex文件本身只是存放类字节码的文件。把一个dex文件复制到App私有目录之后,系统并不会自动识别里面有哪些类,也不会自动将这些类变成可以直接使用的Java对象。

ClassLoader的作用就是告诉虚拟机:应该到哪些dex / apk / jar文件里去找类。

当使用DexClassLoader加载一个外部dex的时候,本质上就是给虚拟机新增了一条类的搜索路径。在加载类的时候,ClassLoader会沿着查找规则,在这些dex路径当中找到对应类的字节码,并且把它定义成运行时的Class对象。

几个重要的成员结构

Android类加载器当中有几个比较重要的成员,对于动态加载及整体加固非常重要,分别有下面几个:

  • DexFile:是Dex文件在运行时的封装,对于类加载器来说,类加载器最终会通过它从dex中查找并加载目标类;对于开发者来说,可以通过这个结构获取到类名列表,dex文件路径,native层的dex句柄;

  • dexElements:是Element类的数组,其中Element这个类包含了DexFile,这个数组决定了类加载器要到哪里找类,以及查找类的顺序;

  • PathListPathList是Android类加载器内部用来保存搜索路径的成员,其中又包含了dexElements这个成员,是BaseDexClassLoader这个类的成员。

这几个成员的包含关系如下:

BaseDexClassLoader-> PathList : DexPathList-> dexElements : Element[]-> dexFile : DexFile

验证:通过反射获取Dex类名列表

了解成员结构之后,我们可以写一段代码来验证一下——将某个类加载器当前搜索路径下所有的类打印出来。这样能更直观地看到 ClassLoader 内部到底"管着"哪些类。

首先看一下 Android 源码中是怎么获取类名列表的:

在Android源码当中使用的是一个getClassNameList的方法来获取类名列表,那么我们也可以通过反射来调用这个方法来获取类名列表。

在得知几个成员关系的情况下,这个大致的方案如下:

  1. 首先需要通过反射来获取某个类加载器pathList
  2. 使用反射获取pathList中的dexElements
  3. 遍历dexElements数组,获取每个项中的dexFile ,然后通过反射调用dexFile中的getClassNameList方法来获取类名列表

代码实现如下:

publicstaticvoidprintClassLoaderClasses(ClassLoader classLoader){    myLogD("classLoader -> " + classLoader);try{// 获取pathlistClassbasedexclassLoader= classLoader.loadClass("dalvik.system.BaseDexClassLoader");Fieldpathlistfield= basedexclassLoader.getDeclaredField("pathList");        pathlistfield.setAccessible(true);Objectpathlistobj= pathlistfield.get(classLoader);// 获取dexElementsClassdexpathlistClass= classLoader.loadClass("dalvik.system.DexPathList");FielddexElementsfield= dexpathlistClass.getDeclaredField("dexElements");        dexElementsfield.setAccessible(true);        Object[] dexElementsobj = (Object[]) dexElementsfield.get(pathlistobj);// 获取dexFileClasselementClass= classLoader.loadClass("dalvik.system.DexPathList$Element");FielddexfileField= elementClass.getDeclaredField("dexFile");        dexfileField.setAccessible(true);// mCookie fieldClassdexfileClass= classLoader.loadClass("dalvik.system.DexFile");FieldmCookiefield= dexfileClass.getDeclaredField("mCookie");        mCookiefield.setAccessible(true);// 获取method        Method[] methods = dexfileClass.getDeclaredMethods();MethodgetClassNameListmethod=null;for(Method method : methods){if(method.getName().equals("getClassNameList")){                getClassNameListmethod = method;                getClassNameListmethod.setAccessible(true);break;            }        }for(Object element : dexElementsobj){Objectdexfileobj= dexfileField.get(element);ObjectmCookieobj= mCookiefield.get(dexfileobj);            String[] classlist = (String[]) getClassNameListmethod.invoke(dexfileobj, mCookieobj);for(String className : classlist){                myLogI("classname : " + className);            }        }    } catch (NoSuchFieldException e) {thrownewRuntimeException(e);    } catch (ClassNotFoundException e) {thrownewRuntimeException(e);    } catch (IllegalAccessException e) {thrownewRuntimeException(e);    } catch (InvocationTargetException e) {thrownewRuntimeException(e);    }}

效果演示:

通过这种方法就能够将类加载器搜索路径中所有的dex/apk/jar文件包含的类打印出来。也就是说通过这个方式能够找到某个ClassLoader当前能够搜索到的类。

类加载器的类型

JVM 中类加载器分为 Bootstrap → Extension → Application 三层,Android 在此基础上做了简化和适配,形成了自己的一套类加载器体系:

Android 类加载器

  • ClassLoader
    是一个抽象类,定义了ClassLoader的主要功能
  • BootClassLoader
    继承自ClassLoader,用于Android系统启动时预加载常用类.
  • SecureClassLoader
    继承了ClassLoader,但并不是实现类,而是拓展并加入了权限管理功能,增强安全性
  • URLClassLoader
    通过URL路径从jar文件和文件夹中加载类和资源
  • BaseDexClassLoader
    继承自ClassLoader,是抽象类ClassLoader的具体实现类.
  • InMemoryDexClassLoader
    Android8.0新增,继承自BaseDexClassLoader,用于加载内存中的dex文件。
  • PathClassLoader
    继承自BaseDexClassLoader,用于加载已安装的apk的dex文件.
  • DexClassLoader
    继承自BaseDexClassLoader,用于加载已安装的apkdex文件,以及从SD卡中加载未安装的apkdex文件.

搞清楚了类加载器是什么、内部长什么样,下一个问题就是:当系统要找某个类的时候,到底按照什么规则在多个 ClassLoader 之间查找? 这就涉及到双亲委派机制了。

二、双亲委派机制

什么是双亲委派

双亲委派是类加载器(classLoader)加载类时的一种查找规则。这里使用JVM当中的双亲委派图进行解析,这个查找规则大致如下:

  • 先判断这个Class是否已经被加载,如果没有则先委派给父类加载器查找,并依次递归到顶层的类加载器
  • 如果顶层类加载器找到了,则返回该Class,否则依次往下查找
  • 如果所有父加载器都没找到Class则自己进行查找,如果仍查找失败则抛出classNotFound异常

这里配合Android源码来阅读能更快理解这个过程,这里找到loadClass的源码:

protected Class<?> loadClass(String name, boolean resolve)throws ClassNotFoundException {// 1. 先检查当前 ClassLoader 是否已经加载过这个类    Class<?> c = findLoadedClass(name);if (c == null) {// 2. 如果没有加载过,先交给父类加载器加载try {if (parent != null) {                c = parent.loadClass(name, false);            } else {// 3. 如果没有父加载器,就交给 BootstrapClassLoader                c = findBootstrapClassOrNull(name);            }        } catch (ClassNotFoundException e) {// 父加载器找不到时,不直接抛出// 而是继续让当前 ClassLoader 自己找        }// 4. 父加载器也找不到,当前 ClassLoader 才调用 findClass 自己查找if (c == null) {            c = findClass(name);        }    }// 5. 返回最终找到的 Class 对象return c;}

双亲委派机制的优点:

  • 避免重复加载,如果已经加载过一次Class,可以直接读取已经加载的Class
  • 提高安全性,无法使用自定义类来替换系统类,可以防止核心API库被随意篡改。

通过代码打印ClassLoader委派链

java当中也提供了API来获取ClassLoader委派的父ClassLoader,这里可以通过代码来打印一下委派的关系链:

public static void printClassLoaderHierarchy(ClassLoader currentClassloader){int level = 0;    StringBuffer sb = new StringBuffer();    while(currentClassloader != null){for(int i = 0;i < level; i++){            sb.append("    ");        }        sb.append("[")                .append(level)                .append("] ")                .append(currentClassloader.getClass().getName())                .append(" -> ")                .append(currentClassloader)                .append("\n");        currentClassloader = currentClassloader.getParent();        level++;    }    myLogD(sb.toString());}

效果展示:

通过这个方法能够很清楚的看到委派链是:PathClassLoader->BootClassLoader

这个位于委派链最前端的 PathClassLoader,其实就是前两篇文章中反复出现的 mClassLoader——App 进程中默认的类加载器。系统所有 "找类" 的操作都从它开始,然后沿着委派链逐级向上委托。理解了这一点,就能明白为什么加固必须对它下手:我们自己创建的 DexClassLoader 不在这个委派链上,系统根本不会去问它。 接下来我们通过实战来验证这个问题。

三、动态加载Dex

mClassLoader 在源码中的位置

简单回顾一下:mClassLoader 这个默认类加载器存储在 LoadedApk 中,而 LoadedApk 又存放在 ActivityThread 的 mPackages 这个 ArrayMap 成员里:

mPackages 以包名为键,对应的值是一个 WeakReference,引用的就是 LoadedApk——它包含了 mClassLoader 这个默认类加载器。

也就是说,要修改 mClassLoader,需要先通过反射拿到 ActivityThread,再获取 LoadedApk,最后修改其中的 mClassLoader 字段。ActivityThread 可以通过反射调用其静态方法 currentActivityThread 直接获取。

测试环境准备

这里重新创建一个新的项目,包括普通类,以及一个继承activity的组件类:

  • TestClass

    publicclassTestClass {publicstaticvoidtestfunc(){        Log.i("[testLoaded]","[com.example.test01.TestClass] testfunc is calling...");    }}
  • TestActivity

    publicclassTestActivityextendsActivity {@OverrideprotectedvoidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);        Log.i("[testLoaded]","[com.example.test01.TestActivity] onCreate is calling...");    }}

由于高版本的Android无法读sdcard的内容,这里为了方便加载期间,build之后将相关的dex文件丢到测试项目的assets目录当中:

并且还需要封装一个从assets目录当中,使用dexClassLoader加载dex的方法:

privatestatic ClassLoader loadDexFromAssest(Context context, String dexName, ClassLoader parentClassLoader){FiledexFile=newFile(context.getFilesDir(),dexName);if(!dexFile.exists()){try(InputStreamis= context.getAssets().open(dexName); FileOutputStreamfos=newFileOutputStream(dexFile)){byte[] buffer = newbyte[4096];int len;while((len = is.read(buffer)) != -1){                fos.write(buffer, 0, len);            }        } catch (FileNotFoundException e) {thrownewRuntimeException(e);        } catch (IOException e) {thrownewRuntimeException(e);        }    }FileoptimizedDir= context.getCodeCacheDir();returnnewDexClassLoader(dexFile.getAbsolutePath(),            optimizedDir.getAbsolutePath(),null,            parentClassLoader);}

此外为了让当前项目能够启动这个TestActivity,还需要在Manifest清单文件当中的<activity>标签当中加上这个:

<activityandroid:name="com.example.test01.TestActivity"></activity>

动态加载普通类

首先动态加载一下TestClass这个普通的类,然后通过反射调用一下这个类当中的testfunc函数,代码如下:

publicstaticvoidloadedNomalClass(Context context){    ClassLoader pathClassloader = MainActivity.class.getClassLoader();    dexclassloader = loadDexFromAssest(context, "test.dex", pathClassloader);try{        Class testClass = dexclassloader.loadClass("com.example.test01.TestClass");        Method testfunc = testClass.getDeclaredMethod("testfunc");        testfunc.setAccessible(true);        testfunc.invoke(null);    } catch (ClassNotFoundException e) {thrownewRuntimeException(e);    } catch (InvocationTargetException e) {thrownewRuntimeException(e);    } catch (NoSuchMethodException e) {thrownewRuntimeException(e);    } catch (IllegalAccessException e) {thrownewRuntimeException(e);    }}

可以看到这里成功执行了这个testfunc,没有任何异常。

动态加载组件

动态加载组件类的问题

了解了动态加载dex,并且使用反射调用内部方法的手法后。接着来看看如果仅仅使用上面的步骤来动态加载组件,并启动组件的话会出现什么问题。

publicstaticvoidstartActivityFirstMethod(Context context){ClassLoaderpathClassloader= MainActivity.class.getClassLoader();    dexclassloader = loadDexFromAssest(context, "test.dex", pathClassloader);try{ClassTestActivity= dexclassloader.loadClass("com.example.test01.TestActivity");        myLogD("Class : " + TestActivity);        context.startActivity(newIntent(context, TestActivity));    } catch (ClassNotFoundException e) {thrownewRuntimeException(e);    }}

这里需要使用context.startActivity来启动Activity,而不是反射。

通过logcat可以看到这个dexclassloader是能够成功loadClass,但是这里使用startActivity来启动Activity却抛出了ClassNotFound的异常。说明当前的类加载器无法找到这个com.example.test01.TestActivity

这是为什么呢?这里用printClassLoaderHierarchy来看看委派链,传入的参数是dexclassloader

发现只有在dexClassLoader这个类加载器当中才有test.dex这个访问路径。

通过观察委派链输出的ClassLoader和报错信息的ClassLoader,可以发现这两个类加载器是一样的,那么说明这个app默认用来查找类的classloaderpathClassloader

通过这个大概能够知道出现这个问题的其实是:动态加载的dex文件的类加载器是DexClassLoader,其委派的加载器是pathClassLoader。而默认类加载器是pathClassLoader,通过双亲委派查找类的时候,只能查找pathClassLoader ~ BootClassLoader这个范围,而无法通过dexClassLoader查找,所以会出现ClassNotFound这个异常。

大概如下图所示:

解决方法

那么现在已经知道了是大概是因为这个双亲委派机制无法通过dexClassLoader找到这个类。那么我们只需要将dexClassLoader添加到这个双亲委派能够查找到的范围就可以了,这里提供三个方法,它们的本质都是让系统能从默认的查找路径上找到外部 dex 中的类

  • 替换默认类加载器
    — 将 mClassLoader 直接设置为 DexClassLoader(这正是第一篇文章中壳代码的做法)
  • 插入委派链
    — 将 DexClassLoader 插入到 PathClassLoader 与 BootClassLoader 之间
  • 合并 dexElements
    — 将 DexClassLoader 的 dexElements 合并到 PathClassLoader 的 dexElements 中(也就是常说的"热修复"方案)

方法一

获取到LoadedApk,然后使用反射修改mClassLoader,改成DexClassLoader即可,大致过程可以参考下图:

  • 代码示例:
publicstaticvoidstartActivityFirstMethod(Context context){ClassLoaderpathClassloader= MainActivity.class.getClassLoader();    dexclassloader = loadDexFromAssest(context, "test.dex", pathClassloader);try{// 通过currentActivityThread获取 ActivityThreaObjClassactivityThreadclass= pathClassloader.loadClass("android.app.ActivityThread");MethodcurrentActivityThreadmethod= activityThreadclass.getDeclaredMethod("currentActivityThread");        currentActivityThreadmethod.setAccessible(true);ObjectcurrentactivityThreadobj= currentActivityThreadmethod.invoke(null);// 获取mPackagesFieldmPackagesfield= activityThreadclass.getDeclaredField("mPackages");        mPackagesfield.setAccessible(true);ArrayMapmPackagesobj= (ArrayMap) mPackagesfield.get(currentactivityThreadobj);if(appcontext != null){Stringpackagename= appcontext.getPackageName();WeakReferencewr= (WeakReference) mPackagesobj.get(packagename);ObjectloadedapkObj= (Object) wr.get();ClassloadedApkClass= pathClassloader.loadClass("android.app.LoadedApk");FieldmClassLoaderField= loadedApkClass.getDeclaredField("mClassLoader");            mClassLoaderField.setAccessible(true);// 打印mClassLoader变化ClassLoaderprevClassloader= (ClassLoader) mClassLoaderField.get(loadedapkObj);            myLogD("prev classloader -> " + prevClassloader);            mClassLoaderField.set(loadedapkObj,dexclassloader);            myLogD("curr classloader -> " + dexclassloader);        }    } catch (ClassNotFoundException e) {thrownewRuntimeException(e);    } catch (InvocationTargetException e) {thrownewRuntimeException(e);    } catch (NoSuchMethodException e) {thrownewRuntimeException(e);    } catch (IllegalAccessException e) {thrownewRuntimeException(e);    } catch (NoSuchFieldException e) {thrownewRuntimeException(e);    }try{ClassTestActivity= dexclassloader.loadClass("com.example.test01.TestActivity");        myLogD("Class : " + TestActivity);//            printClassLoaderHierarchy(dexclassloader);        context.startActivity(newIntent(context, TestActivity));    } catch (ClassNotFoundException e) {thrownewRuntimeException(e);    }}

可以看到成功执行了onCreate了。

这就是第一篇文章中壳代码的核心逻辑——在 attachBaseContext 中替换 mClassLoader,让系统后续找类时沿着新的 ClassLoader 去加载我们解密出来的 dex。

方法二

将dexClassLoader插入到pathClassLoader和bootClassLoader当中

publicstaticvoidstartActivitySecondMethod(Context context){ClassLoaderpathClassloader= MainActivity.class.getClassLoader();ClassLoaderbootClassloader= pathClassloader.getParent();    dexclassloader = loadDexFromAssest(context, "test.dex", bootClassloader);try{Fieldparentfield= ClassLoader.class.getDeclaredField("parent");        parentfield.setAccessible(true);        parentfield.set(pathClassloader, dexclassloader);    } catch (NoSuchFieldException e) {thrownewRuntimeException(e);    } catch (IllegalAccessException e) {thrownewRuntimeException(e);    }// 打印委派链    printClassLoaderHierarchy(pathClassloader);try{ClassTestActivityClass= dexclassloader.loadClass("com.example.test01.TestActivity");        myLogE(TestActivityClass.toString());        context.startActivity(newIntent(context, TestActivityClass));    } catch (ClassNotFoundException e) {thrownewRuntimeException(e);    }}

可以看到此时的委派链是pathClassLoader -> DexClassLoader -> BootClassLoader,而且能够正常启动Activity,并执行onCreate函数。

相比方法一直接替换 mClassLoader,这种方法保留了原来的 PathClassLoader 在委派链顶端,改动更小、更隐蔽,是另一种可行的加固思路。

方法三:合并 dexElements(热修复方案)

上面两种方法都是从修改委派链路出发,那么还有没有别的方法呢?回想一下 0x01 中介绍的 dexElements——这个数组决定了类加载器要到哪里找类以及查找顺序。如果我们将 DexClassLoader 的 dexElements 合并到 PathClassLoader 的 dexElements 中,PathClassLoader 就能直接搜到我们外部加载的 dex 了。

而这正是常说的热修复原理:将补丁 dex 加载后插入到 dexElements 头部,加载类时就会优先命中补丁中的类。

这里通过源码看看为什么会优先加载补丁dex

可以看到这里是通过遍历dexElements当中的每一项来findClass的,只要找到了就直接返回class。这就是为什么能够优先加载补丁后的dex

代码示例

那么知道了原理就来写一下代码。

首先要来封装几个工具方法:

  • ClassLoader中获取dexElements
publicstatic Object getDexElementsInClassLoader(ClassLoader classLoader){try{ClassBaseDexClassLoaderClass= classLoader.loadClass("dalvik.system.BaseDexClassLoader");FieldpathListField= BaseDexClassLoaderClass.getDeclaredField("pathList");        pathListField.setAccessible(true);ObjectpathListObj= pathListField.get(classLoader);ClassDexPathListClass= classLoader.loadClass("dalvik.system.DexPathList");FielddexElementsField= DexPathListClass.getDeclaredField("dexElements");        dexElementsField.setAccessible(true);ObjectdexElementsObj= dexElementsField.get(pathListObj);return dexElementsObj;    } catch (ClassNotFoundException e) {thrownewRuntimeException(e);    } catch (NoSuchFieldException e) {thrownewRuntimeException(e);    } catch (IllegalAccessException e) {thrownewRuntimeException(e);    }}
  • ClassLoader设置dexElements
publicstaticvoidsetDexElementsInCloassLoader(ClassLoader classLoader, Object dexElements){try{ClassBaseDexClassLoaderClass= classLoader.loadClass("dalvik.system.BaseDexClassLoader");FieldpathListField= BaseDexClassLoaderClass.getDeclaredField("pathList");        pathListField.setAccessible(true);ObjectpathlistObj= pathListField.get(classLoader);ClassDexPathListClass= classLoader.loadClass("dalvik.system.DexPathList");FielddexElementsField= DexPathListClass.getDeclaredField("dexElements");        dexElementsField.setAccessible(true);        dexElementsField.set(pathlistObj, dexElements);    } catch (NoSuchFieldException e) {thrownewRuntimeException(e);    } catch (ClassNotFoundException e) {thrownewRuntimeException(e);    } catch (IllegalAccessException e) {thrownewRuntimeException(e);    }}
  • 合并dexElements
publicstaticObjectcombineDexElements(Object element1, Object element2){Object result = null;    int len1 = Array.getLength(element1);    int len2 = Array.getLength(element2);    int newlen = len1+len2;    result = Array.newInstance(element1.getClass().getComponentType(), newlen);for(int i = 0; i < newlen; i++){if(i < len2){Array.set(result,i,Array.get(element2, i));        }else{Array.set(result, i, Array.get(element1, i - len2));        }    }myLogD("newDexElements's len : "+newlen);return result;}
  • 启动函数:
publicstaticvoidstartActivityThirdMethod(Context context){ClassLoaderpathClassLoader= MainActivity.class.getClassLoader();    dexclassloader = loadDexFromAssest(context, "test.dex", pathClassLoader);ObjectdexElements1= getDexElementsInClassLoader(pathClassLoader);ObjectdexElements2= getDexElementsInClassLoader(dexclassloader);ObjectnewdexElements= combineDexElements(dexElements1, dexElements2);    setDexElementsInCloassLoader(pathClassLoader, newdexElements);    printClassLoaderHierarchy(pathClassLoader);try{ClassTestActivityClass= pathClassLoader.loadClass("com.example.test01.TestActivity");        myLogE(TestActivityClass.toString());        context.startActivity(newIntent(context, TestActivityClass));    } catch (ClassNotFoundException e) {thrownewRuntimeException(e);    }}

合并之后可以看到pathClassLoader当中有test.dex,并且onCreate也可以正常执行了。

这种方法不需要修改委派链,只需要操作 dexElements 数组。它既是热修复的底层原理,也可以作为加固的一种实现方式——将被保护的 dex 合并进 mClassLoader 的搜索路径中,系统自然就能找到它了。

四、总结

回看前言的三个问题,到了这里,前言中抛出的三个问题已经有了明确的答案:

1. mClassLoader 到底是什么?

它是 PathClassLoader,存储在 LoadedApk 中,是 App 进程的默认类加载器。它的内部结构是 PathList → dexElements[] → DexFiledexElements 数组决定了它能搜索哪些 dex 文件。

2. 为什么系统要通过它来找类?

因为双亲委派机制。系统找类时从 mClassLoader(即 PathClassLoader)出发,沿着 PathClassLoader → BootClassLoader 这条委派链逐级向上查找。我们自己 new 的 DexClassLoader 不在这个链上,所以 startActivity 时系统压根不会去问它——这就是 ClassNotFound 的根因。

3. 除了替换 mClassLoader,还有没有别的方案?

有。本文展示了三种方案,它们的共同目标是——让系统能从默认的查找路径上找到外部 dex 中的类

整体加固的原理

整体加固的原理,说到底就是类加载器的接管。壳代码在 attachBaseContext 这个最早的执行时机,解密原始 dex,然后通过操纵类加载器(替换、插入或合并),让系统在后续启动 ApplicationActivity 等组件时,能够找到隐藏在外部 dex 中的真正代码。三种方案路径不同,但终点一致——把解密后的 dex "挂"到系统能看见的地方。

看雪ID:x0rrrrr

https://bbs.kanxue.com/user-home-999665.htm

*本文为看雪论坛精华文章,由 x0rrrrr原创,转载请注明来自看雪社区
第十届安全开发者峰会【议题征集】-欢迎投稿

# 往期推荐

ret2dlresolve分析

ELF GOT Hook 实战

面向复现的逆向工程实践:Hermes 在设备刷写、提权与 Frida 魔改中的自动化能力验证

把 .o 变成 .ko:GKI 安全特性的铁幕

实战APP全流程分析(检测绕过/登录分析/视频解锁/native加密/广告绕过)

球分享

球点赞

球在看

点击阅读原文查看更多

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-07-23 16:48:57 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/857418.html
  2. 运行时间 : 0.264011s [ 吞吐率:3.79req/s ] 内存消耗:4,850.00kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=c257e099c8d7376b8e0e1a197084ad64
  1. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/composer/autoload_static.php ( 6.05 KB )
  7. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/ralouphie/getallheaders/src/getallheaders.php ( 1.60 KB )
  10. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  11. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  12. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  13. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  14. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  15. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  16. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  17. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  18. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  19. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions_include.php ( 0.16 KB )
  21. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/guzzlehttp/guzzle/src/functions.php ( 5.54 KB )
  22. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  23. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  24. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  25. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/provider.php ( 0.19 KB )
  26. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  27. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  28. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  29. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/common.php ( 0.03 KB )
  30. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  32. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/alipay.php ( 3.59 KB )
  33. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  34. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/app.php ( 0.95 KB )
  35. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cache.php ( 0.78 KB )
  36. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/console.php ( 0.23 KB )
  37. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/cookie.php ( 0.56 KB )
  38. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/database.php ( 2.48 KB )
  39. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/filesystem.php ( 0.61 KB )
  40. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/lang.php ( 0.91 KB )
  41. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/log.php ( 1.35 KB )
  42. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/middleware.php ( 0.19 KB )
  43. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/route.php ( 1.89 KB )
  44. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/session.php ( 0.57 KB )
  45. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/trace.php ( 0.34 KB )
  46. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/config/view.php ( 0.82 KB )
  47. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/event.php ( 0.25 KB )
  48. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  49. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/service.php ( 0.13 KB )
  50. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/AppService.php ( 0.26 KB )
  51. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  52. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  53. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  54. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  55. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  56. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/services.php ( 0.14 KB )
  57. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  58. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  59. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  60. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  61. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  62. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  63. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  64. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  65. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  66. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  67. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  68. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  69. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  70. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  71. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  72. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  73. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  74. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  75. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  76. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  77. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  78. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  79. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  80. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  81. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  82. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  83. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  84. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  85. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  86. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  87. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/Request.php ( 0.09 KB )
  88. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  89. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/middleware.php ( 0.25 KB )
  90. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  91. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  92. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  93. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  94. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  95. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  96. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  97. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  98. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  99. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  100. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  101. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  102. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  103. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/route/app.php ( 3.94 KB )
  104. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  105. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  106. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Index.php ( 9.87 KB )
  108. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/BaseController.php ( 2.05 KB )
  109. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  110. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  111. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  112. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  113. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  114. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  115. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  116. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  117. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  118. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  119. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  120. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  121. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  122. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  123. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  124. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  125. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  126. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  127. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  128. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  129. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  130. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  131. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  132. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  133. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  134. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  135. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/app/controller/Es.php ( 3.30 KB )
  136. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  137. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  138. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  139. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  140. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  141. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  142. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  143. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  144. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/runtime/temp/c935550e3e8a3a4c27dd94e439343fdf.php ( 31.50 KB )
  145. /yingpanguazai/ssd/ssd1/www/wwww.yeyulingfeng.com/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.001021s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001559s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000759s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000605s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.001347s ]
  6. SELECT * FROM `set` [ RunTime:0.000576s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.002029s ]
  8. SELECT * FROM `article` WHERE `id` = 857418 LIMIT 1 [ RunTime:0.001586s ]
  9. UPDATE `article` SET `lasttime` = 1784796537 WHERE `id` = 857418 [ RunTime:0.022888s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000843s ]
  11. SELECT * FROM `article` WHERE `id` < 857418 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.005331s ]
  12. SELECT * FROM `article` WHERE `id` > 857418 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001081s ]
  13. SELECT * FROM `article` WHERE `id` < 857418 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.003174s ]
  14. SELECT * FROM `article` WHERE `id` < 857418 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.003798s ]
  15. SELECT * FROM `article` WHERE `id` < 857418 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.008469s ]
0.269098s