Android逆向 NDK开发总结

NDK开发总结

  1. Jni接口: java native interface
  2. 作用:用于java/c/c++ 代码之间的交互
  3. 使用方法:
    1. jni静态注册
      1. 在java代码中定义native修饰的方法;
      2. 根据java中native修饰的方法生成头文件(SRC路径执行javah -jni);
      3. 编写c/c++代码,导入头文件,同时实现头文件中的方法;
      4. 编写两个mk文件: Android.mk文件 Application.mk文件(头文件/代码文件和两个mk放入jni目录);
      5. 来带指定目录(jni所在路径),生成so文件;
    2. 动态注册
      1. 在java代码中定义native修饰的方法;
      2. 新建c/c++文件,导入jni.h头文件,编写c/c++文件 ,实现java层被native修饰的方法;
      3. 通过JNINativeMethod结构体绑定java和c/c++方法;
      4. 通过RegisterNatives方法注册java相应的类以及方法;
      5. 把c/c++注册方法写入到JNI_onload(两个参数),注意: JNI_onload是系统调用;
      6. 来到指定路径(jni所在路径),ndk_build生成so文件;
  4. 两种注册方法有区别的对比
    • 静态注册:
      1. 编写不方便,jni方法名字必须遵循规则且名字比较长;
      2. 运行效率不高;
    • 动态注册:
      1. 流程清晰可控;
      2. 运行效率高

Android逆向 Android Studio JNI 快速构建项目+动态注册+简易计算器

本文转发语NCK大佬的博客,并且自己跟着做了一遍 有一点点不同 大致上是大佬的文章:
https://www.cnblogs.com/fuhua/p/12725771.html

前面几篇文章演示的是比较原始的创建JNI项目的方法,旨在了解JNI项目构建原理!
但是构建项目效率很低,开发,调试都存在很大的效率低下问题。
本篇文章将演示利用Android Studio快速构建JNI项目。本篇文章要点

通过SNI Proxy加速国内服务器的WordPress更新

相信很多在国内服务器搭建WordPress的同学都有过这样的烦恼:更新不成功,后台某些页面打卡非常慢,插件主题没法在线安装等等等等这些问题,而且如果你的服务器又因为某些因素不方便直接搭建$$r之类的软件来给它加速,每次手动下载安装包再上传安装会是一件非常头疼的事。

解决windows 无法访问指定设备、路径或文件。你可能没有适当的权限访问该项目。


文件权限出现了问题

下面是一些可用的命令行帮助恢复

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 取得目录和内容的所有权 可以将其范围缩小到要更改的特定项,具体取决于有多少项。
takeown /f C:\Windows\Web /r

# 授予自己完全的控制权 注意 %USERDOMAIN%\%USERNAME% 将自动替换为您的用户-所以这里无需在此替换任何内容
icacls C:\Windows\Web /grant "%USERDOMAIN%\%USERNAME%":(F) /t

# 恢复windows10默认的所有者
icacls c:\Windows\Web /setowner "NT SERVICE\TrustedInstaller" /t

# 删除授予的权限
icacls C:\Windows\Web /remove:g "%USERDOMAIN%\%USERNAME%":(F) /t

一种替代方法是保存和恢复ACL

解决WSL与windows的PATH环境变量冲突问题

如果在windows和wsl中都安装了python, 那么由于wsl的互交互特性, pienv的运行就会不太正常

以下是禁用互交互的步骤

WSL的终端中输入:

1
echo "[interop]\nenabled=false\nappendWindowsPath=false" | sudo tee /etc/wsl.conf

Powershell(以管理员身份运行)中输入: (以重启wsl)

1
2
net stop LxssManager
net start LxssManager

如果已知distro名, 可用wsl --terminate <distro名>终止特定的wsl distro

Android逆向-2 dalvik 指令集1

dalvik 指令集 1

dalvik 指令格式

1
基础字节码-名称后缀/字节码后缀 目的寄存器  源寄存器

说明:
名称后缀: wide 表示数据宽度位 64位
字节码后缀 : from16 表示的就是源寄存器为16位

Android逆向-1 dalvik字节码

1 .dalvik字节码

1 dalvik寄存器:

  • 32位: 所有寄存器
  • 64位: 使用两个相邻的寄存器

2 寄存器的命名法:

  • v : 局部变量寄存器 v0-vn 参数寄存器: vn-vn+m
  • p : 参数寄存器 p0-pn 变量寄存器 v0-vn

第一种

Emeditor可以用的激活码

Emeditor激活码

找来找去找不到可以用的
今天在网上找到一个

DMAZM-WHY52-AX222-ZQJXN-79JXH

Version 18.9.12
使用正常!

VMware Workstation 各系列激活码大全

VMware Workstation Pro 16 激活许可证

ZF3R0-FHED2-M80TY-8QYGC-NPKYF
YF390-0HF8P-M81RQ-2DXQE-M2UT6
ZF71R-DMX85-08DQY-8YMNC-PPHV8

VMware Workstation Pro 15 激活码

UY758-0RXEQ-M81WP-8ZM7Z-Y3HDA
VF750-4MX5Q-488DQ-9WZE9-ZY2D6
UU54R-FVD91-488PP-7NNGC-ZFAX6
YC74H-FGF92-081VZ-R5QNG-P6RY4
YC34H-6WWDK-085MQ-JYPNX-NZRA2

VMware Workstation Pro 14 激活码

FF31K-AHZD1-H8ETZ-8WWEZ-WUUVA
CV7T2-6WY5Q-48EWP-ZXY7X-QGUWD

VMware Workstation Pro 12 激活码

利用shell脚本检测网络状况实现电话或短信报警

腾讯云有语音接口 可以实现任务内容通知

https://console.cloud.tencent.com/sms

脚本如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/env bash

# /root/check/check.sh 脚本存放位置
# */5 * * * * /bin/bash /root/check/check.sh > /dev/null   cron命令

# 日志路径
LOGFILE=/root/check/check_ip.log

# 腾讯云语音appid
SDKAPPID="12345678"
# appkey
strAppKey="abcdefg"
# 语音模板
VOICE_TMP_ID=123456
# 通知的手机号
ALERT_PHONE=18888888888
# ping丢包触发百分比
GE_RATE=20

# 第一个参数为ping测试的ip
# 第二个参数为丢包率
# 第三个参数为通知的手机号
call_phone()
{
    # 模板: 接口{1}丢包率为{2},请在5分钟内处理!
    strMobile=$3
    strRand=$RANDOM
    strTime=$(date +%s)
    strSig="appkey=${strAppKey}&random=${strRand}&time=${strTime}&mobile=${strMobile}"
    sig=$(echo -n ${strSig} | sha256sum | cut -d " " -f 1)

    api_url="https://cloud.tim.qq.com/v5/tlsvoicesvr/sendtvoice?sdkappid=${SDKAPPID}&random=${strRand}"

    response=$(curl "${api_url}" \
        -H "Accept: application/json" \
        -H "Content-Type:application/json" \
        --data @<(cat <<EOF
{
  "tpl_id": ${VOICE_TMP_ID},
  "params": ["$1","$2"],
  "playtimes": 3,
  "sig": "${sig}",
  "tel": {
    "mobile": "${strMobile}",
    "nationcode": "86"
  },
  "time": ${strTime}
}
EOF
))
    echo ${response} >> ${LOGFILE}
}

# 第一个参数为 ping的ip
# 第二个参数为 失败切换的网卡名字
do_check()
{
    ip=$1 
    change_dev=$2
    date="`date "+%Y-%m-%d %H:%M:%S"`"
    lost_rate=`ping -c 8 -w 8 $ip | grep "packet loss" \
    | awk -F"packet loss" "{ print $1 }" \
    | awk "{ print $NF }" | sed "s/%//g"`

    if [ ${lost_rate} -eq 0 ] # 等于0
        then
            echo "network_ok 【${ip}】 【${date}】 " >> ${LOGFILE}
    elif [ ${lost_rate} -ge ${GE_RATE} ] # 大于等于10
        then
            echo "network_error loss 【${lost_rate}】 【${date}】 【${ip}" >> ${LOGFILE}
            # ip route change ${ip} dev ${change_dev}
            call_phone ${ip} ${lost_rate} ${ALERT_PHONE}
    else
        echo "network_check loss 【${lost_rate}】 【${date}】 【${ip}】 " >> ${LOGFILE}
    fi

}

IP_ARRAY[0]="10.3.3.2"
#IP_ARRAY[1]="10.3.3.2"

CHANGE_ARRAY[0]="wg1"
#CHANGE_ARRAY[1]="wg2"

for i in "${!IP_ARRAY[@]}"; do 
    check_ip=${IP_ARRAY[$i]}
    change_dev=${CHANGE_ARRAY[$i]}
    echo "check ip ${check_ip} change_dev ${change_dev}" >> ${LOGFILE}
    do_check ${check_ip} ${change_dev}
done

2019年1月7日更新 增加多用户报警

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#!/usr/bin/env bash

# /root/check/check.sh
# */5 * * * * /bin/bash /root/check/check.sh >> /dev/null

LOGFILE=/root/check/check_ip.log

# 腾讯云语音appid
SDKAPPID="12345678"
# appkey
strAppKey="abcdefghdawdawd"
# 语音模板
VOICE_TMP_ID=66666
# 通知的手机号
ALERT_PHONE[0]=16688868686
ALERT_PHONE[1]=13333333333
# 触发阈值 大于这个就会打电话报警
GE_RATE=5

# 第一个参数为模板的第一个参数 这里是网卡名称或者服务器所在地区
# 第二个参数为丢包率
# 第三个参数为通知的手机号
call_phone()
{
        # call_message="专线接口$1丢包率百分之$2"
        strMobile=$3
        strRand=$RANDOM
        strTime=$(date +%s)
        strSig="appkey=${strAppKey}&random=${strRand}&time=${strTime}&mobile=${strMobile}"
        sig=$(echo -n ${strSig} | sha256sum | cut -d " " -f 1)

        api_url="https://cloud.tim.qq.com/v5/tlsvoicesvr/sendtvoice?sdkappid=${SDKAPPID}&random=${strRand}"

        response=$(curl "${api_url}" \
                -H "Accept: application/json" \
                -H "Content-Type:application/json" \
                --data @<(cat <<EOF
{
  "tpl_id": ${VOICE_TMP_ID},
  "params": ["$1","$2"],
  "playtimes": 3,
  "sig": "${sig}",
  "tel": {
    "mobile": "${strMobile}",
    "nationcode": "86"
  },
  "time": ${strTime}
}
EOF
))
        echo ${response} >> ${LOGFILE}
}

# 第一个参数为 ping的ip
# 第二个参数为 失败切换的网卡名字
do_check()
{
        ip=$1
        change_dev=$2
        date="`date "+%Y-%m-%d %H:%M:%S"`"
        lost_rate=`ping -c 100 -w 100 $ip | grep "packet loss" \
        | awk -F"packet loss" "{ print $1 }" \
        | awk "{ print $NF }" | sed "s/%//g"`

        if [ ${lost_rate} -eq 0 ] # 等于0
                then
                        echo "network_ok 【${ip}】 【${date}】 " >> ${LOGFILE}
        elif [ ${lost_rate} -ge ${GE_RATE} ] # 大于等于10
                then
                        echo "network_error loss 【${lost_rate}】 【${date}】 【${ip}" >> ${LOGFILE}
                        # ip route change ${ip} dev ${change_dev}
            for index in "${!ALERT_PHONE[@]}"; do
                alert_phone_index=${ALERT_PHONE[$index]}
                call_phone ${change_dev} ${lost_rate} ${alert_phone_index}
            done
        else
                echo "network_check loss 【${lost_rate}】 【${date}】 【${ip}】 " >> ${LOGFILE}
        fi

}

#ping的网管
IP_ARRAY[0]="10.200.200.101"
#IP_ARRAY[1]="10.3.3.2"

#网关的名字
CHANGE_ARRAY[0]="上海端"
#CHANGE_ARRAY[1]="wg2"

for i in "${!IP_ARRAY[@]}"; do
        check_ip=${IP_ARRAY[$i]}
        change_dev=${CHANGE_ARRAY[$i]}
        #echo "check ip ${check_ip} change_dev ${change_dev}" >> ${LOGFILE}
    do_check ${check_ip} ${change_dev}
done

硬编码-什么是硬编码

二进制编辑工具打开exe

图中可以看出程序都是由二进制数据组成

无论多么复杂的程序都只包含两部分,数据和指令。数据和指令的划分并没有明显的界限。具体取决于EIP 指令是有自己的格式。

PE文件解析 入门篇

前言 - PE文件解析 系列文章的第二篇,上一篇参考:PE文件解析 基础篇

  • 介绍区块头表和区块
  • 解析出区段表 完成RVA转FOA的功能
  • 解析出数据目录表各种表的位置和大小
  • 源码放在附件

1.区块头表 - pe文件头与原始数据之间存在一个区块表,区块表包含了每个块在映像(内存)中的信息,分别指向不同的区块实体。