ruby-macho 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/macho/fat_file.rb +9 -0
- data/lib/macho/load_commands.rb +215 -13
- data/lib/macho/structure.rb +2 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 70e9e70c2eb3e759c76828051d5bca20c19f081b
|
4
|
+
data.tar.gz: 7a626fcc61d6437dec0085c46843cf7a9574f9a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a110e3986ffbe60926702252a173082cd44bbb65824cbdd55648a969a2a54fb2afe9b60c5b761f978b8c2b11948887f052de67daab6d9b261085a199be58d38
|
7
|
+
data.tar.gz: 5a7c81e82a7857fe6a2732605f9dc4fb3e139d2989673ad3fbe1632be85072e13432cdbaf0964024cc53cc3c63d29a7864152dea5296b170185e12132e1fafc6
|
data/lib/macho/fat_file.rb
CHANGED
@@ -98,6 +98,15 @@ module MachO
|
|
98
98
|
|
99
99
|
alias :change_dylib :change_install_name
|
100
100
|
|
101
|
+
# Extract a Mach-O with the given CPU type from the file.
|
102
|
+
# @example
|
103
|
+
# file.extract("CPU_TYPE_I386") # => MachO::MachOFile
|
104
|
+
# @param cputype [String] the CPU type of the Mach-O being extracted
|
105
|
+
# @return [MachO::MachOFile, nil] the extracted Mach-O or nil if no Mach-O has the given CPU type
|
106
|
+
def extract(cputype)
|
107
|
+
machos.select { |macho| macho.cputype == cputype }.first
|
108
|
+
end
|
109
|
+
|
101
110
|
# Write all (fat) data to the given filename.
|
102
111
|
# @param filename [String] the file to write to
|
103
112
|
def write(filename)
|
data/lib/macho/load_commands.rb
CHANGED
@@ -338,13 +338,48 @@ module MachO
|
|
338
338
|
super(offset, cmd, cmdsize)
|
339
339
|
@uuid = uuid.unpack("C16") # re-unpack for the actual UUID array
|
340
340
|
end
|
341
|
+
|
342
|
+
# @return [String] a string representation of the UUID
|
343
|
+
def uuid_string
|
344
|
+
hexes = uuid.map { |e| "%02x" % e }
|
345
|
+
segs = [
|
346
|
+
hexes[0..3].join, hexes[4..5].join, hexes[6..7].join,
|
347
|
+
hexes[8..9].join, hexes[10..15].join
|
348
|
+
]
|
349
|
+
|
350
|
+
segs.join("-")
|
351
|
+
end
|
341
352
|
end
|
342
353
|
|
343
354
|
# A load command indicating that part of this file is to be mapped into
|
344
355
|
# the task's address space. Corresponds to LC_SEGMENT.
|
345
356
|
class SegmentCommand < LoadCommand
|
346
|
-
|
347
|
-
attr_reader :
|
357
|
+
# @return [String] the name of the segment, including null padding bytes
|
358
|
+
attr_reader :segname
|
359
|
+
|
360
|
+
# @return [Fixnum] the memory address of the segment
|
361
|
+
attr_reader :vmaddr
|
362
|
+
|
363
|
+
# @return [Fixnum] the memory size of the segment
|
364
|
+
attr_reader :vmsize
|
365
|
+
|
366
|
+
# @return [Fixnum] the file offset of the segment
|
367
|
+
attr_reader :fileoff
|
368
|
+
|
369
|
+
# @return [Fixnum] the amount to map from the file
|
370
|
+
attr_reader :filesize
|
371
|
+
|
372
|
+
# @return [Fixnum] the maximum VM protection
|
373
|
+
attr_reader :maxprot
|
374
|
+
|
375
|
+
# @return [Fixnum] the initial VM protection
|
376
|
+
attr_reader :initprot
|
377
|
+
|
378
|
+
# @return [Fixnum] the number of sections in the segment
|
379
|
+
attr_reader :nsects
|
380
|
+
|
381
|
+
# @return [Fixnum] any flags associated with the segment
|
382
|
+
attr_reader :flags
|
348
383
|
|
349
384
|
@format = "VVa16VVVVVVVV"
|
350
385
|
@sizeof = 56
|
@@ -373,8 +408,32 @@ module MachO
|
|
373
408
|
# A load command indicating that part of this file is to be mapped into
|
374
409
|
# the task's address space. Corresponds to LC_SEGMENT_64.
|
375
410
|
class SegmentCommand64 < LoadCommand
|
376
|
-
|
377
|
-
attr_reader :
|
411
|
+
# @return [String] the name of the segment, including null padding bytes
|
412
|
+
attr_reader :segname
|
413
|
+
|
414
|
+
# @return [Fixnum] the memory address of the segment
|
415
|
+
attr_reader :vmaddr
|
416
|
+
|
417
|
+
# @return [Fixnum] the memory size of the segment
|
418
|
+
attr_reader :vmsize
|
419
|
+
|
420
|
+
# @return [Fixnum] the file offset of the segment
|
421
|
+
attr_reader :fileoff
|
422
|
+
|
423
|
+
# @return [Fixnum] the amount to map from the file
|
424
|
+
attr_reader :filesize
|
425
|
+
|
426
|
+
# @return [Fixnum] the maximum VM protection
|
427
|
+
attr_reader :maxprot
|
428
|
+
|
429
|
+
# @return [Fixnum] the initial VM protection
|
430
|
+
attr_reader :initprot
|
431
|
+
|
432
|
+
# @return [Fixnum] the number of sections in the segment
|
433
|
+
attr_reader :nsects
|
434
|
+
|
435
|
+
# @return [Fixnum] any flags associated with the segment
|
436
|
+
attr_reader :flags
|
378
437
|
|
379
438
|
@format = "VVa16QQQQVVVV"
|
380
439
|
@sizeof = 72
|
@@ -404,7 +463,17 @@ module MachO
|
|
404
463
|
# on filetype. Corresponds to LC_ID_DYLIB, LC_LOAD_DYLIB, LC_LOAD_WEAK_DYLIB,
|
405
464
|
# and LC_REEXPORT_DYLIB.
|
406
465
|
class DylibCommand < LoadCommand
|
407
|
-
|
466
|
+
# @return [Fixnum] the library's path name (lc_str)
|
467
|
+
attr_reader :name
|
468
|
+
|
469
|
+
# @return [Fixnum] the library's build time stamp
|
470
|
+
attr_reader :timestamp
|
471
|
+
|
472
|
+
# @return [Fixnum] the library's current version number
|
473
|
+
attr_reader :current_version
|
474
|
+
|
475
|
+
# @return [Fixnum] the library's compatibility version number
|
476
|
+
attr_reader :compatibility_version
|
408
477
|
|
409
478
|
@format = "VVVVVV"
|
410
479
|
@sizeof = 24
|
@@ -424,6 +493,7 @@ module MachO
|
|
424
493
|
# on filetype. Corresponds to LC_ID_DYLINKER, LC_LOAD_DYLINKER, and
|
425
494
|
# LC_DYLD_ENVIRONMENT.
|
426
495
|
class DylinkerCommand < LoadCommand
|
496
|
+
# @return [Fixnum] the dynamic linker's path name (lc_str)
|
427
497
|
attr_reader :name
|
428
498
|
|
429
499
|
@format = "VVV"
|
@@ -439,7 +509,14 @@ module MachO
|
|
439
509
|
# A load command used to indicate dynamic libraries used in prebinding.
|
440
510
|
# Corresponds to LC_PREBOUND_DYLIB.
|
441
511
|
class PreboundDylibCommand < LoadCommand
|
442
|
-
|
512
|
+
# @return [Fixnum] the library's path name (lc_str)
|
513
|
+
attr_reader :name
|
514
|
+
|
515
|
+
# @return [Fixnum] the number of modules in the library
|
516
|
+
attr_reader :nmodules
|
517
|
+
|
518
|
+
# @return [Fixnum] a bit vector of linked modules
|
519
|
+
attr_reader :linked_modules
|
443
520
|
|
444
521
|
@format = "VVVVV"
|
445
522
|
@sizeof = 20
|
@@ -463,8 +540,29 @@ module MachO
|
|
463
540
|
# initialization routine and an index into the module table for the module
|
464
541
|
# that defines the routine. Corresponds to LC_ROUTINES.
|
465
542
|
class RoutinesCommand < LoadCommand
|
466
|
-
|
467
|
-
attr_reader :
|
543
|
+
# @return [Fixnum] the address of the initialization routine
|
544
|
+
attr_reader :init_address
|
545
|
+
|
546
|
+
# @return [Fixnum] the index into the module table that the init routine is defined in
|
547
|
+
attr_reader :init_module
|
548
|
+
|
549
|
+
# @return [void]
|
550
|
+
attr_reader :reserved1
|
551
|
+
|
552
|
+
# @return [void]
|
553
|
+
attr_reader :reserved2
|
554
|
+
|
555
|
+
# @return [void]
|
556
|
+
attr_reader :reserved3
|
557
|
+
|
558
|
+
# @return [void]
|
559
|
+
attr_reader :reserved4
|
560
|
+
|
561
|
+
# @return [void]
|
562
|
+
attr_reader :reserved5
|
563
|
+
|
564
|
+
# @return [void]
|
565
|
+
attr_reader :reserved6
|
468
566
|
|
469
567
|
@format = "VVVVVVVVVV"
|
470
568
|
@sizeof = 40
|
@@ -489,8 +587,29 @@ module MachO
|
|
489
587
|
# initialization routine and an index into the module table for the module
|
490
588
|
# that defines the routine. Corresponds to LC_ROUTINES_64.
|
491
589
|
class RoutinesCommand64 < LoadCommand
|
492
|
-
|
493
|
-
attr_reader :
|
590
|
+
# @return [Fixnum] the address of the initialization routine
|
591
|
+
attr_reader :init_address
|
592
|
+
|
593
|
+
# @return [Fixnum] the index into the module table that the init routine is defined in
|
594
|
+
attr_reader :init_module
|
595
|
+
|
596
|
+
# @return [void]
|
597
|
+
attr_reader :reserved1
|
598
|
+
|
599
|
+
# @return [void]
|
600
|
+
attr_reader :reserved2
|
601
|
+
|
602
|
+
# @return [void]
|
603
|
+
attr_reader :reserved3
|
604
|
+
|
605
|
+
# @return [void]
|
606
|
+
attr_reader :reserved4
|
607
|
+
|
608
|
+
# @return [void]
|
609
|
+
attr_reader :reserved5
|
610
|
+
|
611
|
+
# @return [void]
|
612
|
+
attr_reader :reserved6
|
494
613
|
|
495
614
|
@format = "VVQQQQQQQQ"
|
496
615
|
@sizeof = 72
|
@@ -514,6 +633,7 @@ module MachO
|
|
514
633
|
# A load command signifying membership of a subframework containing the name
|
515
634
|
# of an umbrella framework. Corresponds to LC_SUB_FRAMEWORK.
|
516
635
|
class SubFrameworkCommand < LoadCommand
|
636
|
+
# @return [Fixnum] the umbrella framework name (lc_str)
|
517
637
|
attr_reader :umbrella
|
518
638
|
|
519
639
|
@format = "VVV"
|
@@ -529,6 +649,7 @@ module MachO
|
|
529
649
|
# A load command signifying membership of a subumbrella containing the name
|
530
650
|
# of an umbrella framework. Corresponds to LC_SUB_UMBRELLA.
|
531
651
|
class SubUmbrellaCommand < LoadCommand
|
652
|
+
# @return [Fixnum] the subumbrella framework name (lc_str)
|
532
653
|
attr_reader :sub_umbrella
|
533
654
|
|
534
655
|
@format = "VVV"
|
@@ -544,6 +665,7 @@ module MachO
|
|
544
665
|
# A load command signifying a sublibrary of a shared library. Corresponds
|
545
666
|
# to LC_SUB_LIBRARY.
|
546
667
|
class SubLibraryCommand < LoadCommand
|
668
|
+
# @return [Fixnum] the sublibrary name (lc_str)
|
547
669
|
attr_reader :sub_library
|
548
670
|
|
549
671
|
@format = "VVV"
|
@@ -559,6 +681,7 @@ module MachO
|
|
559
681
|
# A load command signifying a shared library that is a subframework of
|
560
682
|
# an umbrella framework. Corresponds to LC_SUB_CLIENT.
|
561
683
|
class SubClientCommand < LoadCommand
|
684
|
+
# @return [Fixnum] the subclient name (lc_str)
|
562
685
|
attr_reader :sub_client
|
563
686
|
|
564
687
|
@format = "VVV"
|
@@ -602,40 +725,58 @@ module MachO
|
|
602
725
|
# A load command containing symbolic information needed to support data
|
603
726
|
# structures used by the dynamic link editor. Corresponds to LC_DYSYMTAB.
|
604
727
|
class DysymtabCommand < LoadCommand
|
728
|
+
# @return [Fixnum] the index to local symbols
|
605
729
|
attr_reader :ilocalsym
|
606
730
|
|
731
|
+
# @return [Fixnum] the number of local symbols
|
607
732
|
attr_reader :nlocalsym
|
608
733
|
|
734
|
+
# @return [Fixnum] the index to externally defined symbols
|
609
735
|
attr_reader :iextdefsym
|
610
736
|
|
737
|
+
# @return [Fixnum] the number of externally defined symbols
|
611
738
|
attr_reader :nextdefsym
|
612
739
|
|
740
|
+
# @return [Fixnum] the index to undefined symbols
|
613
741
|
attr_reader :iundefsym
|
614
742
|
|
743
|
+
# @return [Fixnum] the number of undefined symbols
|
615
744
|
attr_reader :nundefsym
|
616
745
|
|
746
|
+
# @return [Fixnum] the file offset to the table of contents
|
617
747
|
attr_reader :tocoff
|
618
748
|
|
749
|
+
# @return [Fixnum] the number of entries in the table of contents
|
619
750
|
attr_reader :ntoc
|
620
751
|
|
752
|
+
# @return [Fixnum] the file offset to the module table
|
621
753
|
attr_reader :modtaboff
|
622
754
|
|
755
|
+
# @return [Fixnum] the number of entries in the module table
|
623
756
|
attr_reader :nmodtab
|
624
757
|
|
758
|
+
# @return [Fixnum] the file offset to the referenced symbol table
|
625
759
|
attr_reader :extrefsymoff
|
626
760
|
|
761
|
+
# @return [Fixnum] the number of entries in the referenced symbol table
|
627
762
|
attr_reader :nextrefsyms
|
628
763
|
|
764
|
+
# @return [Fixnum] the file offset to the indirect symbol table
|
629
765
|
attr_reader :indirectsymoff
|
630
766
|
|
767
|
+
# @return [Fixnum] the number of entries in the indirect symbol table
|
631
768
|
attr_reader :nindirectsyms
|
632
769
|
|
770
|
+
# @return [Fixnum] the file offset to the external relocation entries
|
633
771
|
attr_reader :extreloff
|
634
772
|
|
773
|
+
# @return [Fixnum] the number of external relocation entries
|
635
774
|
attr_reader :nextrel
|
636
775
|
|
776
|
+
# @return [Fixnum] the file offset to the local relocation entries
|
637
777
|
attr_reader :locreloff
|
638
778
|
|
779
|
+
# @return [Fixnum] the number of local relocation entries
|
639
780
|
attr_reader :nlocrel
|
640
781
|
|
641
782
|
|
@@ -710,6 +851,7 @@ module MachO
|
|
710
851
|
# be added to the current run path used to find @rpath prefixed dylibs.
|
711
852
|
# Corresponds to LC_RPATH.
|
712
853
|
class RpathCommand < LoadCommand
|
854
|
+
# @return [Fixnum] the oath to add to the run path (lc_str)
|
713
855
|
attr_reader :path
|
714
856
|
|
715
857
|
@format = "VVV"
|
@@ -813,15 +955,63 @@ module MachO
|
|
813
955
|
@version = version
|
814
956
|
@sdk = sdk
|
815
957
|
end
|
958
|
+
|
959
|
+
# A string representation of the binary's minimum OS version.
|
960
|
+
# @return [String] a string representing the minimum OS version.
|
961
|
+
def version_string
|
962
|
+
binary = "%032b" % version
|
963
|
+
segs = [
|
964
|
+
binary[0..15], binary[16..23], binary[24..31]
|
965
|
+
].map { |s| s.to_i(2) }
|
966
|
+
|
967
|
+
segs.join(".")
|
968
|
+
end
|
969
|
+
|
970
|
+
# A string representation of the binary's SDK version.
|
971
|
+
# @return [String] a string representing the SDK version.
|
972
|
+
def sdk_string
|
973
|
+
binary = "%032b" % sdk
|
974
|
+
segs = [
|
975
|
+
binary[0..15], binary[16..23], binary[24..31]
|
976
|
+
].map { |s| s.to_i(2) }
|
977
|
+
|
978
|
+
segs.join(".")
|
979
|
+
end
|
816
980
|
end
|
817
981
|
|
818
982
|
# A load command containing the file offsets and sizes of the new
|
819
983
|
# compressed form of the information dyld needs to load the image.
|
820
984
|
# Corresponds to LC_DYLD_INFO and LC_DYLD_INFO_ONLY.
|
821
985
|
class DyldInfoCommand < LoadCommand
|
822
|
-
|
823
|
-
attr_reader :
|
824
|
-
|
986
|
+
# @return [Fixnum] the file offset to the rebase information
|
987
|
+
attr_reader :rebase_off
|
988
|
+
|
989
|
+
# @return [Fixnum] the size of the rebase information
|
990
|
+
attr_reader :rebase_size
|
991
|
+
|
992
|
+
# @return [Fixnum] the file offset to the binding information
|
993
|
+
attr_reader :bind_off
|
994
|
+
|
995
|
+
# @return [Fixnum] the size of the binding information
|
996
|
+
attr_reader :bind_size
|
997
|
+
|
998
|
+
# @return [Fixnum] the file offset to the weak binding information
|
999
|
+
attr_reader :weak_bind_off
|
1000
|
+
|
1001
|
+
# @return [Fixnum] the size of the weak binding information
|
1002
|
+
attr_reader :weak_bind_size
|
1003
|
+
|
1004
|
+
# @return [Fixnum] the file offset to the lazy binding information
|
1005
|
+
attr_reader :lazy_bind_off
|
1006
|
+
|
1007
|
+
# @return [Fixnum] the size of the lazy binding information
|
1008
|
+
attr_reader :lazy_bind_size
|
1009
|
+
|
1010
|
+
# @return [Fixnum] the file offset to the export information
|
1011
|
+
attr_reader :export_off
|
1012
|
+
|
1013
|
+
# @return [Fixnum] the size of the export information
|
1014
|
+
attr_reader :export_size
|
825
1015
|
|
826
1016
|
@format = "VVVVVVVVVVVV"
|
827
1017
|
@sizeof = 48
|
@@ -893,5 +1083,17 @@ module MachO
|
|
893
1083
|
super(offset, cmd, cmdsize)
|
894
1084
|
@version = version
|
895
1085
|
end
|
1086
|
+
|
1087
|
+
# A string representation of the sources used to build the binary.
|
1088
|
+
# @return [String] a string representation of the version
|
1089
|
+
def version_string
|
1090
|
+
binary = "%064b" % version
|
1091
|
+
segs = [
|
1092
|
+
binary[0..23], binary[24..33], binary[34..43], binary[44..53],
|
1093
|
+
binary[54..63]
|
1094
|
+
].map { |s| s.to_i(2) }
|
1095
|
+
|
1096
|
+
segs.join(".")
|
1097
|
+
end
|
896
1098
|
end
|
897
1099
|
end
|
data/lib/macho/structure.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ruby-macho
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Woodruff
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-10-
|
11
|
+
date: 2015-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: A library for viewing and manipulating Mach-O files in Ruby.
|
14
14
|
email: william@tuffbizz.com
|