目录
今日概要:
-
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
注意:如果想看程序报错,先打开终端,在输入exe文件的路径即可。
1.2 单文件 -F
pyinstaller -F app.py
pyinstaller -D app.py -n 哔哩 pyinstaller -F app.py -n 哔哩
1.3 路径问题
-
多文件打包,不会报错。
-
单文件打包,报错。
为什么会报错?加载&解析到临时目录问题。
1.3.1 sys.argv
1.3.2 frozen
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 关于模块
但是,如果遇到那种动态导入模块的代码时,他是无法找到关联的包。
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)
1.5 pyqt
pyinstaller -F v1.py
默认打包qt程序时,打开的同时会一直出现终端。
如果不想让他出现,那就是在打包时设置一个参数:
pyinstaller -F v1.py -w
1.6 图标
在打包时,加入 -i
参数可以展示图标(内部需要依赖pillow模块将图片转换为icon)
pip install pillow
pyinstaller -F v1.py -w -i tt.png
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 wheel
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
在安卓系统底层是使用dlopen
或android_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