<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[Viewz的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/Viewz</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; Viewz]]></copyright><item><title><![CDATA[定制ART跟踪JNI函数绑定]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/115339384</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/115339384</guid><author>Viewz</author><pubDate>Wed, 31 Mar 2021 00:32:48 +0800</pubDate><description><![CDATA[JNI函数的绑定：每一个JAVA层函数在native层都对应一个ArtMethod对象，JNI函数在执行前必须完成JNI函数所在类的加载和初始化、以及该JNI函数的ArtMethod对象当中属性和So中具体函数地址的绑定。

JNI函数绑定的分类：

1、静态：

两次绑定，第一次是在类加载的时候，会绑定到Art中的“桥函数”；第二次绑定是在该Jni函数第一次被真正调用时候，由Art完后该JNI函数在So中地址的查询以及绑定。

art_jni_dlsym_looup_stub_(汇编实现)-&gt;...]]></description><category></category></item><item><title><![CDATA[ART中的内联函数笔记]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/115175216</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/115175216</guid><author>Viewz</author><pubDate>Wed, 24 Mar 2021 14:20:50 +0800</pubDate><description><![CDATA[inline用来定义一个类的内联函数，用它来替代C中表达式形式的宏定义，而且消除宏定义缺点。可以解决一些频繁调用的函数大量消耗栈空间问题。它是一种实现关键字，就是在函数实现的地方加上inline关键字才有用，在声明的地方加没有用。

同时它只是一种建议，编译器可以忽略这个建议。因此Inline不一定就会被编译器内联编译。保证内联函数的定义被编译器看到的话，使用 ALWAYS_INLINE。

内联函数在编译器最终生成的代码中是没有定义的，这个函数是不存在的，也就无法实现对内联函数的hook;

内联函数没有]]></description><category></category></item><item><title><![CDATA[ART中的C++对象内存布局]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/115145695</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/115145695</guid><author>Viewz</author><pubDate>Wed, 24 Mar 2021 00:23:44 +0800</pubDate><description><![CDATA[C++11中的类所占内存大小主要是由成员变量（静态成员变量除外）决定的，成员函数（虚函数除外）是不计算在内的。

空类的占用存储空间。

class NUllclass {}；

NUllclass nullclass;

64和32位下sizeof的返回值都为1。因为C++要求每个实例在内存中都有独一无二的地址。

对齐的影响：


class Base{
 private:
     int a;//四字节
    char p ;//一字节
};

Base base;
sizeof(base)；

]]></description><category></category></item><item><title><![CDATA[C++11笔记]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/114759910</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/114759910</guid><author>Viewz</author><pubDate>Sat, 13 Mar 2021 20:56:30 +0800</pubDate><description><![CDATA[C++引用和指针


int  int_b = 124; 
int *int_b_ptr = &amp;int_b;
int &amp;int_c = int_b;
*int_b_ptr=126;
cout&lt;&lt;int_b;
int_c=128;
cout&lt;&lt;int_b;


最后分别打印126 128

引用和指针在某种程度上没有区别。

nullptr

目的：解决NULL带来的二义性问题

void func(int){

count&lt;&lt;"1";

}

void .]]></description><category></category></item><item><title><![CDATA[FART与frida结合]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/114693822</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/114693822</guid><author>Viewz</author><pubDate>Sat, 13 Mar 2021 01:23:03 +0800</pubDate><description><![CDATA[1、优点：

1、对FART的脱壳能力增强，对主动调用的dex（没有初始函数）进行脱壳


function fartwithClassloader() {
    Java.perform(function () {

        Java.choose("dalvik.system. ", {

            onMatch: function (instance) {
                console.log(instance);

                try ]]></description><category></category></item><item><title><![CDATA[android源码编译笔记--踩坑]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/114388530</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/114388530</guid><author>Viewz</author><pubDate>Fri, 05 Mar 2021 11:45:40 +0800</pubDate><description><![CDATA[错误：ninja: build stopped: subcommand failed.

解决：

打开prebuilts/sdk/tools/jack-admin

找到JACK_SERVER_COMMAND="java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=$TMPDIR  $JACK_SERVER_VM_ARGUMENTS -cp $LAUNCHER_JAR $LAUNCHER_NAME"

修改为JACK_SERVER_COMMAN...]]></description><category></category></item><item><title><![CDATA[pwndbg调试笔记]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/113881225</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/113881225</guid><author>Viewz</author><pubDate>Sat, 20 Feb 2021 13:37:28 +0800</pubDate><description><![CDATA[hyperpwn：

hyper和pwndbg启动，启动64/32gdbserver: ./gdbserver 0.0.0.0:23946 -attach pid ,pwndbg:target remote 192.168.0.183:23946

然后pwndbg设置架构:set arch arm,set arm fallback-mode thumb

c（运行到下一个断点） r（继续运行） ctrl+c暂停 info share查看所有加载的so

nm -s so_name |grep m...]]></description><category></category></item><item><title><![CDATA[Android IDA 动态调试so（过掉JNI_Onload调试检测）笔记]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/97757862</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/97757862</guid><author>Viewz</author><pubDate>Tue, 30 Jul 2019 11:46:28 +0800</pubDate><description><![CDATA[链接：https://pan.baidu.com/s/1oOH9RgukXJcXianq8jgYhg
提取码：5lzf
这个是我调试的样本APK，是阿里逆向前几年的一道题。

拿到APK，先用apktool 解包

apktool d ali.apk ,解包之后打开文件夹发现存在so文件，于是用JEB或者android killer打开APK





先查找入口主类，发现是com.yaoto...]]></description><category></category></item><item><title><![CDATA[android 反调试（TracePid 不断轮询检查  JAVA ）]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/90649151</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/90649151</guid><author>Viewz</author><pubDate>Tue, 28 May 2019 23:34:01 +0800</pubDate><description><![CDATA[在android 中，在调试状态下，linux会向/proc/"进程PID"/status 中写入状态信息。其中TracePid 就是调试该进程的进程的的Pid，所以反调试的方法之一就是通过不断轮询检查TracePid的值，假如为0的话，说明该进程没有被调试，假如不为0的话，就说明当前该进程正在被调试，程序执行exit(0)操作。



我直接用一个类来包装我的adb shell：

先通过get...]]></description><category></category></item><item><title><![CDATA[android adb命令]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/90639884</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/90639884</guid><author>Viewz</author><pubDate>Tue, 28 May 2019 15:11:49 +0800</pubDate><description><![CDATA[进入tmp文件夹，查看文件权限



查看正在运行进程



通过进程pid查看进程状态



TracePid =0 表示没有进程在调试该进程
]]></description><category></category></item><item><title><![CDATA[如何将权限777赋予手机文件夹中的某个文件]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/90538747</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/90538747</guid><author>Viewz</author><pubDate>Sat, 25 May 2019 02:18:48 +0800</pubDate><description><![CDATA[文件权限：
444 r--r--r--
600 rw-------
644 rw-r--r--
666 rw-rw-rw-
700 rwx------
744 rwxr--r--
755 rwxr-xr-x
777 rwxrwxrwx

从左至右，1-3位数字代表文件所有者的权限，4-6位数字代表同组用户的权限，7-9数字代表其他用户的权限。
而具体的权限是由数字来表示的，读取的权限等于4，用r表...]]></description><category></category></item><item><title><![CDATA[如何让电脑共存JDK1.7 和JDK1.8]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/90525736</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/90525736</guid><author>Viewz</author><pubDate>Sat, 25 May 2019 00:22:56 +0800</pubDate><description><![CDATA[当电脑先装上JDK1.7，再装JDK1.8后。打开CMD输入 java -version,显示的版本是JDK1.8。

此时想要将JDK在版本1.8和1.7之间切换的话，需要打开环境变量设置，找到系统环境变量PATH。将第一行删除（JDK1.8安装成功后会在第一行目录下自动放置java.exe,javaw.exe,javaws.exe，而不是在system32文件夹下）



然后为JDK1.7...]]></description><category></category></item><item><title><![CDATA[406. Queue Reconstruction by Height（根据身高重建队列）中等难度]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/81412232</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/81412232</guid><author>Viewz</author><pubDate>Sat, 04 Aug 2018 16:26:26 +0800</pubDate><description><![CDATA[假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示，其中h是这个人的身高，k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。

注意：
总人数少于1100人。

示例


输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,...]]></description><category></category></item><item><title><![CDATA[111. Minimum Depth of Binary Tree 二叉树的最小深度]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/80989336</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/80989336</guid><author>Viewz</author><pubDate>Tue, 10 Jul 2018 17:34:42 +0800</pubDate><description><![CDATA[给定一个二叉树，找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明: 叶子节点是指没有子节点的节点。我的思路就是遍历二叉树。找到叶子节点的深度，然后排序，输出最小值即可/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 ...]]></description><category></category></item><item><title><![CDATA[572. Subtree of Another Tree(另一个树的子树)]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/80976713</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/80976713</guid><author>Viewz</author><pubDate>Mon, 09 Jul 2018 20:28:01 +0800</pubDate><description><![CDATA[给定两个非空二叉树 s 和 t，检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。我最开始的思路是中序遍历两个树，依次放入两个个vector res temp 里面，然后看temp 是否在res里面，在的话返回true,不在的话返回false.但是这种思路有种致命的错误：就是第二张图返回的是false;所...]]></description><category></category></item><item><title><![CDATA[Aun in Scu]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/80951412</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/80951412</guid><author>Viewz</author><pubDate>Sat, 07 Jul 2018 14:53:07 +0800</pubDate><description><![CDATA[嘻嘻]]></description><category></category></item><item><title><![CDATA[680. 验证回文字符串 Ⅱ]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/80695366</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/80695366</guid><author>Viewz</author><pubDate>Thu, 14 Jun 2018 17:37:38 +0800</pubDate><description><![CDATA[给定一个非空字符串 s，最多删除一个字符。判断是否能成为回文字符串。示例 1:输入: &quot;aba&quot;
输出: True
示例 2:输入: &quot;abca&quot;
输出: True
解释: 你可以删除c字符。
注意:字符串只包含从 a-z 的小写字母。字符串的最大长度是50000。static const auto ____= [](){
ios::sync_with_stdio(false);
    cin....]]></description><category></category></item><item><title><![CDATA[C++中的STL中map用法详解]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/80691333</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/80691333</guid><author>Viewz</author><pubDate>Thu, 14 Jun 2018 13:01:25 +0800</pubDate><description><![CDATA[Map是STL的一个关联容器，它提供一对一（其中第一个可以称为关键字，每个关键字只能在map中出现一次，第二个可能称为该关键字的值）的数据 处理能力，由于这个特性，它完成有可能在我们处理一对一数据的时候，在编程上提供快速通道。这里说下map内部数据的组织，map内部自建一颗红黑树(一 种非严格意义上的平衡二叉树)，这颗树具有对数据自动排序的功能，所以在map内部所有的数据都是有序的，后边我们会见识...]]></description><category></category></item><item><title><![CDATA[cin.tie与sync_with_stdio加速输入输出]]></title><link>https://blog.youkuaiyun.com/Viewz/article/details/80691247</link><guid>https://blog.youkuaiyun.com/Viewz/article/details/80691247</guid><author>Viewz</author><pubDate>Thu, 14 Jun 2018 12:49:18 +0800</pubDate><description><![CDATA[我是怎么在不知道这一对函数的情况下活到今天的，以前碰到cin TLE的时候总是傻乎乎地改成scanf，甚至还相信过C++在IO方面效率低下的鬼话，殊不知这只是C++为了兼容C而采取的保守措施。tietie是将两个stream绑定的函数，空参数的话返回当前的输出流指针。#include &amp;lt;iostream&amp;gt;#include &amp;lt;fstream&amp;gt; ////////////////...]]></description><category></category></item></channel></rss>