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>
Continue Reading

iOS 签名杂谈(一)

为什么要说iOS的签名呢?现在移动平台的逆向的教程和书籍已经相当多了。针对签名的文章也很多,我这里想说的一些是可能别的地方看不到的比较细微的内容(虽然都是老黄历~~)。

iOS的签名目的其实也比较纯粹,就是为了能够在不越狱的情况下安装破解版的ipa。当然,如果是各种助手的话还有另外的一个目的,那就是应用分发(更重要的是在分发之前加入自己的广告sdk)。

说到iOS的应用分发其实主要方式有如下几种:

  1. 苹果的应用商店。
  2. cydia应用商店。 需要越狱之后才能安装各种app和插件,并且由于现在越狱基本都是不完整越狱,重启设备之后需要重新越狱。并且越狱工具安装也异常麻烦,所以越狱的用户也少了很多
  3. 第三方应用商店,国内的比较大的就那么几家。不知道的可以自己搜索一下。 第三方应用商店的app分发其实也经历了几个时期:
  • a. 越狱时期,最早期应用商店分发的基本都是越狱应用。这个与早期的越狱插件和完美越狱存在比较大的关系。
  • b. 转授权分发,这个技术最早貌似是360的快用用的这么一项技术(多年以前, 13年左右)。所谓转授权就是通过链接电脑,通过itunes的相关api调用在设备上创建IC-info文件。通过苹果的应用商店下载的iap会包含sc_info 授权信息。

在ipa安装的过程中并不会校验设备上有没有授权信息,只有到运行的时候才会校验授权信息。此时如果没有授权 那么会弹出要求输入用户名和密码的弹框。

Continue Reading

m3u8 下载工具 v20.5.14 [Windows]

更新功能:

1. 增加支持从文件读取下载链接功能,参数-f J:\Porn\202005\list\list.txt;

2. 支持直接从mp4,avi, mov, mpeg链接下载文件。列表下载过程中对于已经存在的文件会直接跳过(youtube-dl 支持从文件读取下载链接,但是下载过程中对于多个url最终字符一样的情况没有做处理,导致会误认为文件已经下载,没有找到用什么参数来修改下载后的文件名。例如下图的列表格式就无法下载文件,因为youtube-dl 直接吧下载的文件命名成了index.m3u8.mp4 。 下载其他连接的时候就会认为文件已经存在了。)。

文件格式如下:

实例: 

 m3u8_downloader.exe -f J:\Porn\202005\list\list.txt -p J:\Porn\202005\squirt 

使用-f参数的时候-o参数无效

Continue Reading

ubuntu uwsgi No module named ‘django’

ubuntu uwsgi 服务器启动之后 链接服务器提示500, 查看系统日志发现没有找到django模块。但是通过pip命令可以看到已经成功安装了。

猜测可能是python路径搜索问题导致的,随便搜了一下找到这么一篇文章:https://blog.csdn.net/dqchouyang/article/details/78762432

Continue Reading

python3.7 安装alipay-sdk-python(PyCrypto)

安装vs相关工具之后继续报错:

warning: GMP or MPIR library not found; Not building Crypto.PublicKey._fastmath.
building ‘Crypto.Random.OSRNG.winrandom‘ extension
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\BIN\x86_amd64\cl.exe /c /nologo /Ox /W3 /GL /DNDEBUG /MD -Isrc/ -Isrc/inc-msvc/ -IC:\Python36\include -IC:\Python36\include
winrand.c
C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(26): error C2061: syntax error: identifier ‘intmax_t‘
C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(27): error C2061: syntax error: identifier ‘rem‘
C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(27): error C2059: syntax error: ‘;‘
C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(28): error C2059: syntax error: ‘}‘
C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(30): error C2061: syntax error: identifier ‘imaxdiv_t‘
C:\Program Files (x86)\Windows Kits\10\include\10.0.10240.0\ucrt\inttypes.h(30): error C2059: syntax error: ‘;‘
Continue Reading

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])

Continue Reading