diff --git a/mobsf/StaticAnalyzer/tools/ios/CgbiPngFix/CgbiPngFix.exe b/mobsf/StaticAnalyzer/tools/ios/CgbiPngFix/CgbiPngFix.exe new file mode 100755 index 0000000000..8b28e7bb0c Binary files /dev/null and b/mobsf/StaticAnalyzer/tools/ios/CgbiPngFix/CgbiPngFix.exe differ diff --git a/mobsf/StaticAnalyzer/tools/ios/CgbiPngFix/CgbiPngFix_amd64 b/mobsf/StaticAnalyzer/tools/ios/CgbiPngFix/CgbiPngFix_amd64 new file mode 100755 index 0000000000..4a583f03a6 Binary files /dev/null and b/mobsf/StaticAnalyzer/tools/ios/CgbiPngFix/CgbiPngFix_amd64 differ diff --git a/mobsf/StaticAnalyzer/tools/ios/CgbiPngFix/CgbiPngFix_arm64 b/mobsf/StaticAnalyzer/tools/ios/CgbiPngFix/CgbiPngFix_arm64 new file mode 100755 index 0000000000..5e68ab4542 Binary files /dev/null and b/mobsf/StaticAnalyzer/tools/ios/CgbiPngFix/CgbiPngFix_arm64 differ diff --git a/mobsf/StaticAnalyzer/views/ios/icon_analysis.py b/mobsf/StaticAnalyzer/views/ios/icon_analysis.py index 1f50264994..bec66a398a 100644 --- a/mobsf/StaticAnalyzer/views/ios/icon_analysis.py +++ b/mobsf/StaticAnalyzer/views/ios/icon_analysis.py @@ -37,12 +37,16 @@ def get_icon_from_ipa(app_dict, binary): return icon_file = icons.pop() outfile = Path(settings.DWD_DIR) / f'{md5}-icon.png' - if platform.system() == 'Darwin': + tools_dir = Path(settings.BASE_DIR) / 'StaticAnalyzer' / 'tools' / 'ios' + cgbipng_bin = None + arch = platform.machine() + system = platform.system() + # Uncrush PNG. CgBI -> PNG + # https://iphonedevwiki.net/index.php/CgBI_file_format + if system == 'Darwin': args = ['xcrun', '-sdk', 'iphoneos', 'pngcrush', '-q', '-revert-iphone-optimizations', icon_file, outfile.as_posix()] - # Uncrush PNG. CgBI -> PNG, Mac only - # https://iphonedevwiki.net/index.php/CgBI_file_format try: out = subprocess.run(args, capture_output=True) if b'libpng error:' in out.stdout: @@ -50,6 +54,21 @@ def get_icon_from_ipa(app_dict, binary): raise ValueError('PNG is not CgBI') except Exception: shutil.copy2(icon_file, outfile.as_posix()) + elif system == 'Windows' and arch in ('AMD64', 'x86'): + cgbipng_bin = 'CgbiPngFix.exe' + elif system == 'Linux' and arch == 'x86_64': + cgbipng_bin = 'CgbiPngFix_amd64' + elif system == 'Linux' and arch == 'aarch64': + cgbipng_bin = 'CgbiPngFix_arm64' + if cgbipng_bin: + cbin = tools_dir / 'CgbiPngFix' / cgbipng_bin + args = [cbin.as_posix(), '-i', + icon_file, '-o', outfile.as_posix()] + try: + out = subprocess.run(args, capture_output=True) + except Exception: + # Fails or PNG is not crushed + shutil.copy2(icon_file, outfile.as_posix()) else: shutil.copy2(icon_file, outfile.as_posix()) app_dict['icon_path'] = outfile.name