四期day36 打包和其他

发布时间 2023-06-26 18:03:41作者: 凫弥

day36 打包和其他

今日概要:

  • exe打包
  • 离线包
  • 其他分享

1.exe打包

pip install pyinstaller

注意事项:

  • 支持mac、win(windows建议使用python3.6.8)。

  • 配合虚拟环境打包。

    - 项目crm
    - 环境crm
    	- python.exe
    	- Scripts
    		- pip.exe
    		- pyinstaller.exe
    	- Lib
    		- site-package
    			- requests
    			- flask
    			- pyinstaller
    			
    			
    >>>激活虚拟环境(pycharm打开终端默认激活)
    >>>环境crm/Scripts/pip.exe install pyinstaller
    >>>cd 项目目录
    >>>环境crm/Scripts/pyinstaller ....
    

1.1 多文件 -D

pyinstaller  -D  app.py

image-20220412203400525

注意:如果想看程序报错,先打开终端,在输入exe文件的路径即可。

1.2 单文件 -F

pyinstaller -F app.py

image-20220412204046080

pyinstaller  -D  app.py -n  哔哩
pyinstaller  -F app.py  -n 哔哩

1.3 路径问题

image-20220412204916312

  • 多文件打包,不会报错。

  • 单文件打包,报错。

    为什么会报错?加载&解析到临时目录问题。
    

1.3.1 sys.argv

image-20220412210014110

1.3.2 frozen

image-20220412210041666

import sys
if getattr(sys, 'frozen', False): # True
    print('running in a PyInstaller bundle')
else: # False
    print('running in a normal Python process')
import time
import os
import sys

if getattr(sys, 'frozen', False):
    # pyinstaller打开
    BASE_DIR = os.path.dirname(sys.executable)
else:
    # py文件路径
    BASE_DIR = os.path.dirname(os.path.abspath(__file__))

print("----环境使用xxx系统----")

with open(os.path.join(BASE_DIR, "account.txt"), mode='r', encoding='utf-8') as f:
    data = f.read().strip()
print(data)

time.sleep(5)

1.4 关于模块

image-20220412210843613

但是,如果遇到那种动态导入模块的代码时,他是无法找到关联的包。

import time
import importlib

print("----环境使用xxx系统----")

# from utils import card
# card.get_number()

card = importlib.import_module("utils.card")
v1 = card.get_number()
print(v1)

time.sleep(5)

image-20221103221630065

1.5 pyqt

pyinstaller -F v1.py

默认打包qt程序时,打开的同时会一直出现终端。

image-20221103154050690

如果不想让他出现,那就是在打包时设置一个参数:

pyinstaller -F v1.py -w

image-20221103154403559

1.6 图标

在打包时,加入 -i 参数可以展示图标(内部需要依赖pillow模块将图片转换为icon)

pip install pillow
pyinstaller -F v1.py -w  -i  tt.png

image-20221103155006204

2.离线包

2.1 在线环境

当项目开发完成之后,我们会使用pip freeze将环境中依赖包写入到requirements.txt中。

pip freeze > requirements.txt

后期项目部署时,安装依赖包。

pip install -r requirements.txt

2.2 离线环境

使用pip download将依赖包下载到本地目录。

pip download -d 包文件夹 -r requirements.txt

后期项目部署时,安装依赖包:

pip install --no-index --find-links=包文件夹 -r requirements.txt
pip install --no-index --find-links=pkg -r requirements.txt

3.其他分享

识货app,反调试(监测是否用frida)。

一般情况下反调试实现:在so层,内部创建一个线程不断监测设备是否正在被调试(监测frida、xposed等调试时出现的目录、关键字等)。

如果想要绕过调试,可以做如下尝试:

  • 删除相应so文件。
  • hook指定so文件中的线程,让他不要运行监测。
  • hook底层字符串比较方法strstr,如果出现关键字让他跳过(底层肯定会判断是否包含frida等关键字)。

3.1 dlopen

在安卓系统底层是使用dlopenandroid_dlopen_ext加载动态链接库(so文件),所以我们可以hook这俩函数,看看他们底层都加在了哪些so文件。

function showLoadSoFile() {
    var dlopen = Module.findExportByName(null, "dlopen");
    var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");

    Interceptor.attach(dlopen, {
        onEnter: function (args) {
            var path_ptr = args[0];
            var path = ptr(path_ptr).readCString();
            console.log("[dlopen:]", path);
        }, onLeave: function (retval) {

        }
    });

    Interceptor.attach(android_dlopen_ext, {
        onEnter: function (args) {
            var path_ptr = args[0];
            var path = ptr(path_ptr).readCString();
            console.log("[dlopen_ext:]", path);
        }, onLeave: function (retval) {

        }
    });
}

showLoadSoFile();
// frida -U -f com.hupu.shihuo -l load_so_file.js
// frida -U -f com.hupu.shihuo -l load_so_file.js --no-pause

得到加载的so文件》

[M2007J17C::com.hupu.shihuo]-> [dlopen_ext:] /system/framework/oat/arm64/org.apache.http.legacy.odex
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/oat/arm64/base.odex
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libldp.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libmmkv.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libdusanwa.so
[dlopen_ext:] /system/framework/oat/arm64/gson.odex
[dlopen_ext:] /data/dalvik-cache/arm64/system@priv-app@RtMiCloudSDK@RtMiCloudSDK.apk@classes.dex
[dlopen_ext:] /data/dalvik-cache/arm64/system@app@MiuiContentCatcher@MiuiContentCatcher.apk@classes.dex
[dlopen_ext:] /data/dalvik-cache/arm64/system@app@CatcherPatch@CatcherPatch.apk@classes.dex
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libsh_security.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libszstone.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libKwAppGuardSDK.so
[dlopen_ext:] /data/dalvik-cache/arm64/product@app@TrichromeLibrary@TrichromeLibrary.apk@classes.dex
[dlopen_ext:] /data/dalvik-cache/arm64/product@app@WebViewGoogle@WebViewGoogle.apk@classes.dex
[dlopen_ext:] libmonochrome.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libsgmainso-5.5.82.so
[dlopen_ext:] /product/app/WebViewGoogle/WebViewGoogle.apk!/lib/arm64-v8a/libmonochrome.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libcrashsdk.so
[dlopen:] libc.so
[dlopen_ext:] /system/lib64/libwebviewchromium_plat_support.so
[dlopen_ext:] /vendor/lib64/hw/gralloc.lito.so
[dlopen_ext:] /vendor/lib64/hw/android.hardware.graphics.mapper@3.0-impl-qti-display.so
[dlopen:] libadreno_app_profiles.so
[dlopen:] libEGL_adreno.so
[dlopen:] libGLESv2_adreno.so
[dlopen:] libGLESv1_CM_adreno.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libumeng-spy.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libBugly.so
[dlopen_ext:] /vendor/lib64/hw/android.hardware.graphics.mapper@3.0-impl-qti-display.so
[dlopen:] libadreno_utils.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libc++_shared.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libbcmarsxlog.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libttlicense2.so
[dlopen:] librs_jni.so
[dlopen_ext:] /vendor/lib64/hw/android.hardware.renderscript@1.0-impl.so
[dlopen:] libRS_internal.so
[dlopen:] libRSDriver_adreno.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libsgsecuritybodyso-5.5.92.so
[dlopen:] libllvm-qcom.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libvideodec.so
[dlopen:] librs_adreno_sha1.so
[dlopen:] /system/lib64/libc.so
[dlopen:] libRSCacheDir.so
[dlopen:] /product/app/WebViewGoogle/WebViewGoogle.apk!/lib/arm64-v8a/libmonochrome.so
[dlopen:] /system/lib64/libc.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libttcrypto.so
[dlopen:] /system/lib64/libc.so
[dlopen:] libc.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libttboringssl.so
[dlopen:] libc.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libvcn.so
[dlopen:] libmediandk.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libvcnverify.so
[dlopen:] libandroid.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libvcnverifylite.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libavmdlbase.so
[dlopen:] libandroid.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libavmdl.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libjsengine-loadso.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libsgmiddletierso-5.5.79.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libvcnverify.so
[dlopen_ext:] /data/user/0/com.hupu.shihuo/app_plugins_lib/libv8uc.so
[dlopen_ext:] /data/user/0/com.hupu.shihuo/app_ucmsdk/updates/1627372867/20362402_0/lib/arm64-v8a/libwebviewuc.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libjsengine-platform.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libjsengine-api.so
[dlopen:] libc.so
[dlopen:] libandroid.so
[dlopen_ext:] /data/user/0/com.hupu.shihuo/app_ucmsdk/updates/1627372867/20362402_0/lib/arm64-v8a/libjsi.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libv8worker-native.so
[dlopen:] libGLESv2.so
[dlopen:] libEGL.so
[dlopen:] libGLESv2_adreno.so
[dlopen:] libGLESv1_CM_adreno.so
[dlopen:] libc.so
[dlopen:] libc.so
[dlopen_ext:] /data/app/com.hupu.shihuo-hA7O7wotAbGFn9QsyVjIBw==/lib/arm64/libmsaoaidsec.so
Process terminated
[M2007J17C::com.hupu.shihuo]->

由于加载了libmsaoaidsec.so,才导致程序终止,所以可以尝试:

  • 删除libmsaoaidsec.so

  • hook系统创建线程的方法,如果是次so文件则不创建线程。

    function hook_pthread_create() {
        var pt_create_func = Module.findExportByName("libc.so", 'pthread_create');
    
        Interceptor.attach(pt_create_func, {
            onEnter: function (args) {
                // 是那个so文件调用我,创建线程
                var so_name = Process.findModuleByAddress(args[2]).name;
                if (so_name.indexOf("libsgmainso") != -1 || so_name.indexOf("libmsaoaidsec") != -1 || so.indexOf("libavmdl") != -1) {
                    
                    try {
                        Interceptor.replace(args[2], new NativeCallback(function () {
                            console.log('replace success');
                            return null;
                        }, 'void', ["void"]));
                    } catch (e) {
    
                    }
                    
                }
            }, onLeave: function (retval) {
            }
        })
    }
    
    hook_pthread_create();
    // frida -U -f com.hupu.shihuo -l hook_so_thread.js --no-pause
    // frida -U -f com.hupu.shihuo -l hook_so_thread.js
    

3.2 strstr

function replace_str() {
    var pt_strstr = Module.findExportByName("libc.so", 'strstr');
    var pt_strcmp = Module.findExportByName("libc.so", 'strcmp');


    Interceptor.attach(pt_strstr, {
        onEnter: function (args) {
            var str1 = args[0].readCString();
            
            var str2 = args[1].readCString();
            if (str2.indexOf("tmp") !== -1 || str2.indexOf("frida") !== -1 || str2.indexOf("gum-js-loop") !== -1 || str2.indexOf("gmain") !== -1 || str2.indexOf("linjector") !== -1) {
                console.log("strcmp-->", str1, str2);
                this.hook = true;
            }
        }, onLeave: function (retval) {
            if (this.hook) {
                retval.replace(0);
            }
        }
    });


    Interceptor.attach(pt_strcmp, {
        onEnter: function (args) {
            var str1 = args[0].readCString();
            var str2 = args[1].readCString();
            if (str2.indexOf("tmp") !== -1 || str2.indexOf("frida") !== -1 || str2.indexOf("gum-js-loop") !== -1 || str2.indexOf("gmain") !== -1 || str2.indexOf("linjector") !== -1) {
                //console.log("strcmp-->", str1, str2);
                this.hook = true;
            }
        }, onLeave: function (retval) {
            if (this.hook) {
                retval.replace(0);
            }
        }
    })

}

replace_str();
// frida -U -f com.hupu.shihuo -l hook_str.js --no-pause -o v1.txt
// frida -U -f com.hupu.shihuo -l hook_str.js -o v1.txt