- 博客(60)
- 收藏
- 关注
原创 Android JNI开发:System.loadLibrary加载机制
System.loadLibrary的核心功能是获取.so库的全路径,加载该.so库文件,然后依次调用init、init_array和JNI_OnLoad函数。
2024-08-26 17:05:13
1119
原创 Android实战:过root检测
因此过掉这个这个root检测的方法很简单,只需要将checkSuFile()函数返回false,checkRootFile()函数返回null即可。因此这里的关键函数为SystemUtils.checkSuFile()和SystemUtils.checkRootFile(),继续跟进这两个函数,看看究竟是怎么进行检测root环境的。从堆栈信息中,我们可以看到关键函数为com.hoge.android.factory.welcome.WelcomeActivity$2$1.run()。
2024-08-23 18:45:24
954
原创 【LeetCode】和为K的子数组
给你一个整数数组nums和一个整数k ,请你统计并返回该数组中和为k的子数组的个数。输入:nums = [1,1,1], k = 2。输入:nums = [1,2,3], k = 3。子数组是数组中元素的连续非空序列。
2024-08-20 00:41:40
288
原创 【LeeCode】找到字符串中所有字母异位词
滑动窗口的基本思路是维护一个长度为p的窗口,在字符串s中滑动这个窗口,并检查窗口中的子串是否为字符串p的异位词。起始索引等于 0 的子串是 “cba”, 它是 “abc” 的异位词。起始索引等于 6 的子串是 “bac”, 它是 “abc” 的异位词。起始索引等于 0 的子串是 “ab”, 它是 “ab” 的异位词。起始索引等于 1 的子串是 “ba”, 它是 “ab” 的异位词。起始索引等于 2 的子串是 “ab”, 它是 “ab” 的异位词。输入: s = “abab”, p = “ab”
2024-08-19 23:51:08
375
原创 【LeetCode】无重复字符的最长子串
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。输入: s = “abcabcbb”输入: s = “pwwkew”输入: s = “bbbbb”
2024-08-17 21:41:40
289
原创 【LeetCode】接雨水
解释:上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可以接 6 个单位的雨水(蓝色部分表示雨水)。给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。输入:height = [0,1,0,2,1,0,1,3,2,1,2,1]输入:height = [4,2,0,3,2,5]
2024-08-17 21:00:59
242
原创 【LeetCode】三数之和
给你一个整数数组 nums ,判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i!= k ,同时还满足 nums[i] + nums[j] + nums[k] == 0。不同的三元组是 [-1,0,1] 和 [-1,-1,2]。输入:nums = [-1,0,1,2,-1,-4]输出:[[-1,-1,2],[-1,0,1]]输入:nums = [0,1,1]输入:nums = [0,0,0]解释:唯一可能的三元组和为 0。输出:[[0,0,0]]
2024-08-16 10:46:32
401
原创 【LeetCode】盛最多水的容器
有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i])。解释:图中垂直线代表输入数组 [1,8,6,2,5,4,8,3,7]。在此情况下,容器能够容纳水(表示为蓝色部分)的最大值为 49。使用双指针,然后每次选择较短的那条边所对应的指针进行移动,因为移动较短的边有可能增加容器的高度,从而可能找到更大的容积(找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。输入:[1,8,6,2,5,4,8,3,7]输入:height = [1,1]
2024-08-15 23:51:49
196
原创 【LeetCode】最长连续序列
如果当前数字 num 是一个序列的开始(即 num - 1 不在哈希表中),那么从 num 开始逐个检查后续数字 num + 1, num + 2, …是否在哈希表中存在,直到不再连续。给定一个未排序的整数数组 nums ,找出数字连续的最长序列(不要求序列元素在原数组中连续)的长度。解释:最长数字连续序列是 [1, 2, 3, 4]。输入:nums = [0,3,7,2,5,8,4,6,0,1]请你设计并实现时间复杂度为 O(n) 的算法解决此问题。输入:nums = [100,4,200,1,3,2]
2024-08-14 23:27:08
273
原创 【LeetCode】字母异位词分组
使用unordered_map(哈希表)将排序后的字符串映射到一个字符串列表中。哈希表的键是排序后的字符串,值是所有与该键对应的原始字符串组成的列表。输入: strs = [“eat”, “tea”, “tan”, “ate”, “nat”, “bat”]输出: [[“bat”],[“nat”,“tan”],[“ate”,“eat”,“tea”]]给你一个字符串数组,请你将字母异位词组合在一起。字母异位词是由重新排列源单词的所有字母得到的一个新单词。输出: [[“a”]]输出: [[“”]]
2024-08-14 22:49:08
349
原创 【LeetCode】两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1]。你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。输入:nums = [2,7,11,15], target = 9。输入:nums = [3,2,4], target = 6。输入:nums = [3,3], target = 6。你可以按任意顺序返回答案。
2024-08-14 18:55:35
324
原创 【LeetCode】移动零
利用双指针遍历数组,其中一个指针遍历整个数组,另一个指针记录下一个非零元素应该放置的位置。通过交换非零元素和零元素的位置,将所有非零元素集中到数组前面,最终将零元素移到数组末尾。这种方法在保证非零元素相对顺序不变的同时,实现了原地操作。给定一个数组nums,编写一个函数将所有0移动到数组的末尾,同时保持非零元素的相对顺序。请注意 ,必须在不复制数组的情况下原地对数组进行操作。输入: nums = [0,1,0,3,12]输出: [1,3,12,0,0]输入: nums = [0]
2024-08-14 18:05:14
241
原创 【LeetCode】删除链表中的节点
有一个单链表的 head,我们想删除它其中的一个节点 node。链表的所有值都是 唯一的,并且保证给定的节点 node 不是链表中的最后一个节点。解释:指定链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9。解释:指定链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9。输入:head = [4,5,1,9], node = 5。输入:head = [4,5,1,9], node = 1。输出:[4,1,9]
2024-08-14 17:23:57
349
原创 【LeetCode】摆动排序
奇数索引 (i % 2 == 1):此时希望 nums[i] >= nums[i+1]。给你一个的整数数组 nums, 将该数组重新排序后使 nums[0] = nums[2]
2024-08-14 00:03:37
199
原创 数组列表中的最大距离
现在你需要从两个不同的数组中选择两个整数(每个数组选一个)并且计算它们的距离。两个整数 a 和 b 之间的距离定义为它们差的绝对值 |a-b|。你的任务就是去找到最大距离。一种得到答案 4 的方法是从第一个数组或者第三个数组中选择 1,同时从第二个数组中选择 5。输入: [[1,2,3], [4,5], [1,2,3]]给定 m 个数组,每个数组都已经按照。题目来源:LeetCode。
2024-08-13 23:24:32
172
原创 二叉树最长连续序列
最长连续序列路径 是依次递增 1 的路径。该路径,可以是从某个初始节点到树中任意节点,通过「父 - 子」关系连接而产生的任意路径。给你一棵指定的二叉树的根节点 root ,请你计算其中 最长连续序列路径 的长度。输入:root = [1,null,3,2,4,null,null,null,5]解释:当中,最长连续序列是 2-3。注意,不是 3-2-1,所以返回 2。解释:当中,最长连续序列是 3-4-5 ,所以返回结果为 3。输入:root = [2,null,3,2,null,1]
2024-08-12 16:22:54
275
原创 Android系统免root注入frida脚本
通过这种方式可以实现app免root的就可以使用frida进行hook,然而这种方式在有些app反编译和回编译可能会出错,会存在签名校验、文件校验问题。
2024-08-08 18:01:55
2444
原创 Frida Hook String构造函数
在实际Android应用开发中,无论是使用多么复杂的算法对字符串进行加密,然而开发者常常会构造出字符串的实例。因此,我们可以通过使用Frida hook String类的构造函数来追踪这些实例的构造位置,然后可以通过构造实例的地方栈回溯出关键位置。
2024-08-05 00:43:25
813
原创 Frida Hook Java层代码与协议分析
在本文中,我们继续以某嘟牛应用为例,在用户点击登录按钮后,哪个方法会被调用。我们在上一篇文章中提到,搜索关键词 “Encrypt” 后,发现两个包含该字符串的 Java 方法。接下来,我们通过 Frida 分别 Hook 这两个方法,以测试点击登录后会调用哪个方法。执行结果如下所示:通过结果我们可以看出,点击登录后最终执行的方法为 addRequestMap。
2024-08-03 00:44:32
464
原创 app逆向实战之定位关键代码
可以通过这两种方式定位关键代码,然而控件的方式在有些复杂的app当中,可能离着关键代码很远。针对字符串的方式会面临字符串加密,我们在搜索字符串搜不到相应的代码。
2024-08-02 16:31:09
775
原创 Android应用的执行入口
static {@Override@Override在这个类中,我们重写了和onCreate方法,并在静态代码块中添加了日志输出,以便于在应用启动时跟踪执行顺序。
2024-07-31 19:07:17
471
原创 Android系统目录与权限管理
并非所有目录和文件都能通过上述方式修改权限,有些需要修改SELinux策略。目录存放用户应用的数据,每个应用都有自己的子目录,以包名命名。该目录是私有目录,只有相应的应用能够访问,除非获得了root权限。是一个临时目录,具有较大的权限,通常用于存放一些临时文件。无论设备是否有外部存储卡,都会有sd卡目录,通常是。目录存放Android系统使用的框架文件,如一些。目录存放Android系统的shell命令。在Linux系统中,文件和目录的权限通过。目录存放系统自带的应用。的应用,其数据存放在。
2024-07-31 17:40:45
1067
原创 Android逆向中常用的Linux命令
在进行Android逆向工程或开发时,通过adb shell进入设备的Android系统是常见的操作。由于Android系统的底层基于Linux,掌握Linux命令对于高效操作和管理设备至关重要。本文将介绍在adb shell中常用的Linux命令及其应用。
2024-07-31 00:00:55
823
原创 Android历史版本与APK文件结构
在移动设备日益普及的今天,Android系统已经成为全球最流行的移动操作系统。作为Android开发者或逆向工程师,了解Android系统的演进历史以及APK文件的基本结构是非常重要的。本文将详细介绍Android历史版本的演变以及APK的基本结构。
2024-07-30 23:29:05
893
原创 Android逆向中常用的adb命令
在Android逆向工程中,ADB(Android Debug Bridge)是一个非常重要的工具。它允许逆向工程师与Android设备进行交互和调试。本文将介绍一些在Android逆向中常用的adb命令。
2024-07-30 22:41:07
591
原创 初识LLVM
LLVM项目是一个模块化和可重用的编译器和工具链技术集合,最初作为伊利诺伊大学的研究项目,旨在提供现代的、基于SSA的编译策略,支持任意编程语言的静态和动态编译。如今,LLVM已发展为包含多个子项目的总项目,被广泛应用于商业和开源项目以及学术研究。LLVM的代码在“Apache 2.0许可证加LLVM例外”下发布。LLVM核心库:提供与源和目标无关的优化器和代码生成支持。Clang:一个高效的C/C++/Objective-C编译器,支持快速编译和有用的错误提示。LLDB。
2024-07-18 01:05:03
703
原创 leetcode-反转链表
给你单链表的头节点head ,请你反转链表,并返回反转后的链表。输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]
2024-07-07 22:31:57
209
原创 leetcode-LRU缓存
请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。函数 get 和 put 必须以 O(1) 的平均时间复杂度运行。
2024-07-07 20:13:21
235
原创 leetcode-前K个高频元素
给你一个整数数组nums和一个整数k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]进阶:你所设计算法的时间复杂度必须优于O(nlogn) ,其中n是数组大小。
2024-07-07 17:05:12
244
原创 经典排序算法_冒泡排序
冒泡排序是一种简单的排序算法,它重复地遍历待排序的元素列,依次比较相邻的元素,并在需要时交换它们的位置,直到整个序列按照要求有序。这个算法的名字由于在每一轮排序中,最大(或最小)的元素会像气泡一样"浮"到最后的位置而得名。
2024-06-13 01:33:22
138
原创 经典排序算法_选择排序
选择排序是一种简单直观的排序算法,其基本思想是每次从待排序的数据中选择最小(或最大)的元素,将其放置在已排序部分的末尾(或开头),直到所有元素均已排序完成。
2024-06-13 01:19:20
161
原创 13_yield生成器
yield 类似于 return,会返回一个值。但不同的是,yield 会记住函数执行到的位置。下一次迭代时,从上次 yield 的位置继续执行。使用 yield,我们可以按需生成数据,每次调用生成器函数时返回一个值,就像排队取号一样。这样,我们可以逐步处理数据,而不是一次性获取所有数据。yield 关键字允许我们一次性处理大量数据时,避免一次性将所有资源都加载到内存中。第一次调用时必须先next()或send(None),否则会报错。send可以强行修改上一个yield表达式值。
2024-06-11 23:46:40
134
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人