#!/bin/bash

# =============================================
# 判官标准版 - APK体积随机增加工具
# 通过添加随机数据改变APK文件特征
# =============================================

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[1;34m'
CYAN='\033[0;36m'
NC='\033[0m'

# 输出目录
OUTPUT_DIR="./output"
TEMP_DIR="./temp_volume"
mkdir -p "$OUTPUT_DIR"

# 随机字符串生成
generate_random_string() {
    local length=$1
    cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w $length | head -n 1
}

# 生成随机文件内容
generate_random_content() {
    local size=$1  # KB
    dd if=/dev/urandom bs=1024 count=$size 2>/dev/null | base64
}

# 清理临时文件
cleanup() {
    rm -rf "$TEMP_DIR" 2>/dev/null
}

# 获取APK文件大小（MB）
get_file_size_mb() {
    local file=$1
    local size_bytes=$(stat -c%s "$file" 2>/dev/null || stat -f%z "$file" 2>/dev/null)
    echo "scale=2; $size_bytes / 1048576" | bc
}

# 增加APK体积
increase_apk_volume() {
    local input_apk=$1
    local min_kb=$2
    local max_kb=$3
    
    if [ ! -f "$input_apk" ]; then
        echo -e "${RED}错误: APK文件不存在: $input_apk${NC}"
        return 1
    fi
    
    # 随机增加的大小
    local add_size=$((RANDOM % (max_kb - min_kb + 1) + min_kb))
    
    echo -e "${BLUE}========================================${NC}"
    echo -e "${BLUE}  判官标准版 - APK体积随机增加工具${NC}"
    echo -e "${BLUE}========================================${NC}"
    echo ""
    
    local original_size=$(get_file_size_mb "$input_apk")
    echo -e "${CYAN}输入文件: ${GREEN}$input_apk${NC}"
    echo -e "${CYAN}原始大小: ${GREEN}${original_size} MB${NC}"
    echo -e "${CYAN}增加大小: ${GREEN}${add_size} KB${NC}"
    echo ""
    
    # 创建临时目录
    cleanup
    mkdir -p "$TEMP_DIR"
    
    # 解压APK
    echo -e "${YELLOW}[1/5] 解压APK文件...${NC}"
    unzip -q "$input_apk" -d "$TEMP_DIR"
    if [ $? -ne 0 ]; then
        echo -e "${RED}解压失败${NC}"
        cleanup
        return 1
    fi
    
    # 创建assets目录（如果不存在）
    mkdir -p "$TEMP_DIR/assets"
    
    # 生成随机数据文件
    echo -e "${YELLOW}[2/5] 生成随机数据文件...${NC}"
    
    # 方法1: 在assets目录添加随机文件
    local random_files=$((RANDOM % 5 + 3))  # 3-7个随机文件
    local remaining_kb=$add_size
    
    for i in $(seq 1 $random_files); do
        if [ $remaining_kb -le 0 ]; then
            break
        fi
        
        # 每个文件随机大小
        local file_size=$((RANDOM % (remaining_kb / 2 + 1) + 1))
        if [ $file_size -gt $remaining_kb ]; then
            file_size=$remaining_kb
        fi
        remaining_kb=$((remaining_kb - file_size))
        
        # 随机文件名和扩展名
        local extensions=("dat" "bin" "cfg" "res" "db" "cache" "tmp" "bak")
        local ext=${extensions[$RANDOM % ${#extensions[@]}]}
        local filename="$(generate_random_string 8)_$(date +%s%N | cut -c1-10).$ext"
        
        # 生成随机内容
        dd if=/dev/urandom of="$TEMP_DIR/assets/$filename" bs=1024 count=$file_size 2>/dev/null
        echo -e "  ${GREEN}✓${NC} 添加文件: assets/$filename (${file_size}KB)"
    done
    
    # 方法2: 修改现有资源文件（添加注释）
    echo -e "${YELLOW}[3/5] 修改资源文件特征...${NC}"
    
    # 在XML文件中添加随机注释
    find "$TEMP_DIR" -name "*.xml" -type f 2>/dev/null | head -10 | while read xml_file; do
        if [ -f "$xml_file" ]; then
            # 在文件末尾添加随机注释
            local random_comment="<!-- $(generate_random_string 32) -->"
            echo "$random_comment" >> "$xml_file"
        fi
    done
    echo -e "  ${GREEN}✓${NC} 已修改XML文件特征"
    
    # 方法3: 在META-INF添加随机文件
    mkdir -p "$TEMP_DIR/META-INF"
    local meta_filename="$(generate_random_string 6).$(generate_random_string 3)"
    echo "$(generate_random_string 128)" > "$TEMP_DIR/META-INF/$meta_filename"
    echo -e "  ${GREEN}✓${NC} 添加META-INF随机文件"
    
    # 重新打包APK
    echo -e "${YELLOW}[4/5] 重新打包APK...${NC}"
    local output_name=$(basename "$input_apk" .apk)
    local timestamp=$(date +%Y%m%d_%H%M%S)
    local output_apk="$OUTPUT_DIR/${output_name}_volume_${timestamp}.apk"
    
    # 删除原签名
    rm -rf "$TEMP_DIR/META-INF/CERT.RSA" "$TEMP_DIR/META-INF/CERT.SF" "$TEMP_DIR/META-INF/MANIFEST.MF" 2>/dev/null
    
    cd "$TEMP_DIR"
    zip -r -q "../temp_output.apk" .
    cd ..
    mv temp_output.apk "$output_apk"
    
    if [ ! -f "$output_apk" ]; then
        echo -e "${RED}打包失败${NC}"
        cleanup
        return 1
    fi
    
    # 显示结果
    echo -e "${YELLOW}[5/5] 处理完成!${NC}"
    echo ""
    
    local new_size=$(get_file_size_mb "$output_apk")
    
    echo -e "${BLUE}========================================${NC}"
    echo -e "${GREEN}✓ APK体积增加成功!${NC}"
    echo -e "  原始大小: ${CYAN}${original_size} MB${NC}"
    echo -e "  新大小: ${CYAN}${new_size} MB${NC}"
    echo -e "  输出文件: ${CYAN}$output_apk${NC}"
    echo -e "${BLUE}========================================${NC}"
    echo ""
    echo -e "${YELLOW}注意: 输出的APK需要重新签名后才能安装${NC}"
    
    # 清理
    cleanup
    return 0
}

# 批量处理APK
batch_process() {
    local input_dir=$1
    local min_kb=$2
    local max_kb=$3
    
    echo -e "${BLUE}批量处理目录: $input_dir${NC}"
    
    local count=0
    for apk in "$input_dir"/*.apk; do
        if [ -f "$apk" ]; then
            echo ""
            echo -e "${YELLOW}处理: $(basename $apk)${NC}"
            increase_apk_volume "$apk" $min_kb $max_kb
            ((count++))
        fi
    done
    
    echo ""
    echo -e "${GREEN}批量处理完成! 共处理 $count 个APK${NC}"
}

# 主菜单
show_menu() {
    echo -e "${BLUE}========================================${NC}"
    echo -e "${BLUE}  判官标准版 - APK体积随机增加工具${NC}"
    echo -e "${BLUE}========================================${NC}"
    echo ""
    echo -e "请选择操作:"
    echo -e "  ${GREEN}1.${NC} 处理单个APK (增加100-500KB)"
    echo -e "  ${GREEN}2.${NC} 处理单个APK (自定义增加量)"
    echo -e "  ${GREEN}3.${NC} 批量处理APK"
    echo -e "  ${GREEN}4.${NC} 查看输出目录"
    echo -e "  ${GREEN}0.${NC} 退出"
    echo ""
    echo -n "请输入选项 [0-4]: "
}

# 主函数
main() {
    while true; do
        show_menu
        read -r option
        case $option in
            1)
                echo -n "请输入APK文件路径: "
                read -r apk_path
                increase_apk_volume "$apk_path" 100 500
                ;;
            2)
                echo -n "请输入APK文件路径: "
                read -r apk_path
                echo -n "请输入最小增加量(KB): "
                read -r min_kb
                echo -n "请输入最大增加量(KB): "
                read -r max_kb
                increase_apk_volume "$apk_path" $min_kb $max_kb
                ;;
            3)
                echo -n "请输入APK目录路径: "
                read -r dir_path
                echo -n "请输入最小增加量(KB) [默认100]: "
                read -r min_kb
                min_kb=${min_kb:-100}
                echo -n "请输入最大增加量(KB) [默认500]: "
                read -r max_kb
                max_kb=${max_kb:-500}
                batch_process "$dir_path" $min_kb $max_kb
                ;;
            4)
                echo -e "${CYAN}输出目录内容:${NC}"
                ls -la "$OUTPUT_DIR"/*.apk 2>/dev/null || echo "暂无输出文件"
                ;;
            0)
                cleanup
                echo -e "${GREEN}再见!${NC}"
                exit 0
                ;;
            *)
                echo -e "${RED}无效选项${NC}"
                ;;
        esac
        echo ""
        echo -n "按回车继续..."
        read
        clear
    done
}

# 检查依赖
check_dependencies() {
    local missing=0
    
    if ! command -v unzip &> /dev/null; then
        echo -e "${RED}缺少依赖: unzip${NC}"
        missing=1
    fi
    
    if ! command -v zip &> /dev/null; then
        echo -e "${RED}缺少依赖: zip${NC}"
        missing=1
    fi
    
    if ! command -v bc &> /dev/null; then
        echo -e "${YELLOW}警告: 缺少bc命令，文件大小计算可能不准确${NC}"
    fi
    
    if [ $missing -eq 1 ]; then
        echo -e "${RED}请先安装缺失的依赖${NC}"
        exit 1
    fi
}

# 运行
check_dependencies
main
