乐于分享
好东西不私藏

和爱豆更近一步——爱豆聊天App反调试绕过

和爱豆更近一步——爱豆聊天App反调试绕过

我分析的这款应用是韩国某大型娱乐公司旗下的爱豆聊天App。先选择想聊天的爱豆,然后付费就能和TA聊天了,可以和TA主动发消息。也能看到TA的日常动态。

1、前言

这个应用的包名是:Y29tLmV2ZXJ5c2luZy5seXNu,版本:MS42LjEw。调试时为最新版。

本文有的地方参考了GPT,有错误的还请大家指正。有了这个软件,你可以和下图的或其他爱豆聊天了。

2、开始调试、分析

使用的是Root过的Google Pixel 3 手机,手机存在的风险有以下几点:

  • root
  • magisk
  • frida
  • USB连接

2.1 观察行为

  • 直接打开App: 提示root,然后应用退出了。如下图所示.
  • frida启动App: 如下图所示。

可以看到这个应用至少检测到了我的两个风险,frida和root。

2.2 确定风控检测的组件

frida脚本如下:

functionhook_dlopen() {var mo = Interceptor.attach(Module.findExportByName(null"android_dlopen_ext"),        {onEnterfunction (args        {var pathPtr = args[0];var realPath = ptr(pathPtr).readCString();LOG(`realPath: ${realPath}`);			        }        }    );}

输出结果如下:

     ____    / _  |   Frida 16.5.9 - A world-class dynamic instrumentation toolkit   | (_| |    > _  |   Commands:   /_/ |_|       help      -> Displays the help system   . . . .       object?   -> Display information about 'object'   . . . .       exit/quit -> Exit   . . . .   . . . .   More info at https://frida.re/docs/home/   . . . .   . . . .   Connected to Pixel 3 (id=89QX0DYW9)Spawned `com.everysing.lysn`. Resuming main thread![Pixel 3::com.everysing.lysn ]-> realPath: /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/oat/arm64/base.odexrealPath: /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.arm64_v8a.apk!/lib/arm64-v8a/libdxxcuxd.so

这说明检测逻辑位于libdxxcuxd.so 。接下来就应该对这个so进行分析了。

先看看它有哪些初始化函数,现在的壳或者风险检测组件都喜欢把检测的逻辑放在这里,如下图所示。

只有DT_INIT_ARRAY 类型的函数,没有DT_INIT 类型的。如果有DT_INIT 类型的,那么我们优先看DT_INIT 类型的,因为它的执行时间早于DT_INIT_ARRAY 类型的函数。且两者都优先于JNI_OnLoad执行。

如下图所示:

有两个初始化函数,为了方便阅读,我已经重命名了。

先说说调试的结论,要想用frida绕过这个风险检测,直接nop一个函数是不行的,因为会各种各样奇怪的崩溃问题。所以个人觉得更好的做法是修改跳转,让程序检测不出来即可。

2.2.1 init_arr1

这个函数如下图所示。

(1) 检测_progname

  • _progname
     当前进程程序名(program name)的全局变量。由libc.so 导出。

GPT回答是:

Android App 进程里:/app_process64 或者:com.xxx.xxx 取决于:是否被 zygote 派生有没有改 argv[0]有没有调用 setproctitle是否做了反调试/伪装很多壳、加固、反作弊都会检查它。

(2) 检测environ

我的手机的值如下:

PATH=/sbin:/system/sbin:/system/bin:/system/xbin:/odm/bin:/vendor/bin:/vendor/xbinDOWNLOAD_CACHE=/data/cacheANDROID_BOOTLOGO=1ANDROID_ROOT=/systemANDROID_ASSETS=/system/appANDROID_DATA=/dataANDROID_STORAGE=/storageEXTERNAL_STORAGE=/sdcardASEC_MOUNTPOINT=/mnt/asecBOOTCLASSPATH=/system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/bouncycastle.jar:/system/framework/apache-xml.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/android.hidl.base-V1.0-java.jar:/system/framework/android.hidl.manager-V1.0-java.jar:/system/framework/framework-oahl-backward-compatibility.jar:/system/framework/android.test.base.jarSYSTEMSERVERCLASSPATH=/system/framework/services.jar:/system/framework/ethernet-service.jar:/system/framework/wifi-service.jar:/system/framework/com.android.location.provider.jarANDROID_SOCKET_zygote=12null

看到字符串.sandbox 和com.lbe.parallel ,说明它在检测沙箱、双开环境。

很多虚拟环境,如VirtualApp,双开助手,平行空间,VirtualXposed。会注入:SOMETHING=.sandbox 。或者包含路径/data/user/0/com.xxx.sandbox/ 。

com.lbe.parallel 是平行空间(Parallel Space),著名的双开框架。

检测environ 是因为沙箱特别喜欢修改环境变量,例如:

LD_PRELOADLD_LIBRARY_PATHPATHCLASSPATHTMPDIR

或者添加:

VIRTUAL_ENVSANDBOX

因此environ 是反虚拟化的重要检测点。

(3) sub_29E40: 内存完整性检查

sub_294E0中调用了my_crc32 来检查内存,偏移是sub_10B44 。

下图是sub_294E0 的伪代码,含注释。

可以看到从A4078处开始,检查10CA8h个字节的内存crc32值。sub_294E0 是被init_arr1 调用的,首次调用时记下crc32到全局变量dword_A4088 ,之后被调用时对比这段内存是否和最初的保持一致,如果不一致,就说明内存被修改了并调用Kill_15DF0 以创建线程的形式退出程序。

LOG_7E2A8 是日志函数,它会打印出风险字符串,也是弹窗显示的文字。

本小节的 sub_294E0 在别处被引用多次,说明有多个地方做了内存完整性检查,因此我们要注意。

(4) sub_16A48: 检查blackdex

sub_164A8 检查了_progname 是否含blackdex 字符串,blackdex是一款脱壳的工具,自然也被组件视为风险因素了。

(5) sub_3DDB4:Frida检测、其它综合风险检测和风险评分

这个函数位于sub_3DDB4,且我使用的frida版本是16.5.9的。

有计算_progname的crc32,和安装异常处理的sigHandler。

然后就是经典的检测frida环节。调用了scandir 搜索/proc/%d/task ,%d是进程PID。看看它有哪些线程?

再读取/proc/%s/comm ,看看有没有和frida相关的字符串,有就说明App被frida“入侵”了。

这段代码里有好几个flag,可以说是用于做风险分数评估的。根据这些分数风控组件来决定要不要继续执行。

为什么要看/proc/%d/task 和/proc/%s/comm 呢?

先用frida注入一个自己写的App试试看。列举出有哪些线程。

然后逐个线程的看。

所以说这是libdxxcuxd.so 在这里检查frida的原因。

不要忘了,本节的sub_3DDB4 还检查了其它的风险,调用了函数RiskDetect_1D25C ,如下图所示。

检测的字符串有以下:(/proc/%d/maps中)

/data/local/tmp/data/local/.frida.server/frida-agent/fridafridacom.saurik.substratecom.xmodgameXposedBridgelibxposed_/data/dalxjsonet.jshookcn.mc.sq/filescn.mm.gk/filesgamekillergamespeedgamecihgamehackcom.cnn.gNyki.DaXlibdaemon.solibmhx.sotools/files/binarmlib-bulldog-daemon

返回0表示没有风险,-1表示有风险。

2.2.2 init_arr2

这个函数代码少,暂时不是绕过反调试的关键。

sub_1017C 如下图所示。

dlopen_46914是自定义的dlopen,v19是输出变量,存放so文件各区段的关键信息。

dlsym_10138 和dlsym_4B3E8 都是寻找符号的函数,就是找到对应函数名的地址。其中dlsym_10138 内部调用了dlsym_4B3E8 。

寻找/linker64里的关键函数,然后放到全局变量里。

2.2.3 绕过frida检测

先寻找切入点。因为风控组件的代码启动的比较早,所以我习惯在linker即将.init_proc 时注入frida的脚本。把linker64 拷贝到电脑上。

adb pull /system/bin/linker64 google_pixel3_linker64

用IDA打开google_pixel3_linker64 ,即拷贝出来的linker64 。

搜索关键字call_constructors ,得到这个函数和偏移是2C274 。

frida脚本如下:

constMSA_SO = "libdxxcuxd.so";functionhookInitProcCaller(){// var mo = Interceptor.attach(Process.findModuleByName('linker64').base.add(0x2C274),{onEnter(args){var mod = Process.findModuleByName(MSA_SO);if(mod != null){	// 测试打印LOG('Faster than anti-debug codes in `libdxxcuxd.so`');this.x0 = this.context.x0;this.realbase = mod.base;LOG(`${mod.name}${mod.base}`);              mo.detach();        }       },onLeave(ret){//mo.detach();       }    }    )}// frida -U -f com.everysing.lysn -l test.jsfunctionLOG(sth){console.log(sth);}setImmediate(hookInitProcCaller);

然后就能打印出以下内容:

     ____    / _  |   Frida 16.5.9 - A world-class dynamic instrumentation toolkit   | (_| |    > _  |   Commands:   /_/ |_|       help      -> Displays the help system   . . . .       object?   -> Display information about 'object'   . . . .       exit/quit -> Exit   . . . .   . . . .   More info at https://frida.re/docs/home/   . . . .   . . . .   Connected to Pixel 3 (id=89QX0DYW9)Spawned `com.everysing.lysn`. Resuming main thread![Pixel 3::com.everysing.lysn ]-> Faster than anti-debug codes in `libdxxcuxd.so`libdxxcuxd.so! 0x7a0c48f000Process terminated[Pixel 3::com.everysing.lysn ]->Thank you for using Frida!

这说明我们的代码是注入的比较早的。我们得先绕过frida检测,才能绕过其它的风险检测。

(1) 修改RiskDetect_1D25C 返回值

该函数被sub_3DDB4 调用。这个函数只是检测了许许多多的风险字符串,内部调用的只是字符串拷贝或者寻找子串的函数,没有额外的影响线程运行的函数。因此把它的返回值改为0即可。

这个函数头部的指令可以改为如下:

MOV X0, #0RET

对应的frida脚本如下:

functionreturnZero(addr){ // addr表示要修改的指令地址Memory.protect(addr, 0x8'rwx');      // 设置权限var writer = newArm64Writer(addr);    writer.putLdrRegU64('x0'0// mov x0, #0    writer.putRet(); // ret    writer.flush();    writer.dispose();}

调用:

// 令RiskDetect_1D25C返回0returnZero(ptr(this.realbase).add(0x1D25C));

(2) 不要scandir和强制跳转

我们不能粗暴地把scandir 改成非法的,比如-1 ,这样按照执行流程的话会让App退出的。

此外,还有一个全局变量flag2_A5D9C 的值要是0x20 。即绿色部分的指令应该被执行。再来看看init_arr1 处的代码,如下图所示。

如果flag2_A5D9C & 0x20 为0,则App会退出。所以此时的想法是让程序在执行scandir 时直接跳转至loc_3E928 处,即不让风控组件扫描目录。

这样就能让flag2_A5D9C & 0x20不为0了,也就不会调用kill_15FD0 函数了。

经过调试flag2_A5D9C 可能会被其它的线程或函数修改成flag2_A5D9C & 0x20 为0的情况,为了保险起见,我们还要看哪里调用了sub_3DDB4 。

有两处调用了sub_3DDB4 ,如下图所示。

  • init_arr1:

把条件跳转TBNZ   W1, #5, loc_100E8 ,改成B loc_100E8 。

  • JNI_OnLoad + C30处:

TBNZ   W1, #5, loc_8419C 改成b loc_8419C 。

frida实现强制跳转的代码如下:

functionforceJump(addr, jmpAddr){ // addr:要修改的指令地址,jmpAddr:要跳转到哪里。//putBImm// 修改内存访问权限为RWX,不然写不进去。Memory.protect(addr, 4'rwx');      var writer = newArm64Writer(addr);    writer.putBImm(jmpAddr);    writer.flush();    writer.dispose();}

调用:

// 强制跳转forceJump(ptr(this.realbase).add(0x100d0), ptr(this.realbase).add(0x100e8)); // init_arr1: flag2_A5D9CforceJump(ptr(this.realbase).add(0x84184), ptr(this.realbase).add(0x8419C)); // JNI_OnLoad+3C0h: flag2_A5D9CforceJump(ptr(this.realbase).add(0x3E154), ptr(this.realbase).add(0x3E928)); // sub_3DDB4中不要让其scandir

2.2.4 (存疑)修复访问错误

写好的frida脚本此时如下:

constMSA_SO = "libdxxcuxd.so";functionhookInitProcCaller(){var mo = Interceptor.attach(Process.findModuleByName('linker64').base.add(0x2C274),{onEnter(args){var mod = Process.findModuleByName(MSA_SO);if(mod != null){	// 测试打印LOG('Faster than anti-debug codes in `libdxxcuxd.so`');this.x0 = this.context.x0;this.realbase = mod.base;LOG(`${mod.name}${mod.base}`);  // 1. 绕过frida检测// 令RiskDetect_1D25C返回0returnZero(ptr(this.realbase).add(0x1D25C));// 强制跳转forceJump(ptr(this.realbase).add(0x100d0), ptr(this.realbase).add(0x100e8)); // init_arr1: flag2_A5D9CforceJump(ptr(this.realbase).add(0x84184), ptr(this.realbase).add(0x8419C)); // JNI_OnLoad+3C0h: flag2_A5D9CforceJump(ptr(this.realbase).add(0x3E154), ptr(this.realbase).add(0x3E928)); // sub_3DDB4中不要让其scandir            mo.detach();        }       },onLeave(ret){//mo.detach();       }    }    )}functionLOG(sth){console.log(sth);}functionreturnZero(addr){ // addr表示要修改的指令地址Memory.protect(addr, 0x8'rwx');      // 设置权限var writer = newArm64Writer(addr);    writer.putLdrRegU64('x0'0// mov x0, #0    writer.putRet(); // ret    writer.flush();    writer.dispose();}functionforceJump(addr, jmpAddr){ // addr:要修改的指令地址,jmpAddr:要跳转到哪里。//putBImm// 修改内存访问权限为RWX,不然写不进去。Memory.protect(addr, 4'rwx');      var writer = newArm64Writer(addr);    writer.putBImm(jmpAddr);    writer.flush();    writer.dispose();}// frida -U -f com.everysing.lysn -l test.jssetImmediate(hookInitProcCaller);

但是有报错:

____    / _  |   Frida16.5.9-Aworld-classdynamicinstrumentationtoolkit   | (_| |    > _  |   Commands:   /_/ |_|       help      -> Displays the help system   . . . .       object?   -> Display information about 'object'   . . . .       exit/quit -> Exit   . . . .   . . . .   More info at https://frida.re/docs/home/   . . . .   . . . .   Connected to Pixel 3 (id=89QX0DYW9)Spawned `com.everysing.lysn`. Resuming main thread![Pixel 3::com.everysing.lysn ]-> Faster than anti-debug codes in `libdxxcuxd.so`libdxxcuxd.so! 0x7a0c44a000Process crashed: Bad access due to protection failure****** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***Build fingerprint'Android/aosp_blueline/blueline:9/PQ3A.190801.002/cy11091557:user/release-keys'Revision'MP1.0'ABI'arm64'pid29593tid29593name: .everysing.lysn  >>> com.everysing.lysn <<<signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x7a4299fcbf    x0  0000007a4299fcbf  x1  0000007fcd37a120  x2  0000000000000002  x3  0000000000000000    x4  0000000000000000  x5  0000000000000100  x6  0000007a0c4f0320  x7  0000000000000025    x8  0000007a0c4f0320  x9  0000000000000e6e  x10 0000000000000e7a  x11 0000007a3411ecdc    x12 0000007a3411ed30  x13 0000007a3411ed84  x14 0000007a3411ede4  x15 0000000000000000    x16 0000007a0c4ede90  x17 0000007ab6c20cb0  x18 0000000000000008  x19 0000007fcd37a340    x20 0000007a0c4ee000  x21 0000007a0c4ee120  x22 0000000000000000  x23 000000001b57b2c1    x24 000000001b57b2bf  x25 0000000000000000  x26 0000007fcd37a338  x27 0000007a0c4f0000    x28 0000007a342e0460  x29 0000007fcd383478    sp  0000007fcd379f40  lr  0000007a0c4ceba4  pc  0000007a0c45a918backtrace:    #00 pc 00000000004f4918  /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.arm64_v8a.apk (offset 0x4f4000)***[Pixel 3::com.everysing.lysn ]->Thank you for using Frida!

重点是:signal 11 (SIGSEGV), code 2 (SEGV_ACCERR), fault addr 0x7a4299fcbf 和pc  0000007a0c45a918 这有助于我们锁定报错的位置。

7a0c45a918 - 7a0c44a000 = 10918h,说明报错的位置在so的10918h处。

SEGV_ACCERR 的意思是访问的内存地址是存在的,但是因为权限问题报错。例如某段内存是只读,但这条指令尝试写入,就会出现这种错误。

10918h如下图所示。

这是一个字符串拷贝的函数,STRB在存储字符到内存时有权限问题。

被调用的地方看lr  0000007a0c4ceba4 ,偏移值是84BA4

个人不理解为啥这里会报错?v66,也就是x24的值,如果是风险分数,分数越高,是不是就访问到了权限为只读的内存了呢?这里有点奇怪……加上这个函数代码量太大了,实在分析不下去了。有懂的朋友可以帮忙看下:

无论如何,先试试再说吧。把出错的内存权限改成rw-。

functionhookBug(addr){Interceptor.attach(addr, {onEnter(args){LOG(`Protect: ${Memory.queryProtection(ptr(args[0]))}, addr: ${args[0]}`)Memory.protect(ptr(args[0]), 0x1000 , 'rw-');LOG(`Protect: ${Memory.queryProtection(ptr(args[0]))}, addr: ${args[0]}`)        },onLeave(ret){}    });

调用:

hookBug(ptr(this.realbase).add(0x84BA0))

部分输出如下:

   . . . .   Connected to Pixel3 (id=89QX0DYW9)Spawned`com.everysing.lysn`Resuming main thread![Pixel3::com.everysing.lysn ]-> Faster than anti-debug codes in`libdxxcuxd.so`libdxxcuxd.so! 0x7a0c493000Protect: r--, addr:0x7a42999cbfProtect: rw-, addr:0x7a42999cbf[Pixel3::com.everysing.lysn ]-> Process terminated[Pixel3::com.everysing.lysn ]->

如此看来确实是因为权限不够导致的错误,至少现在没有再报访问错误了。

2.2.5 绕过root检测

root检测一般是检查以下路径的文件是否存在:

/system/bin/su/system/xbin/su/sbin/su/data/local/su......

幸运的是,这个App的风控组件没有用到什么SVC #0 去打开文件,不然真不好用frida去hook了。

写出的hookFopen脚本如下:

functionhookFopen(addr){// Module.findExportByName(null,"openat")Interceptor.attach(addr, {onEnter(args){if(ptr(args[0]).readCString().indexOf('/su') >= 0){LOG(`path: ${ptr(args[0]).readCString()}`)LOG(`x30: ${this.context.lr}`)//console.log('Call stack:\n' + Thread.backtrace(null, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n'));LOG("------------")LOG("")            }        },onLeave(ret){}    })}

调用:

hookFopen(ptr(this.realbase).add(0x11F2C));

这里不建议用console.log('Call stack:\n' + Thread.backtrace(null, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n')); 去打印日志,因为打印出来的调用堆栈是错的,在这里准确的方法是打印出x30 即lr 寄存器的值。并过滤出参数含/su 的。

对了,这里再提一下,组件提前把函数地址写到了全局变量,直接hook 11F2C 效果会好些,能少跟踪一个层级。

函数Fill_Global_FuncTable_18FA4 获取libc.so 的很多函数地址写入全局变量里。

输出如下:

     ____    / _  |   Frida 16.5.9 - A world-class dynamic instrumentation toolkit   | (_| |    > _  |   Commands:   /_/ |_|       help      -> Displays the help system   . . . .       object?   -> Display information about 'object'   . . . .       exit/quit -> Exit   . . . .   . . . .   More info at https://frida.re/docs/home/   . . . .   . . . .   Connected to Pixel 3 (id=89QX0DYW9)Spawned `com.everysing.lysn`. Resuming main thread![Pixel 3::com.everysing.lysn ]-> Faster than anti-debug codes in `libdxxcuxd.so`libdxxcuxd.so! 0x7816795000path: /system/xbin/sux30: 0x78167a8138   ------------        path: /system/bin/sux30: 0x78167a8138   ------------        path: /sbin/su      x30: 0x78167a8138   ------------path: /cache/sux30: 0x78167a8138------------path: /data/local/bin/sux30: 0x78167a8138------------path: /data/local/sux30: 0x78167a8138------------path: /data/local/xbin/sux30: 0x78167a8138------------path: /data/sux30: 0x78167a8138------------path: /dev/sux30: 0x78167a8138------------path: /vendor/xbin/sux30: 0x78167a8138------------path: /vendor/bin/sux30: 0x78167a8138------------path: /odm/bin/sux30: 0x78167a8138------------path: /system/xbin/sux30: 0x78167a8138------------path: /system/bin/sux30: 0x78167a8138------------path: /system/sbin/sux30: 0x78167a8138------------path: /sbin/sux30: 0x78167a8138------------path: /system/xbin/bstk/sux30: 0x78167a8138------------Protect: r--, addr: 0x784cfb71ffProtect: rw-, addr: 0x784cfb71ff

还有一段错误,提示找不到so文件了,暂且不管它,我们绕过root检测再说。

Process crashed: java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/base.apk", zip file "/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.arm64_v8a.apk", zip file "/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.xxhdpi.apk", zip file "/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.zh.apk", zip file "/data/user/0/com.everysing.lysn/files/.b6cbeb45/305a9974/ֱخ׬زڮ.jar"],nativeLibraryDirectories=[/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/lib/arm64, /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/base.apk!/lib/arm64-v8a, /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.arm64_v8a.apk!/lib/arm64-v8a, /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.xxhdpi.apk!/lib/arm64-v8a, /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.zh.apk!/lib/arm64-v8a, /system/lib64]]] couldn't find "lib.so"***FATAL EXCEPTION: mainProcess: com.everysing.lysn, PID: 16781java.lang.UnsatisfiedLinkError: dalvik.system.PathClassLoader[DexPathList[[zip file "/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/base.apk", zip file "/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.arm64_v8a.apk", zip file "/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.xxhdpi.apk", zip file "/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.zh.apk", zip file "/data/user/0/com.everysing.lysn/files/.b6cbeb45/305a9974/ֱخ׬زڮ.jar"],nativeLibraryDirectories=[/data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/lib/arm64, /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/base.apk!/lib/arm64-v8a, /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.arm64_v8a.apk!/lib/arm64-v8a, /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.xxhdpi.apk!/lib/arm64-v8a, /data/app/com.everysing.lysn-c9-EgfAc-xFa2cjUq5CTyQ==/split_config.zh.apk!/lib/arm64-v8a, /system/lib64]]] couldn't find "lib.so"        at java.lang.Runtime.loadLibrary0(Runtime.java:1012)        at java.lang.System.loadLibrary(System.java:1669)        at com.liapp.y.۬ڳֳ֭د(رٳٲ֮ت.java:288)        at com.briniclemobile.ittalk.organization.liborganization.<clinit>(ܬݭܭرڭ.java:79)        at com.briniclemobile.ittalk.organization.liborganization.getUserPassword(Native Method)        at com.everysing.lysn.data.local.user.UserDatabase$Companion.buildDatabase(֭شִܭީ.java:1589)        at com.everysing.lysn.data.local.user.UserDatabase$Companion.getInstance(֭شִܭީ.java:1519)        at com.everysing.lysn.data.local.di.DatabaseDaoModule.provideUserDao(ݮ۱۱ׯ٫.java:269)        at com.everysing.lysn.data.local.di.DatabaseDaoModule_ProvideUserDaoFactory.provideUserDao(شڳڴ׳ٯ.java:479)        at com.everysing.lysn.DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get(ݴۯ׭ڴܰ.java:34139)        at dagger.internal.DoubleCheck.getSynchronized(ٳ٭ױ֭ة.java:549)        at dagger.internal.DoubleCheck.get(ٳ٭ױ֭ة.java:459)        at com.everysing.lysn.DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl.userLocalRepositoryImpl(ݴۯ׭ڴܰ.java:32899)        at com.everysing.lysn.DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get(ݴۯ׭ڴܰ.java:34079)        at dagger.internal.DoubleCheck.getSynchronized(ٳ٭ױ֭ة.java:549)        at dagger.internal.DoubleCheck.get(ٳ٭ױ֭ة.java:459)        at com.everysing.lysn.DaggerMyApplication_HiltComponents_SingletonC$SingletonCImpl.getUserRepository(ݴۯ׭ڴܰ.java:33709)        at com.everysing.lysn.data.UserRepository$Companion.getInstance(رڮۯٲۮ.java:1599)        at com.everysing.lysn.MyApplication.onCreate(ݭٯۮݮߪ.java:669)        at com.liapp.x.onCreate(ܳׯڲֳد.java:419)        at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1154)        at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5920)        at android.app.ActivityThread.access$1100(ActivityThread.java:200)        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)        at android.os.Handler.dispatchMessage(Handler.java:106)        at android.os.Looper.loop(Looper.java:193)        at android.app.ActivityThread.main(ActivityThread.java:6718)        at java.lang.reflect.Method.invoke(Native Method)        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)***

因为我们的错误是/sbin/su 存在,所以看到这里。

path/sbin/su      x300x78167a8138

0x78167a8138 - libdxxcuxd.so! 0x7816795000 = 0x13138

经过多次调试,得到以下调用的逻辑链条。

下两张图分别是sub_1C058 和sub_3FEA0 的截图。

那么保险的做法是:

  • sub_1C058 和sub_3FEA0头部指令替换成mov x0, #0; RET

此时完整的代码如下:

constMSA_SO = "libdxxcuxd.so";functionhookInitProcCaller(){var mo = Interceptor.attach(Process.findModuleByName('linker64').base.add(0x2C274),{onEnter(args){var mod = Process.findModuleByName(MSA_SO);if(mod != null){	// 测试打印LOG('Faster than anti-debug codes in `libdxxcuxd.so`');this.x0 = this.context.x0;this.realbase = mod.base;LOG(`${mod.name}${mod.base}`);  // 1. 绕过frida检测// 令RiskDetect_1D25C返回0returnZero(ptr(this.realbase).add(0x1D25C));// 强制跳转forceJump(ptr(this.realbase).add(0x100d0), ptr(this.realbase).add(0x100e8)); // init_arr1: flag2_A5D9CforceJump(ptr(this.realbase).add(0x84184), ptr(this.realbase).add(0x8419C)); // JNI_OnLoad+3C0h: flag2_A5D9CforceJump(ptr(this.realbase).add(0x3E154), ptr(this.realbase).add(0x3E928)); // sub_3DDB4中不要让其scandir// 解决内存访问错误的问题hookBug(ptr(this.realbase).add(0x84BA0))// 测试hookFopen(ptr(this.realbase).add(0x11F2C));// 2.绕过rootreturnZero(ptr(this.realbase).add(0x1C058)); // sub_1C058,写出/sbin/su字符串的returnZero(ptr(this.realbase).add(0x3FEA0)); // sub_3FEA0,检测Root的。            mo.detach();        }       },onLeave(ret){//mo.detach();       }    }    )}functionLOG(sth){console.log(sth);}functionhookBug(addr){Interceptor.attach(addr, {onEnter(args){LOG(`Protect: ${Memory.queryProtection(ptr(args[0]))}, addr: ${args[0]}`)Memory.protect(ptr(args[0]), 0x1000 , 'rw-');LOG(`Protect: ${Memory.queryProtection(ptr(args[0]))}, addr: ${args[0]}`)        },onLeave(ret){}    });}functionreturnZero(addr){ // addr表示要修改的指令地址Memory.protect(addr, 0x8'rwx');      // 设置权限var writer = newArm64Writer(addr);    writer.putLdrRegU64('x0'0// mov x0, #0    writer.putRet(); // ret    writer.flush();    writer.dispose();}functionforceJump(addr, jmpAddr){ // addr:要修改的指令地址,jmpAddr:要跳转到哪里。//putBImm// 修改内存访问权限为RWX,不然写不进去。Memory.protect(addr, 4'rwx');      var writer = newArm64Writer(addr);    writer.putBImm(jmpAddr);    writer.flush();    writer.dispose();}// frida -U -f com.everysing.lysn -l test.jssetImmediate(hookInitProcCaller);functionhookFopen(addr){// Module.findExportByName(null,"openat")Interceptor.attach(addr, {onEnter(args){if(ptr(args[0]).readCString().indexOf('/su') >= 0){LOG(`path: ${ptr(args[0]).readCString()}`)LOG(`x30: ${this.context.lr}`)//console.log('Call stack:\n' + Thread.backtrace(null, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n'));LOG("------------")LOG("")            }        },onLeave(ret){}    })}

App没有提示frida或root。但是它重启了,并再次提示root。这属于正常现象,因为重启之后我们注入的frida代码是不存在的。

也许程序调用了kill 相关的函数促使进程退出的。

2.2.6 其它风险

后来经过分析发现Kill_15FD0 被引用次数也比较多。

使用frida跟踪它的参数,代码:

functionhookKill(addr){// Module.findExportByName('libc.so',"kill")LOG(`Killer.`);Interceptor.attach(addr, {onEnter(args){LOG(`Kill called.`)LOG(`x0: ${this.context.x0}, x30: ${this.context.lr}`);// 有下面这句才会打印寄存器,这也挺奇怪的。console.log('Call stack:\n' + Thread.backtrace(nullBacktracer.FUZZY).map(DebugSymbol.fromAddress).join('\n'));        },onLeave(ret){        }    }    )}

输出:

[Pixel3::com.everysing.lysn ]->Fasterthananti-debugcodesin`libdxxcuxd.so`libdxxcuxd.so!0x781674f000Killer.Protect:r--,addr:0x784cfad1ffProtect:rw-,addr:0x784cfad1ffKillcalled.x0:0x7,x30:0x78167d83dcCall stack:0x781ba8a70c0x781ba8aac00x781ba83a880x781ba8b5640x781ba8cdcc0x781ba834ec0x781ba9e68c0x781ba8a8f00x781ba8a89c0x781ba8ab8c0x781ba8b4e40x781ba8b4e80x781ba86e580x781ba8833c0x781ba883480x781ba87ef0

(1) so_overflow

上级调用位置在0x78167d83dc ,即偏移893DC 。如下图所示。

(flag1_A5C78 & 0x2000000) != 0  时App便退出了。我们要找到令(flag1_A5C78 & 0x2000000) != 0  的代码。这里只需要找它的交叉引用就行了。如下图所示,位于sub_2AC2C 。

强制跳转的代码是:

forceJump(ptr(this.realbase).add(0x2AE14), ptr(this.realbase).add(0x2AE3C)); // so_overflow

上图的全局变量n18 决定了flag1_A5C78 是否会被或0x2000000。好像是内存多次出现split_config.*.apk 就报这个错……

(2) com.everysing.lysn.apk

经过之前的代码风险绕过,现在弹窗变成了下图的样子。

Hook Kill_15FD0 还是略显费力了,我们选择Hook日志函数。既能锁定出错的位置,还能知道当前有哪些风险没有绕过去。

代码:

functionhook_7E2A8(addr){Interceptor.attach(addr, {onEnter(args){LOG(`x0 flag: ${this.context.x0} - x30: ${this.context.lr} - Risk: ${ptr(args[2]).readCString()}`);    },onLeave(ret){    }});}

调用:

hook_7E2A8(ptr(this.realbase).add(0x7E2A8)) // Log函数

输出:

Spawned`com.everysing.lysn`Resuming main thread![Pixel3::com.everysing.lysn ]-> Faster than anti-debug codes in`libdxxcuxd.so`libdxxcuxd.so! 0x781674a000x0 flag:0x429 - x30:0x7816793bf8 - Risk: com.everysing.lysn.apkx0 flag:0x443 - x30:0x78167730e0 - RiskUSBConnectedx0 flag:0x1b63 - x30:0x7816781ed0 - Risk: com.topjohnwu.magisk

先看x0 flag: 0x429 - x30: 0x7816793bf8 - Risk: com.everysing.lysn.apk .上级调用偏移是49bf8 。v157 = 0x429。

所以我们要寻找dword_A42A0 |= 0x10 的地方。如下图所示。

这个MI MAX 3 看着像是手机的品牌,不过我用的是pixel手机。

代码:

forceJump(ptr(this.realbase).add(0x2ADF8), ptr(this.realbase).add(0x2Ae08)) // // API hooking com.everysing.lysn.apk

不过这里我也不理解,为啥会看手机品牌?还会出现com.everysing.lysn.apk 的字样?

(3) Magisk

现在剩余两个风险:

[Pixel3::com.everysing.lysn ]-> Faster than anti-debug codes in`libdxxcuxd.so`libdxxcuxd.so! 0x781678b000x0 flag:0x443 - x30:0x78167b40e0 - RiskUSBConnectedx0 flag:0x1b63 - x30:0x78167c2ed0 - Risk: com.topjohnwu.magisk

我们来看Magisk检测怎么绕过去。

观察程序执行流:

37B10处需要跳转至37ed0。代码:

forceJump(ptr(this.realbase).add(0x37B10), ptr(this.realbase).add(0x37ED0)) // Magisk

(4) USB Connected

[Pixel3::com.everysing.lysn ]-> Faster than anti-debug codes in`libdxxcuxd.so`libdxxcuxd.so! 0x781678b000x0 flag:0x443 - x30:0x78167b40e0 - RiskUSBConnected

上级调用在290E0 ,如下图所示。

这里使flag1_A5C78 &2 != 0 。但我没仔细看,初步猜测是调用Java方法判断是否USB连接。

绕过的代码:

forceJump(ptr(this.realbase).add(0x28EA0), ptr(this.realbase).add(0x28f34)) // usb connected

(5) Multi-hooking

Spawned`com.everysing.lysn`Resuming main thread![Pixel3::com.everysing.lysn ]-> Faster than anti-debug codes in`libdxxcuxd.so`libdxxcuxd.so! 0x7816781000x0 flag:0x441 - x30:0x78167aaeb4 - RiskMulti-hooking

由于前面修改的地方比较多,此处又报错Multi-hooking。上级调用在29Eb4 。

代码:

forceJump(ptr(this.realbase).add(0x29E10), ptr(this.realbase).add(0x29ecc)) // Multi-hooking

自此,已经绕过我的手机存在的风险了,如下图所示。能保持这个界面输入。也没显示弹窗。

3、结论和其它注意事项

  • 字符串加密:不是按照固定的模式,有三种分别是凯撒加密,单字节异或,单字节递增1异或。
  • 风险检测绕过:强烈不建议直接把某个函数的头部改成RET,这个组件检测点比较多。这样做的话容易让App卡死或因为一些数据导致后续的dex不能正常解密,App也会闪退。
  • 其它风险检测:我的手机没装Xposed, BlackDex等插件,分析过程也没有用IDA去调试,所以有些检测点没有绕过。这时建议Hook LOG_7E2A8 ,看看是否有输出。有输出就分析上级调用,并使用frida脚本绕过之。
  • 这个组件代码量比较大,没有分析完善,大家可以继续分析、补充。
  • 手机投屏会偶有以下风险报出:(overlay有“覆盖、涂层”的意思, 不知道是不是指这个。)
x0 flag: 0x233d - x30: 0x781681f190 - Risk:OVERLAY_1

出现这个风险OVERLAY_1,App并没有退出。

4、完整代码

constMSA_SO = "libdxxcuxd.so";functionhookInitProcCaller(){var mo = Interceptor.attach(Process.findModuleByName('linker64').base.add(0x2C274),{onEnter(args){var mod = Process.findModuleByName(MSA_SO);if(mod != null){	// 测试打印LOG('Faster than anti-debug codes in `libdxxcuxd.so`');this.x0 = this.context.x0;this.realbase = mod.base;LOG(`${mod.name}${mod.base}`);  //hookKill2();// 1. 绕过frida检测// 令RiskDetect_1D25C返回0returnZero(ptr(this.realbase).add(0x1D25C));// 强制跳转forceJump(ptr(this.realbase).add(0x100d0), ptr(this.realbase).add(0x100e8)); // init_arr1: flag2_A5D9CforceJump(ptr(this.realbase).add(0x84184), ptr(this.realbase).add(0x8419C)); // JNI_OnLoad+3C0h: flag2_A5D9CforceJump(ptr(this.realbase).add(0x3E154), ptr(this.realbase).add(0x3E928)); // sub_3DDB4中不要让其scandir// 解决内存访问错误的问题hookBug(ptr(this.realbase).add(0x84BA0))// 测试//hookFopen(ptr(this.realbase).add(0x11F2C));// 2.绕过rootreturnZero(ptr(this.realbase).add(0x1C058)); // sub_1C058,写出/sbin/su字符串的returnZero(ptr(this.realbase).add(0x3FEA0)); // sub_3FEA0,检测Root的。// hookKill// hookKill(ptr(this.realbase).add(0x15Fd0)); // 15Fd0 160e8forceJump(ptr(this.realbase).add(0x2AE14), ptr(this.realbase).add(0x2AE3C)) // so_overflowforceJump(ptr(this.realbase).add(0x2ADF8), ptr(this.realbase).add(0x2Ae08)) // API hooking com.everysing.lysn.apkforceJump(ptr(this.realbase).add(0x37B10), ptr(this.realbase).add(0x37ED0)) // MagiskforceJump(ptr(this.realbase).add(0x28EA0), ptr(this.realbase).add(0x28f34)) // usb connectedforceJump(ptr(this.realbase).add(0x29E10), ptr(this.realbase).add(0x29ecc)) // Multi-hookinghook_7E2A8(ptr(this.realbase).add(0x7E2A8)) // Log函数//followIns(ptr(this.realbase).add(0x841F4))            mo.detach();        }       },onLeave(ret){//mo.detach();       }    }    )}functionLOG(sth){console.log(sth);}functionhookBug(addr){Interceptor.attach(addr, {onEnter(args){//LOG(`Protect: ${Memory.queryProtection(ptr(args[0]))}, addr: ${args[0]}`)Memory.protect(ptr(args[0]), 0x1000 , 'rw-');//LOG(`Protect: ${Memory.queryProtection(ptr(args[0]))}, addr: ${args[0]}`)        },onLeave(ret){}    });}functionreturnZero(addr){ // addr表示要修改的指令地址Memory.protect(addr, 0x8'rwx');      // 设置权限var writer = newArm64Writer(addr);    writer.putLdrRegU64('x0'0// mov x0, #0    writer.putRet(); // ret    writer.flush();    writer.dispose();}functionforceJump(addr, jmpAddr){ // addr:要修改的指令地址,jmpAddr:要跳转到哪里。//putBImm// 修改内存访问权限为RWX,不然写不进去。Memory.protect(addr, 4'rwx');      var writer = newArm64Writer(addr);    writer.putBImm(jmpAddr);    writer.flush();    writer.dispose();}// frida -U -f com.everysing.lysn -l test.jssetImmediate(hookInitProcCaller);functionhookFopen(addr){// Module.findExportByName(null,"openat")Interceptor.attach(addr, {onEnter(args){if(ptr(args[0]).readCString().indexOf('/su') >= 0){LOG(`path: ${ptr(args[0]).readCString()}`)LOG(`x30: ${this.context.lr}`)//console.log('Call stack:\n' + Thread.backtrace(null, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).join('\n'));LOG("------------")LOG("")            }        },onLeave(ret){}    })}functionhookKill(addr){// Module.findExportByName('libc.so',"kill")LOG(`Killer.`);Interceptor.attach(addr, {onEnter(args){LOG(`Kill called.`)LOG(`x0: ${this.context.x0}, x30: ${this.context.lr}`);// 有下面这句才会打印寄存器,这也挺奇怪的。console.log('Call stack:\n' + Thread.backtrace(nullBacktracer.FUZZY).map(DebugSymbol.fromAddress).join('\n'));        },onLeave(ret){        }    }    )}functionhookKill2(){Interceptor.attach(Module.findExportByName(null,"kill"),{onEnter(args){LOG(`x30: ${this.context.lr}`)LOG(`pid: ${args[0]}, signal: ${args[1]}`)LOG(`kill called.`);console.log('Call stack:\n' + Thread.backtrace(nullBacktracer.FUZZY).map(DebugSymbol.fromAddress).join('\n'));        },onLeave(ret){}    })}functionfollowIns(init_arr1_ptr){Interceptor.attach(init_arr1_ptr, {onEnter(args) {let tid = Process.getCurrentThreadId()this.tid = tidconsole.log(`进入函数,开始 trace [${tid}]`);Stalker.follow(tid, {events: {callfalse,retfalse,exectrue,blockfalse,compilefalse                },transform(iterator) {let instruction = iterator.next();do {const address = instruction.address;constmodule = getModuleByAddressSafe(address);let modInfo = "";if (module && module.name === MSA_SO) {const offset = ptr(address).sub(module.base);                            modInfo = `[${module.name}!${offset}]`;console.log(`[${address}${modInfo}${instruction.mnemonic}${instruction.opStr}`                            );                        }                        iterator.keep();                    } while ((instruction = iterator.next()) !== null);                },            });        },onLeave(retval) {console.log(`函数退出,停止 trace [${this.tid}]`);Stalker.unfollow(this.tid);Stalker.garbageCollect();        }    });}functiongetModuleByAddressSafe(address) {try {// 尝试获取模块varmodule = Process.getModuleByAddress(address);// 如果模块存在,返回模块if (module) {returnmodule;        } else {// 如果没有找到模块,返回 nullreturnnull;        }    } catch (e) {// 捕获异常,返回 nullreturnnull;    }}functionhook_7E2A8(addr){Interceptor.attach(addr, {onEnter(args){LOG(`x0 flag: ${this.context.x0} - x30: ${this.context.lr} - Risk: ${ptr(args[2]).readCString()}`);    },onLeave(ret){    }});}

附件见“阅读原文”调试数据库, IDA 7.7 Pro。

看雪ID:taeyeon_ss

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

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

# 往期推荐

安卓逆向基础知识之frida Hook

2025 强网杯和强网拟态部分题解

在逆向分析方面-unidbg真的适合 MCP 吗?

AI静态分析,内核模块隐藏 Frida 特征,绕过linker私有结构遍历崩溃链

某安全so库深度解析

球分享

球点赞

球在看

“阅读原文”一起来充电吧!
基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-05-29 17:17:45 HTTP/1.1 GET : https://www.yeyulingfeng.com/a/679641.html
  2. 运行时间 : 0.099618s [ 吞吐率:10.04req/s ] 内存消耗:5,152.53kb 文件加载:145
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=0b8b512e435a2bfd3eaa9a6a5decd83c
  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.000730s ] mysql:host=127.0.0.1;port=3306;dbname=wenku;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.001038s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000418s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000343s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000699s ]
  6. SELECT * FROM `set` [ RunTime:0.000271s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000761s ]
  8. SELECT * FROM `article` WHERE `id` = 679641 LIMIT 1 [ RunTime:0.000782s ]
  9. UPDATE `article` SET `lasttime` = 1780046265 WHERE `id` = 679641 [ RunTime:0.007633s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 64 LIMIT 1 [ RunTime:0.000304s ]
  11. SELECT * FROM `article` WHERE `id` < 679641 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.000608s ]
  12. SELECT * FROM `article` WHERE `id` > 679641 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.001688s ]
  13. SELECT * FROM `article` WHERE `id` < 679641 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.004003s ]
  14. SELECT * FROM `article` WHERE `id` < 679641 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.000804s ]
  15. SELECT * FROM `article` WHERE `id` < 679641 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.001205s ]
0.101271s