-
Notifications
You must be signed in to change notification settings - Fork 156
/
ios10_application_state_db_wrapper.rb
82 lines (62 loc) · 2.23 KB
/
ios10_application_state_db_wrapper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
require 'plist4r'
require 'sqlite3'
class IOS10ApplicationStateDbWrapper
def initialize
@db_file = "/User/Library/FrontBoard/applicationState.db"
@cache_path = "#{$tmp_path}/device/applicationState.db"
@ldid_binary = "/usr/bin/ldid"
# download latest db file
FileUtils.mkpath "#{$tmp_path}/device" unless File.directory? "#{$tmp_path}/device"
$device.ops.download @db_file, @cache_path
end
def entitlements_by_binary(binary_path)
unless $device.ops.file_exists?(@ldid_binary)
$log.error "Cannot find ldid binary at #{@ldid_binary}"
return ""
end
plist = $device.ops.execute("#{@ldid_binary} -e '#{binary_path}'")
entitlements = Plist4r.new({:from_string => plist})
puts entitlements
entitlements
end
def data_path_by_bundle_id(bundle_id)
#puts @cache_path
db = SQLite3::Database.open @cache_path
#puts db.inspect
#puts bundle_id
plist = ""
# I fail to get prepared statements to work with SQLite... So using strig concatenation instead. here be dragons
stmnt = db.prepare "SELECT kvs.value FROM application_identifier_tab left join kvs on application_identifier_tab.id = kvs.application_identifier where kvs.key = 2 and application_identifier_tab.application_identifier='#{bundle_id}'"
# stmnt.bind_params(bundle_id)
rs = stmnt.execute
#
#binding.pry
#puts rs.inspect
row = rs.next
if row.nil?
return nil
end
#puts row.inspect
plist = row[0]
#puts plist
outer_plist = Plist4r.new({:from_string => plist})
h = outer_plist.to_hash
if h.key? "sandboxPath"
return h["sandboxPath"]
end
#puts outer_plist.inspect
plist = outer_plist.to_hash["String"]
inner_plist = Plist4r::Plist.new({:from_string => plist})
return inner_plist.to_hash["$objects"][4]
end
def keychain_access_groups_by_binary binary_path
unless $device.ops.file_exists?(@ldid_binary)
$log.error "Cannot find ldid binary at #{@ldid_binary}"
return ""
end
plist = $device.ops.execute("#{@ldid_binary} -e '#{binary_path}'")
entitlements = Plist4r.new({:from_string => plist})
puts entitlements["keychain-access-groups"]
return entitlements["keychain-access-groups"]
end
end