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
注意:如果想看程序报错,先打开终端,在输入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 --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@[email protected]@classes.dex
[dlopen_ext:] /data/dalvik-cache/arm64/system@app@[email protected]@classes.dex
[dlopen_ext:] /data/dalvik-cache/arm64/system@app@[email protected]@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@[email protected]@classes.dex
[dlopen_ext:] /data/dalvik-cache/arm64/product@app@[email protected]@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/[email protected]
[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/[email protected]
[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/[email protected]
[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
标签:day36,app,四期,ext,so,打包,shihuo,dlopen,arm64
From: https://www.cnblogs.com/fuminer/p/17506408.html