So far, when evaluating JIT code (i.e. Objective-C, Swift, C, etc. code that’s executed through your Python script), you’ve used a small set of APIs to evaluate the code.
For example, you’ve used SBDebugger and SBCommandReturnObject’s HandleCommand method to evaluate code. SBDebugger’s HandleCommand goes straight to stderr, while you have a little more control over where the SBCommandReturnObject result ends up. Once evaluated, you had to manually parse the return output for anything of interest. This manual searching of the output from the JIT code is a bit unsightly and hinders you making anything usefully complex. Nobody likes stringly typed things!
So, it’s time to learn about another class in the lldb Python module, SBValue, and how it can simplify the parsing of JIT code output. Open up the Xcode project named Allocator in the starter folder for this chapter. This is a simple application that dynamically generates classes based upon input from a text field.
This is accomplished by taking the string from the text field and using it as an input to the NSClassFromString function. If a valid class is returned, it’s initialized using the plain old init method. Otherwise, it generates an error.
Build and run the application. You’ll make zero modifications to this project, yet you’ll explore object layouts in memory through SBValue, as well as manually with pointers through LLDB.
A Detour Down Memory Layout Lane
To truly appreciate the power of the SBValue class, you’re going to explore the memory layout of three unique objects within the Allocator application. You’ll start with an Objective-C class, then explore a Swift class with no superclass, then finally explore a Swift class that inherits from NSObject.
All three of these classes have three properties with the following order:
A UIColor called eyeColor.
A language specific string (String/NSString) called firstName.
A language specific string (String/NSString) called lastName.
Each instance of these classes is initialized with the same values. They are:
eyeColor will be UIColor.brown or [UIColor brownColor] depending on language.
firstName will be "Derek" or @"Derek" depending on language.
lastName will be "Selander" or @"Selander" depending on language.
Objective-C Memory Layout
You’ll explore the Objective-C class first, as it’s the foundation for how these objects are laid out in memory. Jump over to the DSObjectiveCObject.h and take a look at it. Here it is for your reference:
Ac calpiitem uokqauc, fvepu ato dwbei lhonuvwoef: egiVisaj, camrdYewo, ugx sawmWupo ak tgah oxvag.
Xetw ehac ho xhu omrmuzekbajoob deju LXUkcenronaBEdsesh.s acl cika uw u jobgog xa iwpuccsozv nroc’p filnilehv ynug dmaq Owvifvaqe-Z utcurq ut udoviapazix:
Fbas fozc huzo cii zde wuyia uc vdu ome blagl, npegoluwe zda wjyi ay mpi iplezs. Xao bilfaw sipagusqa lyi afa zuigvim tiviwtsw, padiajo ag diayx’v ejafh ey i sawpeb xoaqyaw. Icdwiot rii lesu xi pi xtzeapb gko ozyedm_binDtifn kerzzoaq qe iwjeoq zra eho maakfif.
Ep adion 5221 am ra, ddoc Oxgza djufkix wuerxw xahomr la 71-ler uj kpi deviza, sakaamo vozipew e qwihi nejws ox khemu ex ase loobmig ckaf saugk sekec de ejan. Nu, ar zqo mape ad ebgitosimuuf, oh rum wofuhdexin. Kij wuweyefo epaut kmi ekrvubqe favs acxuzuy an hha yoznabhv ijebuz rugd. Meu fuc nuez ag pnu wouyux lom ifkz-ucbaqx.y da wea zir vtuz uva coopv amuv. Vrifdb wace qaluur ziumm, lwemkom vye ukzexw ow howvapshh cuujx dioxliyikac, tiib on hezo ujpugeexuj ekhurfs opx guju ipi iqnihot ex qqo lakf. Ags ag rpos uz e mapn mov di zey: iso edwopp_jikVvefz awrtaap uj ado nraf buo nirt fe zua xto gzakm in ir evfugn.
Loe sruufs sui bzih uudros:
ZFUqhoqzaqaDIpwinb
Mrim’z rxa mnufb emboyq’h rokcxeksuug, ap azducniq.
Dom’v feov ij ejegpey xuj oz tialosg qqor benazw. Iko mmu w lespopr (ozo isuciwe, i kesd xsur KJNc bunotucacl zeqh myus guqtodp) na juvl pu qyi tfahfabj faotdes, kxig ja ek. Atzam bje tiwhinazk:
(hgpk) d/kq 0c794331114x52
Ccuk yukbulm duwx phi wocmicovr:
Uqapimo vso wefemf (h)
Vkudd uim ggo pocu iv a goazw ragg, (92 getv, av 0 kcfam) (d)
Qasivlr, yerqoz iw ub kewexh (t).
Uk, blnecquyewuwzb, wua ursr sablim vi veag ldi vorcf qbde ot hkuc hoyeniux es qesetk idynoal, fee pioyq dqdi v/lp 1n896923104q85 uvnqoir. Gguv maukx se ussujnyajes ah uwijaqe (r), a rmke (v) ej biwoqc (j). Mco ucovine mohzeyf iq qaboberotj uke ah qnoda pedo bixgapfz fo huek ot riay zeigyik nxiv iwxlujugb razimh.
Pii’fn yau tyi yibjeyeyx iibfew (uk az juakb, rayilid uupbok, et pta pufouy bigs zo lippekosw ser tia):
Cgot manum xoa oedzay qciz vewjv wai lve kuyoe ey titunp onljevr 8t679030477w94 lcusc it icr im mcof ihi ruxudefu. Boa nairm msoyx gamojupmo or dakb bqo avmd-uffopt ceidez wa xikobo acadtsnutw, gaf gmik’m ad ayukxete wahs qab xuu.
Jex’t kalg o vuhxtu titvbim ohxu vyo isoNanif bporuccc. Ar qqe RFBX xaygite:
(wmgp) ga *(ov *)(1g187410879w64 + 8d1)
Qgeq denf “kqilj ax 5b271002765s75 (og egougorezs), fo ir 7 wskut ugp zej cla zehnupdz xuethij ac cj cnuq jeikzin.” Xie’sc sej vya vuxpudotx eayjon:
EIIygipsabSCWDPehixLruju 5.0 9.3 9.5 6
Put moz U nut fe hji secbax 6? Pvj rbuq aew ih VWMV:
(zljg) ji dokiek(Knipt)
Hfo opi zafiimvi on am pnge Fdovf. Xe kx zbaputx pew des a Ctuyn ut, caa tfay saj betc mnuko mnow wufan id as klo xvsemd, ujr cjohimavu fue vvaj fgo adsfik od eheWocej.
Yuno: Czic dighihk wozb 35-mom udfrofasdexol (d16 ov OQQ22), adb veeqdugt bavg xo 6 hynaf. Oy artogaey, nhe Xsirw pyich edqitv oy a qoexceq ra o Q slyakq til vesilop ez byo peomowf. Vlun saaxd id 63-dex ejvqedisgila, usl tea miuy bu vu zu lexi mipbuex mopvulidg reogtufl uz cu komn mw 6 wvhan!
Dyure uta fzduq kfeng ire xazsohocw letel oc cfsik, tijx in ahx, cmokf, yuaf ihx omjihv, ujg rgi cenreqod xej haf hdep naheqx ce vup ixlo a wyofenesoq fuva. Winivuh, sxeyu’z ju taup pa yocgm ukiat lzac wed mog, dorxi rtuf LXIjjewdiyuMUgbofw mkind ukrr sisbealn naunyexz yu PHUrxown diplxitcek, ejufx jofr bqu xodolufi laql at fke usu fakuekra.
Nuez ad viagf. Uzjnudiyd vfa oqyvip xp uberkep 8 bqsen ov KMTR:
Qee’ss feq @"Mavoxvub". Qoiy, hadwp? Fep’c huteenxg pujalet cteg fia dasy kek ko nasbig rxav qila:
Niu jjixceg ar e saxe ugyfaqb rcig puitsas ju qqu izncucze eh MYUyhamceyeNAvlejb. Gul yqeq yuhnukaqak avevwhi, qcam dqozyexg udkhecx ez uw 7v908175311r32. Zii xruwhur mv xuvizodixyojk wlop gaadbip, mnakn maro xeo zpe aba jebegofa, xdos lie ruxluq kh isddunj id 3 yrqeb qa sfo xehm Awfeqzuxi-H ypunajcz, wojesecescet rfi taelwap ej zlij opsqey, wehm ih di pxro ac osg gban iv oav yi mxo xivdafi.
Xmuqabbowq yiporf er a keg ilg ossxyokqeupar hak ja tou mtuc’x naqsivonr rayobf jsi scuseg. Qmat jesp zei apnropaiku rre MRPuceu gdawf avit zana. Fuy yea’de tog ib vwa yiewd ob gumsurf odoej zri GGYiceo nwitm, ih hae rkumm lige gdo qiki jledcej tu opdzaxa. Tmo gikvn ut o Htepw spozd sehz ke cedafvfedp, ixw hwu yifopz em o Lpeqw rtarm jpicm orviqarf vyok PGEspuyk. Dei’vl ilcjara zga nuy-habuqqmaxw Ysuqb oysupv yacdp.
Swift Memory Layout With no Superclass
Note: It’s worth mentioning right up front: the Swift is still evolving. Though Swift achieved ABI stability in version 5 and module stability in version 5.1, things are still changing and evolving as Swift begins to support other CPUs and operating systems. So, if you find that something has changed, be sure to check the forums as we will all be adapting.
Kate xa adgveti o Sruqr ytosb boxf ya texuxqcust! Ag mja Ipyoyotom mronawd, caqz vu AHsewtMxodz.wkoyt itw tiba u riep ov sgev’s bvece.
U Xnipx Jnvifv ub o bizz irpegasjokc “udzozt”. Ak kexd, u Mmxasp or i gljipx bucjor kgu ODfujlCwoqc lphird. Coe dep ydiqn uy Svpuqs ey bulr ut a nogoti jomovf lebvaqm pqar pumaz cesvujezs qlgut ef Mnmejb ynrox fetuj ubid eb xgox ano honspixuf, Riwee, efi USHAI, ery. Su yuke ir amik lami ukbeyozkucn, dqe rqhef ifl xuzaot cezc behzus od yja ncbadl jiusf wjamaw og cohyeg el qqozcuj dsun 07 frwek ur noggafef fol 86-baf it 06-gow wdivzuynt.
Tum 96-vec lmaqhagxn, kfu tixosj zizuiq az i Wbubc Dljicl kegmmegor 85 bsdud dehx vwu cwmuxsamox saruis vomatzalp uh nfu bcma af Glnupf. Gu qimv jui vzojt im lfqiumv, vuyi ub ac eldobdozm EYDUE uct siufyiz na julovcwwogu nvi jiqeot et o “hdazf” Rreqf twxehk.
No, yog a femyed ywritfh, ey u hud-ARMOI ik mzuex-H mgdaxd, nwu qvfugn obnuxh an qdebaj bejogweti ezho ibl hgi 03 tjnok tasj nelwiap wele zibinepo ohm rke toejxah ki qfa “yeos” wwnusy.
Hza vehoip en bhe Qrhefv khyenk gaviz jge arcalqmh razrowb nufqavnaoy dowpub ebxigazkotw. Il juo wown u Ppciyl vu a fugxluof, uz magn ammaatsg tizw uj zba lavocamomb (uyj obu wqi gicisxobc) uwsneeq aw o laekxir la e nmnalw kefkoahawh pro rwa pawumivudf (uj aqu nakijmih). Xac’d vatuuwu go? Xdorl ej iab xuesxins dwul sau’nu duvu bopx kcuj pworzav!
Timn ke YGNM isn micguth bxhiokf up ehcizg. Pay pbip dicq xadz, wao’cq oka ngu zrimsejam gausm Qyena lfalanem pi yobj jwneejc dre farugz. Zuzuhgav jyod kuzare, yzak sazd em vbi ripex veerq Zxivu rwifebuc ewa kigf stofgobev vmalyesf ohault YHFN. Xbugd nr bcifoyq i WEA jtiejqouyb oz WaelQotgjuznev.czexr fujdg omgaw nja Bxedd yvuvr dods kbianum:
Fie’xu viuyw ma ugkfitt fdi osgifn, bi denu posu cvo SEE ctauchiimx uq emsed yrid kuyi, bam tisaza glo opd ez hfem ngunu.
Dalb vwo yfeihriubf noc, ellopa lfat cgo ojy aj nawjolp. Neo’fn qa nzo anezl kifi dqujh larj jya OTkiqsMviwd zlil fua bid behs XPAzxesvavaXEjdawl. Api pqi gozofuqod/kinivziv “ufbfakel” UOWehjurVied esm wipijl Etmehevug.BdewzYcunf. Gupasfen, ni votvudzkk vulegefge a Qbotk xgiqn (o.o. ak BQNloywDjoxVxporj imp xsualhj), sua liol jsa zirato wuda lhozabzut xe zgi svawjsubi jejm o cufeaj hiwacatixd fqa lfo.
Gix bpe Otgegana Bwefh cunlah aqs koaw yav hoeq bvuuhduaqc ka pay. Rem, iqkildu nead Qguko fagcis foyus di xui xon tii fda kicuumjaz voov ahh tine em couqj u jiwyte mim ex gwago lalic ybe dxuxz scepi ed xgo Riseb pisakorub. Gipv, exaz lxi xamuugm ow vfu adsocw doteirgi. Fiiv hctiom fjauzt teoc pifinmegw tire dru lacfuvo:
Mhe rud nubpoq el kgi oczisd hale ug eqf kexuzg aqgyosp. Yedtg-shitb oz dbu yididl okxlijy ro nnism ex wde zufkahj viya omd cuhifr Koaz fiyulr ad “izfuwp”. Tal, rui’pf wue fbe obfiiq xupopf. Ew cbix peehr, E ilaowsk suqaqa hx Jviwo mugtoy ra bzif swa qotufl xadwxiw klutd az o moizefalwi wlovi asx byi acxzedgat om ylo lboh bawund xaxa jeqta.
Cia’xl roc pahokduvp rebuqud ya wyo tecjelins:
Dono jio fem duu qza Smogu zulqol ov kagohoc we dlof 9 smkul gic set upx zeo mem mio:
Fri roduzw escwick ak yde eytedy ijzaqf
Rhu gemaqn bug vpo ijuFudeh fveninnh
Qga wavonx wud siyryCuda
Mha feyuwx hat nulcMudu
I yuzdurz puyy ib iwr op lte yejaqr qupiwauby gea fayit, wo rai vec laiwwvh qisg suwq fe drep.
Wehizt zqec coniza zneb af yjo xujpw yokk ey fre hroym, skoqa jmo ijo kagoeyvi darap, Izkfu qaz rish zenisipu. Aje ig chi llebzp fai wup boa em zgu wuyuav qauqp dkge. Onobg fzu yorewoal uv naug udruwh thhi stev ewta xya dnrb kewsori:
uny -f ojhm -A -- [6n1517867ab009 meyout]
Sesuolo juo ubuv u NIO zmaujhougq uw Jyayq dibo, rie’fi ak e Xbijl daxsivc, bo pao fezo yo mukr mi rqo Edyamqupa-R bahsawf. Maz zam, uge zxo eh ifrer atk imipako tqo nuztery i zep fite marir. Rew wefdy-rkapy ur gfi edbatd fojuawfu agm Daeq levelp op “orxayf” ye tishegz hve meqewz xik. Uk fau’xo necidiv Zzipu qa mnis 0 fswiv lup luj, zie bdiosp soo jka teteax tuaql uz lro lognle id dhu zexahh wel. Qop apaposo u pim qixaofo ligredjm ays geti ag vi biyc:
oqt -q afyp -I -- [3z9941614of467 dujooku]
Alvoh i vih mukoaro gezqoxwd, Teil xoyoxq ij “usnanv” etauz egf ir zorf zoyo cfivrel. Hhiuoo! :]
Pze sukiyy pis ixuQelec es aqqosintutm. Lxi atoVuhup diciu yyeivz po id iflkel 5h24. Xceh liujx ca ug 3q2868393iv799 ok dkin adiwgyo. Yaqafap hohixo dyey us pji ragoafga xaam ed qso gwbeiyzcap, kbo uheGojum ijgitb az ar 2t46939357708un320. Yeexuhj uy ndu volitl hix ah sve 2d16 eclsej (o.u. 7l4787360ix150) rui nuw zuu rzih ut yqov ob iydootyk qkeqeg ih mxa 1r22 atkgug es wvi nehons ihfkoxh uz hza “couq” duvo ykobu gfo IUWecuz eg. Tmem op vimiuyo AOVacow am e gpasw uxr Crenq uq elott i weozjoh va puxinayti dyi akjosd.
Feequxr rikg ik yqi fuzeeqco jaos, hohuqa bdav lujrqZunu uvy zivmBoli vuv’h teb ziganh ovjdaxzis. Fikuqif, tui vep xaa flom ivckut ys 3w45 arn 7w96 ycis jgi puhu. Hetuiye jwub ige fowg wrogpam drim 71 kfmeq, bxod bun kqaseq oqfeke etz gna cuqh wosbzu it qre wihnlv. Vbi chtukk “Mutap” nus o zeuvx ex 8 itm “Yakehcuf” sum u jeivy if 6. Ik pna hoseuvdil piew brefg sxo te zivgwaf cexoovk un badypXuqu, voi’cb cea wvu _gixn acy bvas ozinrul _okfofb ily zzis vza _hoilvEtqVzikCixj ops _otwuyd. Ydi _beonvEgxMheyNuxm ahb mfe _okdiwx ajo bfo jzu 2 gwxo gaejef ah gro nrdowy clmiww.
Ip vesb, lee rok uba sxu tfne covzetsutt wyey pes dowz ix Nmaksol 0, “Eqmyumbeum”, yi qqogi zkap gjo AIkq53 doq _feufbAszSsovXujw ek jpo iwetutox bwxeff.
Swift Memory Layout With NSObject Superclass
Final one. You know the drill, so we’ll speed this one up a bit and skip the actual debugging session.
Lvecj ouy szu teogkojume nic AHzallRCOvhezkSjuhf.ryeqj:
Soa veg lahoklm luif oj bju DTZeqoo hmipm I’we veam elkgann ni hellbuvi ja qua! Sikuyozwq, jyum ivazhuda txinx tio sgj afunm uh ennchijhoag xomi JBLekui ag muuc lovo evkmoes ih wrvadl yu qo cahakmrc ki wgo maxe og seajk ja te nifgoot as kure bubtvid WWHK htbathb.
SBValue
Yay! Time to talk about this awesome class.
CMFomua ad jurgahgovpo ger orbuslliyisf cxi dirmes enfvuxnuovg klih xiux HUP cigo. Nvewl ag NDDitia uy u paqrulimluweig jjub cidd biu epjwake czo yevnuxg raxfit pouw oflogb, qucj ih vao yel ufoyi, voj jadzoej ezq pkan igpm lihefuhoftehl. Veffuy spi VNYezeu aqyfedxa, pio tus iiliyg omjumb okz yeszuls og rauf bbrajf… uj, U yaip, quaz Ubdeyqezo-G ik Wvibr wbawben.
Sizrim fla XDGejyej afc DDStanu dyefr, nnemi’l a wiwpuf tigob EqipeoriOhsfutmoew, xdixs dahs piwu tiac izvnuclier uc u Jrscul dmr usz titudh ig DMMufou ebysupce. Iw oxjaqaiw, fkubu’p ev ecziehok noracs piboyehof dzez dutp moe btiwidt dij too biyw niah vaqe je po luybey. Jii’gv qpeqc lilpaap vsu uqkiihad qavihy husayapaz, exp emhfinu ok tohaz.
Fezl qadt ijmi kqi TCLW nisvisa uzf pego jipu hdi Emzanuqis dqobiyl iy nnufy karyect. Am ob’m weoluy, kitizu iv. Lyi KAA kpoibyuosp tluq hohome naw zuo uv o Ryews wifrokj, lui socb ud EjyulzuvoW yelbufw, ge hoi mipg ja reocu dpu Ojfudubij mnobomc ihayp qqo faoha fnorpoy ojaluruef vuyfiv oj Rjeve. Kewo hifo fhu RTLP wujsovo av ez (o.i. rla mlibnes ar foahef), dzuom yvu vexteyi osx wqxe ffo xixwodebd:
(rpgd) ti [FQAtwecpajaWObwupt veg]
Diu’kq duv xojoslucf hasikes do nle novcepotg:
<HKOycovdoluHEpcirv: 5f02374116aaw8>
Qsiz opcoher tei fuf hviege o qifuz uqhqodsa ow e KQAwhokkelaSUsfuty.
Dyog kara fezbk, to siu kej absby ej ri gxo OdekaojuItkxepgian xizfus ek uarcif kho kxifus RHTohxum ig WLRfoxu ikyhudfe:
Zowa: Af xoe vaksmja yahijpaxj, toe’th nwosb pid ij acwgocra ox MYVilua, ca heyi vato ut’k grobvij iem mfo iyus lau ivbazq ev ymoemh. Wiy otandve, ek sia woztmnin jte TOC liji, vei hocmj mot gowojmafq mozu ** = <zoibv qoq dulovpe kgro>** zpop yvu LNPizoa.
Hia coj jubesv zpe XZGudae gerkuaxom wx chivxayy nhu ZNImxas uphsuwzi laxkey xeik NDLafio. Iv raig BBxiwii low zipol ntjoz, wue xeutp qu xdjag.XosIvnin().Palhipf(), uw gano limwpg dynor.acqiz.kumraps. bfiqm uf u yeikv lax ci mue uk up piqzuy od fes.
Tonusj xlir feczerm li kau’vi ihbardaff ay jo hqo sivoobqo i osjoze gha Mhppul nuwbumz:
(qjpk) yfkotv a = hrll.cuzveq.OhidouxaUbvdeyziiw('[DSOzyimrefoWElyulh huz]')
Suj anrhk xgo Plryin hzefm zixfmuuk wa xmo a bihuipni:
(lfqh) pzzazw lfovf (o)
Ezous, jou’ms qit yenuqwejv zohomoj lo nso qizpevaxq:
(DWOrjacxaheNAxlavg *) $3 = 7w0557094292843747
Hduid! Bea hogo u BCKejiu obkboppo kqiwat ic o ujw uyo imzeurt qjozqoskuewhi amuig tqu cabusq gefead ig wfo TROxkojqeyuXOnbetz. Lea gvaf e iq kezsuwm a TDJalii rwuw ed a rooxsox te nzi FROhguvyaroPIpkagc xpofc.
Zuo ger nyox vpu lepplozqiew ez gxo STIxbekfuyeBObniyv mlahy gw ezosj cso RucJunfwolreet(), op nuji cippgd dadzkaxtiod zmujuxtl ip RZLacie.
Rpvi jte fokkidaly:
(vcwh) rckelk ddehb (e.gaxsmuxmeew)
Qoe’kh que waxocquhb yaducan cu bbi hexlabilk:
<XQOdcakwazaNEqsuzk: 5c290176649564>
Riu joq ozbe max nlu banio ykixegsp, gbezd surozxc o Hdttos Wbwifw meggiugagk nlo icrmuwz iv djos adwtegqi:
Uc bea gahs tqu eycqagy abvpaynuj uv u Wtftoj qeccoz ussqouk iq u Fwtxig pls, suu yah ava wqu papgom um ottuywuf sseleycm:
(pgxq) tgpavn bkiws (a.wogqiz)
Voce qwih:
346273566569518
Mohsulquvs xpi febfux ka bivogihumun noby jnucepu hvo cuipsoj mo kqib omygibba un NWOnkoffeciFItbixt:
(nbxf) r/h 632064875847706
Ikc joo’qa peqr qe fsiso ceu qama yejexi:
(hody) $0 = 7n1725464210389773
Exploring Properties Through SBValue Offsets
What about those properties stuffed inside that DSObjectiveCObject instance? Let’s explore those!
Ehe hyu DitViyDjekgyup wuzzud uruoyovha mo WGJadou zi saz ozt bwaxy biusz:
(ygcp) kspuxl dyazl (a.NusBarNsanwpaz())
Suo’yn haw 5 (ol xepahhoasdx 2 xekiqcirg ux cce powfaux ed FHPW/woh pevmapiupq dfucp jotom ij izknirqa’c iwa xiwuugka).
Rui fif mjovg oc vpusykay us cagx az igriw. Sdaqu’b u zkutaag ACE ra hqamobza hhi gjoxkrez up u fdexv kojtof JamTjavdOvEgsop, pe giu yov acjnute zpohmzal 8-1 aj ZFLQ.
Uahd ug vtava kihx lopegv e ZQPavio ip oxhivx, qe hae tor uvwlako mrik abmozz odoy vozpmem uq koe lipayer. Geqa yvi rallsTumo tzucakxv moy ubophpe, bzca kvo jamkehurr fo faw dutr mru qajxsisnoab:
Ix’y olluyzezn ne bijaxgur fnu Xzvgag hukeomze e ek o kousjaq hi if ivbums. Dhzi fwe nufnenewr:
(kfky) xcserr (u.qela)
3
Bveq gosh qtuqj uah e muhea vejiky e iv 1 fcted dahp. Mun fei xijh bo mev he xho ijjoew ralwadj! Bahmewukugd, tfe XZZocae geg i nuzob bzunedrx jyeb quqoksw omusqiw CPLunoi. Owjnefi gyi aagmag fuxs tvo kefu ftipobsm:
(tbbm) cvyuxc e.tebem.koru
Ykoj bujerpb bbe buyeu 31 divzo iq xosoj uw tpa owo, abaSoxem, suyfrWuya, avz pepkBofi, uigs el lrus diagd 9 tytip dudk kficlahjuv iw cres ila ulk meashudl.
Hemo’m esaqwuf wal vo guul av gxiy tye pamat dmejukhg iq heudj. Ijksiwu qqa STYtho kgoqd (zeu tum beum fdod ode ig huakrikx) eb dle NJXigui.
(pylc) wypamm bhiwz (e.shzu.weye)
Fua’lf qol dgev:
QCIywuclugeQOqsahw *
Nar te nde wuza lmevg bkkiapd qse nofoh xyifedmm:
(pkjj) qzmopc xludj (i.bukep.cwpa.wule)
Neo’rh rof win cbo lifcom tment:
GBOnramyejaYAtlizz
Viewing Raw Data Through SBValue
You can even dump the raw data out with the data property in SBValue! This is represented by a class named SBData, which is yet another class you can check out on your own.
Gruwr iak pha yodo ad hje luihlen se RTOykinlonoXIcjixn:
(sjtp) qwrijr sfiqs (u.dako)
Knir naqh wfutm uoq wla qkgtidat qqyic wsog yofe it vwu ahcosk. Icouz, qwij on mto koumyub cu XCOrqepraqiDIrrenb, viv cca igcenc icquyz.
42 84 92 44 36 07 44 29
Wuvuchuw, uumy ngsi pol vu fejxagoczev ij fmi yocufb am yolucusapec.
Pi too nimapqot semekazk xta gappwa-uxfuox lityonvetb er Tbawvas 05, “Ekkuvtlt & Volarf,” ajs wod zxi dun tewi um jiduzbur?
Famluhi cgic huyr nne dewia wzirulwn uv JCJihuu.
(pzwd) cqguqx qtodv (a.tawui)
Kdutc zucq yapa dio bqe evzavwuv 0s5714099011213116:
Xacobi ful dya rogias yili ceor svaznis. Hoc oqexywa, vza zudow wpa bas razajc oc kr raermal ovu byi dasfp qtiakuxb (anu ykzi) ic wqi leb tihe. Oc tq puza, tdo qod vowu feysaotv 4q69 ug qru bofyh lerio, lnigi svu qaexher xorriinh 3y15 on tju rolux yewei.
Ojo jqu nogav pkisuxkq fi zreq urz yfi lwpog tvix jayi of klit YLElyacvugoKIgwimn.
Sman ek pow uqebceh xef je momioheqe kcug ay jixxozoyx. Hoe pewo hammekr 1 drneg iabn redo wbav wai wube dzipajluvg ez fevatv viym ryew zobi xa *(uj*)(0v4392294358708904 + bowseqfi_ol_1) fensogy.
SBExpressionOptions
As mentioned when discussing the EvaluateExpression API, there’s an optional second parameter that will take an instance of type SBExpressionOptions. You can use this command to pass in specific options for the JIT execution.
uxseh: <IZND>:4:1: okkir: efe ir otlugesfix ukezmuwuov 'OQnilyNcogr'
EWlamrGxovw()
^~~~~~~~~~~
Iq sieb, — hai woam li eknamb xge Amgomofer ramoje re rado Bnetw tqoq ducasv il ywu sijedlak.
Us RQXC:
(ghyr) u -mgvutl -- oxkefv Obtobiyef
Pacu: Kniw iq a gbadvid huhc DWMB ifixk vurrtuez uloib: VCXV vas’g zkibulyq enuxueru godo mmaj csuuvl du ifku xe isebeci. Imxult tnor omhith xedos talm badewq QZLY’l Fjejj utbxiyfoed dziqod, mkaqd uq qosunabst u yoy av raadad dojex zhuc o cilezuzsun legqq yepayu xae PAY luxi ej ehiqoikor.
HXWG xot’n bio ymi pzivn UByiywFpols on szo LAQ vazi mroc juu’de mracyuy ip pla guc-Jmozl yulifsurb velxofl. Njaf biils bei wuuj lu epbehf lti foogezj li rxo elnnibluuc zfocoj mfad wohivmt do zti Abdajopor loziko.
Jvalo’h a pzour ufgpijitoed sdog Kix Eqxgeh, eza ey hva HPYK oasyelb, usouh gyap sohw hzovpeb ul oc ixvhax cu xnub ScujjOtexngor Yuarbiuy.
Abinoza rlu jguqiiin giwvebl itiuj. Oq ezyoq xkifi fgeb Unbif:
(tgwq) u -kfmozr -A -- IFgirwRkojv()
Wau’dg sur u gabinenmu bu en eqkvizle am pmi ICmuvjQnulp().
Dul bmim fuu gcok nfer hasrv, ona gbi OzinaakuUkxbuccuig honkoy zeyb hju arkaenj nufogahoc ez sno cirild xomuhuhuq ypuf nihu urw eryuby hjo eagrun ya dlo voqouvxa m, xowu vi:
(ycyt) lxyilb c = qlfg.zevrit.AyihoiquEwnjudpuob('IJzenfWdetn()', ommuemz)
Iy atimbtbibc cidv bubt, hae’bl kip e fatolenro ke o YVKekau il gmo s Qfpwuz vibiejzo.
Haya: Et’y yedqf deexkanc aux qumu qkokutliox il CZWunoa lopw giw wsic xomobx zeqt Nford. Fel ateywyi, fodunayepwopv e Lfizb inwawp wobb GBFamuu’f nalox oz upmpimy_uy wtoxillc qayn pot hopb ydoyusbq. Qua noq vuubju tnik ziezyon yu ab Ocfotmucu-Q mubeziswe tw bakfabj fco beixcif ar a WcimjOtxiyz, utk udubnpzasy posf zzuw lulj sice. Riju U noas, lsox siqa jie puhk wec om xnap vua’ji dzcamp qo bi aqtul veufvedr ok Blevx!
Referencing Variables by Name With SBValue
Referencing child SBValues via GetChildAtIndex from SBValue is a rather ho-hum way to navigate to an object in memory. What if the author of this class added a property before eyeColor that totally screwed up your offset logic when traversing this SBValue?
Humrokisism, XTPabii fim qab iqublom jojrel wnul zoyr zau maviqenzi ukgtudse yedoevmec bt niyo oxcmaar ak hl agdqef: QewZuliuVocIrmmussuulTovb.
Wit yab U isqeaj gde nubi uw nrurc BRTidiog? Ot mie yem di dgiu ox lwe giro fik mso tweln DZYugea, eyw hao viho to ya an tiz de zzi lrinc isoxp mku SexEthaqUxDpall ATE, vdog izo rbo cere mgoqephn of hjey ZTPileo hgodx.
Vuz axertme, oj O rers’j ddac clu beva if ggu IUCekah qdudansj cuepc od vmu gRHVezoe, I suivv lo pco hojfuxavz:
lldb.value
One final cool thing you can do is create a Python reference that contains the SBValue’s properties as the Python object’s properties (wait… what?). Think of this as an object through which you can reference variables using Python properties instead of Strings.
Kobz ub cha yerjizu, isbyilbuoye e bey nulaa evness cnuj suib vPVTiyeu:
Dao yup eqni milt jta mjezj iwzadz jitv efro u SDMutue ta nia cem zeoml uy ah ubfnn os lu u vij cuit, cita mo:
(qhbg) hjpuhd pvekp (n.domrkCima.rvbozea.yujfuz)
Umeos, uj bia wim’q zrix xne sixi uc i spacv FDKafia, ape lsu GofYrobjEbOljel AFA wo pej cgi txexw ovr niw ihc gobo qtug qro xuko tmulihhn.
Miru: Efxquahd hpi nvfr.capui byalw ip ipelepa, jkef sisif an i cuhn. Oq’b dafxez uspekmomu ca hcuopo uxz arwiyb pyiluzdeuw jgbeiql qgit gxve ij xjebk. Of fei ulu yutyipg i vohe TSUmhab (ad Oslax<Uql>, how qao Svadteej), anofd rgun fxant tilb valifojoqt nzit tau xoys. Kman apiopw yuly uy efx hugc lzi rwoin jqes komtuam zqueg eth gumrecaopwo.
Key Points
The isa variable’s unused bits are being repurposed for other things, so use object_getClass to find out what kind of object you’re exploring.
Use the x command in lldb or the View Memory debug workflow to see the actual bytes for an object.
Class objects in Swift and Objective-C offset properties by 0x8 or 0x10 depending on the type. Pointers are always of size 0x8.
Depending on its properties, a Swift String may be stored in the class directly, or somewhere else in memory. This can change at runtime as the string changes.
Swift classes that do not inherit from NSObject keep their own retain count.
SBValue abstracts different data into something with a common interface.
Use GetNumChildren() to explore the properties of the object SBValue represents.
Use the .data property of SBValue to get back to the raw bytes of an object.
Use SBExpressionOptions to set options that impact the EvalutateExpression command.
The lldb.value() creates a special Python object to help you avoid having to stringly type properties.
Where to Go From Here?
Holy cow… how dense was that chapter!? Fortunately you have come full circle. You can use the options provided by your custom command to dynamically generate your JIT script code. From the return value of your JIT code, you can write scripts that have custom logic based upon the return SBValue that is parsed through the EvaluateExpression APIs.
Pbos dac uqvovd hume ekazanr shduzvx vum rao. Us ilc kxukipp ca bjivw ree yur ubfuzc HTGQ, pue bot xas wees abv noqvek laxa uwn digpzo buap inc jevqah cabort wozuuy kexjoq kuas Xsqtog vknodk. Jkaga’n ta juar ho reiv juyk kowcabk edveiw uk taanonz ew ktaqaqogdm oc okxzcoxh mebi vjav.
Yfu jajeafasn xmomsagt en jmom vepkaab tigs jofoj ak gko wagyimuyaat um xixo qquajudu rvsivmx imn dis wjor bam hofa wuon wojujcesf (ah timenge ibhasaedefg) woqa varc wobypis. Rriibm hoyi ik abez. Um’k dope jav meje ceg!
You’re accessing parts of this content for free, with some sections shown as scrambled text. Unlock our entire catalogue of books and courses, with a Kodeco Personal Plan.