Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在多种 POSIX-compliant 操作系统(诸如 Linux,macOS 及 BSD 等)上运行 Windows 应用的兼容层。Wine 不是像虚拟机或者模拟器一样模仿内部的 Windows 逻辑,而是將 Windows API 调用翻译成为动态的 POSIX 调用,免除了性能和其他一些行为的内存占用,让你能够干净地集合 Windows 应用到你的桌面。
Machoview 2.4 obaby’s branch source code
Machoview 2.4 M1 Version
MachOView is a visual Mach-O file browser. It provides a complete solution for exploring and in-place editing Intel and ARM binaries.
NSWindow drag regions should only be invalidated on the Main Thread!'
//---------------------------------------------------------------------------- - (void)handleThreadStateChanged:(NSNotification *)notification { if ([notification object] == dataController) { NSString * threadState = [[notification userInfo] objectForKey:MVStatusUserInfoKey]; if ([threadState isEqualToString:MVStatusTaskStarted] == YES) { if (OSAtomicIncrement32(&threadCount) == 1) { [progressIndicator setUsesThreadedAnimation:YES]; [progressIndicator startAnimation:nil]; // [stopButton setHidden:NO]; dispatch_async(dispatch_get_main_queue(), ^{ [stopButton setHidden:NO]; }); } } else if ([threadState isEqualToString:MVStatusTaskTerminated] == YES) { if (OSAtomicDecrement32(&threadCount) == 0) { [progressIndicator stopAnimation:nil]; [statusText setStringValue:@""]; dispatch_async(dispatch_get_main_queue(), ^{ [stopButton setHidden:YES]; }); // [stopButton setHidden:YES]; } } } }
EasyFind 5.0.1
EasyFind for mac(苹果电脑文件管理软件)是苹果电脑Mac os平台上的一款文件管理辅助软件。你认为Mac OS X的Spotlight很好用?特别是在搜索文本文件时? 下载EasyFind,Spotlight的替代(或补充),并在任何文件中查找文件,文件夹或内容,而无需编制索引。 EasyFind对于那些厌倦了缓慢或不可能的索引,过时或损坏的索引,或那些只是寻找在Finder或Spotlight中缺少的功能特别有用。EasyFind 是可以搜索隐藏文件的软件,最大的亮点就是能够搜索不可见的文件和包内部的文件。
特点:
– 布尔运算符,通配符,短语
– 扩展布尔运算符,类似于DEVONthink和DEVONagent
– 即时搜索,不需要索引
– 在文件包中找到不可见的文件和文件(Spotlight没有的功能)
– 在单独的列表中显示每个文件的位置
– 使用Quick Look预览文件(Mac OS X 10.5或更高版本)
– 提供上下文菜单和服务
– 支持拖放
– 非常迅速,支持多线程
– 使用很少的内存
iOS 签名杂谈(二)
上一篇中提到替换SC-info后的ipa依旧可以安装,至于原因其实也很简单。仔细查看CodeResources文件,就知道原因了。文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>files</key>
<dict>
<key>EmojiUltimateViewController.nib</key>
<data>
ifQreSMmB3Uft3K3EF1/RLPF/zw=
</data>
<key>EmojiViewController.nib</key>
<data>
UUTdU18Tz6Fl6x7E2aGYcRxpH3A=
</data>
<key>English.lproj/Localizable.strings</key>
<data>
53Ka23KM2gkM/XGA2/7hVBG5jfc=
</data>
<key>MainWindow.nib</key>
<data>
UshXxpapPiP6lBtWe18OpnMv+lM=
</data>
<key>PkgInfo</key>
<data>
n57qDP4tZfLD1rCS43W0B4LQjzE=
</data>
<key>RemoteConfig.plist</key>
<data>
rQXI2OqpnGVOk5+BmA/F++FnAG0=
</data>
<key>de.lproj/Localizable.strings</key>
<data>
MAGm4wWT2b8996eIiqcJna3Jj5s=
</data>
<key>emoji.plist</key>
<data>
aybwK3Wkthu1Gk7XmEzyjXmGVRQ=
</data>
<key>emoji_ultimate_copy_button.png</key>
iOS 签名杂谈(一)
为什么要说iOS的签名呢?现在移动平台的逆向的教程和书籍已经相当多了。针对签名的文章也很多,我这里想说的一些是可能别的地方看不到的比较细微的内容(虽然都是老黄历~~)。
iOS的签名目的其实也比较纯粹,就是为了能够在不越狱的情况下安装破解版的ipa。当然,如果是各种助手的话还有另外的一个目的,那就是应用分发(更重要的是在分发之前加入自己的广告sdk)。
说到iOS的应用分发其实主要方式有如下几种:
- 苹果的应用商店。
- cydia应用商店。 需要越狱之后才能安装各种app和插件,并且由于现在越狱基本都是不完整越狱,重启设备之后需要重新越狱。并且越狱工具安装也异常麻烦,所以越狱的用户也少了很多
- 第三方应用商店,国内的比较大的就那么几家。不知道的可以自己搜索一下。 第三方应用商店的app分发其实也经历了几个时期:
- a. 越狱时期,最早期应用商店分发的基本都是越狱应用。这个与早期的越狱插件和完美越狱存在比较大的关系。
- b. 转授权分发,这个技术最早貌似是360的快用用的这么一项技术(多年以前, 13年左右)。所谓转授权就是通过链接电脑,通过itunes的相关api调用在设备上创建IC-info文件。通过苹果的应用商店下载的iap会包含sc_info 授权信息。
在ipa安装的过程中并不会校验设备上有没有授权信息,只有到运行的时候才会校验授权信息。此时如果没有授权 那么会弹出要求输入用户名和密码的弹框。
iOS iap receipt 服务器校验
import json
import requests
SAND_BOX_VERIFY_URL = 'https://sandbox.itunes.apple.com/verifyReceipt'
VERIFY_URL = 'https://buy.itunes.apple.com/verifyReceipt'
# /**
# * 服务器二次验证代码
# * 21000 App Store不能读取你提供的JSON对象
# * 21002 receipt-data域的数据有问题
# * 21003 receipt无法通过验证
# * 21004 提供的shared secret不匹配你账号中的shared secret
# * 21005 receipt服务器当前不可用
# * 21006 receipt合法,但是订阅已过期。服务器接收到这个状态码时,receipt数据仍然会解码并一起发送
# * 21007 receipt是Sandbox receipt,但却发送至生产系统的验证服务
# * 21008 receipt是生产receipt,但却发送至Sandbox环境的验证服务
# */
def verify_receipt_with_apple(receipt, is_sandbox=False):
jsonStr = json.dumps({"receipt-data": receipt})
headers = {'Content-Type': 'application/json'}
url = VERIFY_URL
if is_sandbox:
url = SAND_BOX_VERIFY_URL
rep = requests.post(url=url, data=jsonStr, headers=headers)
# print(rep.text)
return rep.text
def verify_receipt_with_apple_json(receipt, is_sandbox=False):
resp = verify_receipt_with_apple(receipt, is_sandbox)
try:
json_data = json.loads(resp)
except:
return None
return json_data
if __name__ == "__main__":
receipt = "MIITrQYJKoZIhvcNAQcCoIITnjCCE5oCAQExCzAJBgUrDgMCGg"
js = verify_receipt_with_apple_json(recpt, True)
print(js['receipt'])
print(js['receipt']['in_app'])
print(js['receipt']['in_app'][0])