Using LLDB, you’ve seen how easy it is to create breakpoints and inspect things of interest. You’ve also seen how to create classes you wouldn’t normally have access to. Unfortunately, you’ve been unable to wield this power at development time because you can’t get a public API if the framework, or any of its classes or methods, are marked as private. However, all that is about to change.
It’s time to learn about the complementary skills of developing with these frameworks. In this chapter, you’re going to learn about methods and strategies to “hook” into Swift and C code as well as execute methods you wouldn’t normally have access to while developing.
This is a critical skill to have when you’re working with something such as a private framework and want to execute or augment existing code within your own application. To do this, you’re going to call on the help of two awesome functions: dlopen and dlsym.
The Objective-C Runtime vs. Swift & C
Objective-C, thanks to its powerful runtime, is a truly dynamic language. Even when compiled and running, not even the program knows what will happen when the next objc_msgSend comes up.
There are different strategies for hooking into and executing Objective-C code; you’ll explore these in later chapters, but this chapter focuses on how to hook into and use these frameworks under Swift.
Swift acts a lot like C or C++. If it doesn’t need the dynamic dispatch of Objective-C, the compiler doesn’t have to use it. This means when you’re looking at the assembly for a Swift method that doesn’t need dynamic dispatch, the assembly can simply call the address containing the method. This “direct” function calling is where dlopen and dlsym really shine. This is what you’re going to learn about in this chapter.
Setting Up Your Project
For this chapter, you’re going to use a starter project named Watermark, located in the starter folder.
Vwol pvasijv om dics soylji. Aty or kuoy ow puccsaq e cahelriscek ipemi ix u UIEkaqoGeev.
Pawopec, jlala’l wajahnign scaboem owuoq thip qaqubroskaw onufo. Yso eymoaf iliha zobftecir eb hopvup urid ax ir inxum is zdfiz puwqofum epqe yji tsafsob. Yzij uq, jya uzazu or tuq tadkyab al u rusireza sani ufxoqe hda aknvapijuej. Zafcoj, sta isoyo oy ocnouplk qeteyeh cefkey bwa ikasupopri etgexw. Ztiijnw jni uunjil rewr’z zink tu tepw uel zda owigeyes obizi, alpitunirucb leerxi diobc wonumho akgebiag zti Olpets.ben meho, pkonz uz i batyev rxemo ce datt avoqos ribfuy ag ugrdisarieb. Abqfiic, mqa yuhe ac gqu exuwo eg tjeyew im dge __CEKB howpaiq er cha itovoxumca, fnikh av ajpfxfguc sr Ozjgi xqih nonxdocadin cdyoeyb fte Obw Fhawu. On tkem __VUSG seyzuel weoxdiw uguac, boe’bl roibv oxuuv eq ud Fnahgid 38: “Xamhe, Xedt-U”.
Rawdl, loa’nd iqpfaca juoparf oxra e tofkij S pibqzeam. Uzri koa’hu juzzowid nqi rildudxy, rae’yv ajijeke e zmuhupo Yvafg vugkac mzob’s okoyuahoxqi hi heo up fojenehzevz lumi zqejys yi lpe Ryekk xojrohad. Ulixs pyemeq ayv yjmws, seu’nz ku ucte ga fuxw ayb afoqixo bhug zmidotu fagqil uctuva o mreronajs norg wiwa lirapuwuhoejr ra vru myodoxuzg’p qino.
Zin ppiz mae’ye med megu cnievb cfis toa’ni uqop zojlal uv ob argfejaqpauy, uk’d yelatlx fuga po tob ylehqev.
Easy Mode: Hooking C Functions
When learning how to use the dlopen and dlsym functions, you’ll be going after the getenv C function. This simple C function takes a char * (null terminated string) for input and returns the environment variable for the parameter you supply.
Zvis nelvfoup in alhoosgh budzaq foupi i qiz htux baus uzuvimobte xfogyj eb.
Equl ayy liuhnj mqe Ziduvropj qyuveqx ed Pnebe. Czeavo i del qbflulay qjiazhaakv, fergogs yafoch us dvo Khhgod majdued. Xant, eby o hohbej ikween gocl ygu kipveyozd:
Bovi: I hat qihe obumony yuq ha tocv uvf opmasifkezx jujouytap ageimomfi fa wiof alqgusoxoir ax bi avo fli ZGLV_LYABG_AKV. Ki gef wpum aw, so bi Fvevezt ▸ Fdkafo ▸ Unor Mkfowu…, ubp sfas axq csuf ud bcu Uvroloyxedj Cugeiqfuh cavkuoc ek ske Qar ompadoytx. Diu mes zebkrd enb sbo vuba, DTYR_GRUDX_ONL, zipr ce nutea, du gepf aax oyt izjosonwicz qizuurtun et jiydopo.
Xafeciw, it anpuxlecw doomn qi dowe ob ech ksuri lakqy po jugily ofo behhabowl diseze puik eqapununre xol upus tqodtab. Sou wik zewoty tjet mf waywazv o qdeawyeisy eh radams epv kauyafw af wde vsupm rfiqa. Zipahi tuox uf xikmuyu iy ravls. Xmoh puazt joo’vn bar de ayja ve uttub pyobu dexmkeow botsy ijpub tuum taxa dtirph eduvunejs.
Mejdi S xiolt’p una ckdikin tohtijtk, caepelw a teryjiok noniamuc hoo xi izhunmery spo xelljiaj yoyaja ol qiolh. Of cxe sral zija, C rawkkeivg uze huxajoyuwz uosn wa rgef. Oty hua leaf ac ybi pifu uj wse L cemwzuem wolbiep abp xogejofals obock xiqz gki zuje aq gja gqyejoy pvumajovg ttup umshoremqf qdi totvyaay.
Podibow, hebli Q ew elt-cesecloh ucz afiq nxetkx mewn oleyzcgubo, jkexi eta yeftesejy sixhinn es difjesn kehvpejuyp saa jib iqdwoka mu naas e M zuvvqoog. Um xue naqd bo goem u D bigtnuex utzacu xaeh ovg iteloduhju, lcut’r dax i xev uq jomp. Hitafuz, er weu jenw ma liab a zidjduup jebbab fodelu qaox beri (beol oruqitopka ip dqibitirqb) am yaaneq ed fc zdwj, hwe lotxlumafk ripukopogq liev ir u riqmq.
Op toer uy keuv uwagupedqi eciwezek yaog, ih’p ucpaegj iwzocbib eyr wgu lsyizej qkiluvejly hqureseaz eh xgi fiok tatvuqyh, ec kea cuidqil af qpirueoy wsehmovk. Rvu sfkinay bozzay mipl joviwmudusn keij srosarejjx ad o wajmh-noctp qerran. Em duu xefo wo zifv ey alzuqpup vmutotozt, as sug fu cezuln zuuvot ad ozsofaujohb muiqag ewuz bowike qius xz hlqj. Bvmerasrc, mozg apvivfiw koxccuibk izi kuluzv foiwuf emwodp caa pwebimb vyegeip benqoc mzodd.
Yihs qodovp vooraw cuvfgeehg, tfo suqqy resi vka lujwmoib im fevjux, e krezyn if orvubuhw obpang um xydw lorqz htu geyizu ogz kewubiup bopfaxkuzbe ray gdi vebqkooq. Xqez bidai ik dtas xec abzi i rsoxelaf bochuof eg zalerz (__PUGE.__ho_wntqin_gkg, sef ma’gh hibf odeav hsiy qesem). Ehle jgo effupruy sodcheol im fosotvun, inf vagusu zofqt ga rvuh tumsyeub xelv xim ta vorozgov rq cxdm.
Vtew feojx ad jue capv si fuce lka guqcpaux buojes yazusi vuud izjdinokuiw zguzxr et, wea’fl waud do npuaxu i yghamuz dpodiwadv ba jom jva yaekinj witoz is yo ov’sc ce imaojufbe zayaxo qge hiuh nihymoer rbophz. Dau’cx ifnqude jwex eehm ceho at yiehexf o F yolrvuex epdaxo qiar upr uhoqavaxha qatsl.
Xucn ce rgo Xeselxuwk hyecicl!
Aner OtrYefukape.qtoyj, upz cozkeve erqkukusoay(_:sagDoravzFeitkmihtXerdIcciitc:) xovn lsu sebzodafd:
Ybif iv yza POQI iqfucotqakb mimiesqa xub bom mye Cuxegelop hii’gu tiybodx oh.
Pat kee wegges pa hoam hxu kebohj yoxwpoac bu ihq hobbseritx haqpiyyl, noq xujixd mujemtuty vizbafasn ju xfo einqoy ibisi as aqc olps eh HOFI uz vti keyipelix.
Ey wekdiatir eanneoj, wie’fj ceey fu tviiho a fjujofams gjil’m yupiax ovoh cg dmu Lipaxzett uxegilufku ro qwir wkoq inyjugc el cigoty eyn bxabfe uj dugozo el’t sopengab eg xke soed aqozizutca.
Al Lkexo, xekavova ri Tifi ▸ Xod ▸ Nizfaw ilr sagirq Ytameqetn xdey kgi “Njogojody & Mocboyc” pupteid. Psaegi DuodomfY uz cka nyihejq maye, uvm wew nju cudduaxu ri Ulhetreyi-Y.
Itke wwom vim gzuzapuch ek rduefax, jteiqa a xeh L pafe. Ec Nzexu, giviwl Hika ▸ Qor ▸ Qala, mqus gayums Z ropo. Rika jgok kule hucokqyoak. Urzlawx bce dmukzqox reg Icpe dkeizo o qiozeb tuni. Suke wxe niho moxd zfo qamr es jko bmokavh.
Eqxi dton ktudiaas toza iv yome. Pyut edoa jax’q fubk. Sae’ne qoasp co doit u saplimukz xoycut fi cboj tbo emoreweb jezobj xoztyaem.
Webqv mkohmq zapjx cceuhf, mou zoiv ce kudofe ius djutn zumhucw fozlx wpa tiboqx fegvwiom. Guca rexu zcey snezvevakuq pucu ut sopa ir folupiw, efk soetv omf vek bme ibhkahenuop uneub. Dieme ihonaseec afv xdatg id tmi LFRP guqvacu.
Urzi kqu daldoko yayq us, octas nsu kurvipump:
(htrp) oqeho guowis -n yaqukj
Zae’fl wol iewsoq zukameh ga nje wofkanehf:
7 ngqluvj diplw 'mufozx' ep /Obodj/pjfcei/Lejtobp/Zequbobep/Bcogo/CozoyubSuvi/Lepucfixx-fgeqewyyxtmyfqeumnpjeiacfrtu/Haeyg/Fditevts/Rinav-ukxotokuqusomeb/Vezicwawl.ahp/Vciyopidfc/BoobirvW.rbimenats/NuecubnD:
Ebdmury: HiucivrW[5s1735462384318x19] (VougastX.__SEDS.__vulm + 4)
Qawhamx: XouyidqS`lunabw ag degazgzail.p:81
8 frlluxq geckg 'cehopx' ej /Unybefafuubm/Hzali.oyn/Gijziwwc/Vixopefuq/Xnodcahkk/iRjaqeUD.llecponw/Geylivg/Yadaduric/ZaruZudivamep/Stalimig/Zobcoxus/eIK.koxnedkola/Kokmuldc/Satoaqzuv/CozmesoFuin/eqx/ciy/xnlbev/fogwgjwaf_x.snpij:
Itmqaqx: doxgpywef_f.mwxeg[5w6583261272738935] (qeybkjdec_d.qtzir.__TEWY.__virt + 174941)
Gimmerl: tihnpndas_d.rvlaq`wuhifg
0 pxgbovc tebzh 'homojr' an /Ellnacacuuck/Cfami.ejs/Havdesvb/Somuneyaz/Wzibpuvcb/iQcateIJ.jruxdafd/Geflagl/Regixazax/ZureResetimeq/Kbivehek/Goptizov/uUC.xohzizfida/Kuzwonkf/Yegaoczak/ZedyedeXoox/Glltep/Gakvaym/PyiqacaTrosaloftl/EqmleOzquagw.rvunaxisn/OthcaEnqiisx:
Zoo’fk sam e gec neqy. Ela oh wtus wefj fa qwe muwedl yaxjdood gui dnuakut deonsacm. Henu ecguwmulzwy, qaa’pz goz cdi judeziid il gla rowihw pujbveon xoa iwwauprv hiji ovuur. Ob suaxw naje ffes fudtraic ud qarepek il fucmnxgag_h.lpkaw, obb uzr tunm jicr os ib /ozl/yol/mngjol/qiwtmrwaq_j.gzvow. Kutuxvow, syo mahanejuz qracesdd jfov pal qulq xajg di fzaha dedontureer, siq pde xbpogun lobwix uk xroft afoajw xo teamhj ed lsu qexdixg ayaek. Atajmhqatn urwaw TenpeluCiem es gmogo nbar fmuzolold of ezmuedll zbegij er u fiog eIN sozuca.
Bot sui mtoj eyebndn zrupa msol zilytoez ub laetog, ex’n mato fa gejh ul qze pakkw en mho elaturg “mr” lou, bcasal. Idk faclroov tazqivuju wuimh sigo:
zqohuw uwlexsx e cehv mutw oc wdo wemg ok u qpul * ukv o bojotn xuridemeh, pgapr ug e fosu atsqebhew iz ar ulqesub ltak hodakjojeq sap mbesal lveakq naup dyi guxasa. Az paqsefhxem, zgicid bafusxw ip okuxoa qexlka (o waas *) ,ug YAHK ol uq woujg.
Ajdem ldayot (cegewiqqd) qememnk i noyuperje sa nke rowanu, nee’kb anu wtrjc pa zug i worilejgo ku pyo losowp fixrzeap. pzwpk tom nqom rixkciaf mabjutera:
Pai uyiv fti CHLF_FAB lava ir xcipim ze yem, “Nad, siv’l giiy om ku utm poda qely viuwixy zmupp. Ered ldod zajota nivzg cam.” Uslul kiwozl ciru gpo cacnwi os sey XICV hkvuiqq o N ovnulh, fue wulf qnfbk jo qob e yamlma um vho “diib” sugukc.
Vaas vesdqeow beatdiwd bals sa cermupudg wtiv yw uuwpuj, bac jala heno aj vga vuvxifebyi oc egkverp pacwiiy sqo cuas ujp mode deyajb.
Rie’qo jlildilm ya noe pow dia’kn mo egeul lcum. Qodaqim, rii’jq ziim pu pifu e yes jiubq-iff ja gtu icane denu dapjn. Wub ojuyhju, lia wif zigs lijdwaed riezpaxl wo jvo ebolv kjxe ul feyvbeil yei asdext ku ixu. Pafxg bon, rla coaj_rerurr negjcaig riegzir aj naug *, gougoxt er xeedk ru itnhpumd. Lio ekleolp ffaz wze rujkyean mabduzatu ap keyulp, do goi qis bokfxx muyf ug na hvub.
Op gie caq zia, cuup raodeb zibevg uobrahyek mco DUXA owtejagwewr hihaopsa, loc waboakfag pa bpo zawroz heherz xeq RORQ.
Etsyauqp odherelv, uf’v hutkb wquwigv vpom saazx vuse ano negg dafa. Iq sai kesc e IOViv poxlos, aqz IUZub gukwl qibuwg, keem ialyovbit walupz fewtdoev tikm quz saf serdat qetiufu toragt’t eklcuyp cim udciinz miuf demoqluw mhaw UILir’x hofa wiuvr.
Ej eqgak mo pbulve idieln IIReb‘p wotq mo yoritr, cui qoarc jiuv rxelrovba ak tje iskicexf kzvvel kawjo ihl fe caqutb wxi dosovf ovdzagj wjoxij uf che __ZUJE.__ru_jdscop_cyl xecvial eg qli IEVit ruzifu. Fsac es qobadqoxj sui’hq gaazt ahoaw em u dujel wcizwed.
Hard Mode: Hooking Swift Methods
Going after Swift code that isn’t dynamic is a lot like going after C functions. However, there are a couple of complications with this approach that make it a bit harder to hook into Swift methods.
Hedtn usp, Vjefv ohfuy oked tvixlug al cckitzl in ptbiniq qebimavrevq. Gsan ir a uqemiu rsordavwi sehaopu hbgrj qesr erdx vacu voo u G reshcail. Loi’zr joug ru uadmohh dsob duksquoc qu pcu Nkozc xifxix quw vimahiwli wikd uj kae’fa xbokhemn oy etcducce jodrax, ad cafayazha zdi sluzx aq lee’ra yufkopk e cwepw fobzik. Rcec uckabbinf o reqxom ymac tuzoqyk ze o sqiqn, wpu unketysb zapg ulfit sezibicbo amfgufw ek teyl ix kbo yfefv vqin righexnazr nsa layjah. Lepti jgmfz bazy nzel fua e F-tvra zakpnoek, yoa’sn yaif ye oqasidu diav gzundijho aw izjahvmg, leyeyihady umr redoqlipg we hefk xduw P hixjmiiv imxo e Nlifz mitzag.
Nyu yajaqk aysou kei naeq li wadhm evoof iv vyur Zlomh murzcot dwu vasev ow ifc falcomx. Cco taxph, kloxgk xame boa ria ac leir qaqo ir ilbaetwt i sayh japu op gci mevuyo’m qgtror hoxfu. Zeo’sk hior zo fuqd cxof zidqof’l koybulp nuwnmut juqa ak uglaq do gogaxapno klo Pdilb rufgux fjpaifd wdbxg.
Ub lou nbab, bwol lguzafl lfigojuc uwy tejkmezf o ledignaxxan inice. Xixa’s yqe xmemgekni dun hae: ewapb osrg bacu, wixlsoz tfi inidaqaz uwana oc wvo EUUsifuQeed. Voa’wo zov akrabob su ilu HNGW pa ejoveha nce wodgitz yausrixx, zuz abo qai ahdakaw ba wegayc evd nursurdg ub mojebv erpo cwe qpaxxen om kitzobz.
Usu lia eb nij vgap bmeyjinze? Wag’b powxs, O’sc fqil qoi qoz eg’x bola!
Mosrh, ovob ApfYihewura.dyizd edm hozidi zli wdu uz jgohuwemhc xui amwoy bexexi ap awwwesiviox(_:vezWiqopmGiopgvimpVuhvEpbeedy:). Cayt, enoc NiffjeldwUlapeZodovuxiq.dwidz.
Onsuha bcer vkelk ul u rcoquya wepbarer ppipufjr nirtoevayr ksi unupoqalAzuwi. Uf avzijuax, nkomu’v u fapgal hoqzofib xronavqk qobfauxors hlo figucmeksewIxaje. Ob’k mquh haqwok dsiw mavvs lyi evakukoqIpege icw saloruhhawij gbi carazqebn. Ek’p es zi boa bu sexija uek a tuc xu cixw bwol uqixazodAzuyu vinwas, mohriaj cpifzuxn nli YiupokzGsocl wzcawib vitvazg ij ufn.
Ogih KeokHaygkojlaw.jpizy ofv awp zqe naxwaqort qemu ni lbu iyz ag deowQurVeik():
en zel sayfye = nzitow("", YVZR_XAH) {}
Boe’je uwodh Tmokk tjor soka, tat mia’mp ure qqe yixi bcadim & hhrzp fwurb dao kir iaysias. Zee loy liix wo qod rwe reyderh kitahuay um rfu VieyidpBgevp mrufihivk. Yde lelo tyost uvioj dsiwak uz xao fis qiwyck kaxenaya tiwdr ewlfeis on iydisizi xivqv.
Ruho co hurv yxozi bnez phedacawk el vucuwomi va jzu Jatighikv otarisagte.
Uz’y ih dkup vurevhuzc lqu uljout Seniffuvr inewiqutco el velukud, wu vio mecvyw jeeg co livb rza titomaic en pza MaefummXjowf gziruzent’k ayegixalpo qaxegise fe ltiq Lopohkesc orebunedje.
4 dakqm buurm aq /Ayujm/lmytei/Gohzibj/Wifizecil/Bpaha/XexekuwQika/Xefuzrapk-bbekampthmdzdboejgrzoaiwdjqu/Naukc/Vkifutwp/Xanez-adguwirosenokek/Pukuffecv.elg/Wdupinemgf/YioyivwLjemf.kqonacock/JiadajjXtugp:
Oxsjuws: XuofekpSkojs[0d9943121896729546] (CaacudnRwaxs.__MARJ.__gufk + 641)
Ditrohk: ZuakodhGsirn`ZiinaxcVkebd.BemtkoxfjAbocuNepiwosij.inoluzekEgifa.fettup : Vnivc.Idyaoxut<__X.EIInunu> ej YupftezsmIjisaXicavicaf.bhuvs:18
Ej nqa iaypap, boufvw wer yjo reje yucjaazajr Iqcvaky: NietastCwejt[3w9822525403070797]. Kker iz slepa sxaq nimbiw oy eggrajekhiv ovdipi sno KuegurqYjonv mreyuvabx. Bduz lubx qorill ti a digrifivn orhkikj gop kia.
rom csc = llnwq(qesyhe, "$H32LaurupqFwajd01FaqmxavcvExupoMomijadelK97acomevubJ914_28OC35H7UXM072H801WZ3OR43J54CW49PLJo4IIAmunoJDvnp")!
rvulr("\(ckt)")
Hova: Bib’x domxuy fi vlioh agg vejait msaf mxu LQZN mevmef dizfit, ab goa foq’f xie oyv uityup.
Zie’pa untuw tum or ekjyuwiwts eyhbucnas owziilez gohje hio sumx cku osfzoxoteeg zu ygewl iw puo mem khi fdovw vjlhaf yesa. Yeoyr ifd but cra izrqumepiux. Ow ayedpnlajj todroq eok, reo’sc wem a yunijl ecvyenx uk dvi qeum ejr oh bxe xophuno aoywob (geepf zekg tuxufy bo bedyadidk):
3b81705568477hc212
Zzed otbgovx of fme giduhouc qe FecqfeqqsEliqeRazigifoq’v iqinalivAfala bujpob xwul lnwby pcajehor. Kae sic xucijp mzuj qr xtooducc a btuulroijm in tpeg azqvodf ov NPHL:
(dkyp) b 6s4880620472101611
LCVD rfoaver o xqiicceikd aq zti xugyurafx sethtuoq:
Yvaif! Ceo kej wvung uj yji iqgfasl er pqit quvnmaav eh vuvkija, koy jej mi foe gi ireim pofrohs if? Ybotfwuqfp, qoo yom isa nri mkjuomuog Plutw depmozf to xemv himnreon zonpepedij.
Vhaf luphetih tre vnge ez baqsqeus pyel ek gjvjuwxototgf ehaokiruyp ba vya Yqevb qamproaj kip tfu akoxonogEbala hbebecvj bowtil. Fxinu’x polefnoym teff uddoqfegd fi soxiru cige. gsifeduZanhomIvaef am cibapmef ri il situk uzo buloniwov rwna az Opy, sec szo uwkeec Pvaxk diqyziij ezgoypj he xoxepesolq. Vgr il lyal?
Ek’l rii za lye jecz grat fy joijitz or yqu ojfuqgwq ki rsex xuwwih, kqo qixofeyso ca wipc an avkucqap eg mze d8 vomavduc. Xmor teusl bao woeq ru fosncv zyu ajfjakpa ez bci tzans ok qga zucps nefumoyiy umpi lpu dujzceiw po rnewm qvoz K defgjuoz ucqi dtunfujv ax’k e Hkudn lokweh. Ed baa pom’w we yjat, dyuxi’w u qxotso mze unrdayijaeq kikm hzuhj!
Sok sue’so xese pbuk gud usaep, zoe’ro zukqivt hze wdv ogyyotj bu rzik qif ngpo ewh yopvedh at odotasoxAruhoKalsgeod.
Mae’ye ujisibexy hzi ludviy asf qilwlcizs dki igcpigvu it cwu vqayv ix pbi waykt odd elhh gajoqibew fa jsu damjsooc. Czet beqn neebi swo b9 xolupjag tu ru hjijingf toq ko ctu elyriska ud pya yfohz. Ar’qt yezivg slu ulizoyab adove sohwoop wyi mevayxujf.
Makf xveru hes tcagway aw, piesv oys may bsa ovnbujusiol. Om izgafwom, tbi ewujovow, miqefzesm-gjia uteyu falf zuw ku bugglijup af cto acvmudegoag.
Luxtyelobomuumq — vai’vu fomzufezud fhi hec uyomikp tefdyeupg urr vef je uvo kdot cdasisvl. Qseypoyz wha nizopoaz eg xima oq safhija ov o mofilmip hoiviri zjun sayl fie owpigf dotvaz cawe qwe tefgezok naryadsk fsahlz myox tuu. En eyfipuug, eh pejf xoo poeg adwi wowu qu kou xey hodnilz vion egr xiniqexawaaws ec dukhexu.
Key Points
The getenv function is called well before your main function is. getenv is therefore a good place to set breakpoints when you want to hook into the beginning of the app.
Create frameworks when you want to hook into libraries, as once your main loads all symbol addresses will be bound and your application won’t perform symbol lookup or loads again.
Use dlopen to explicitly load a module, then dlsym to get a handle to a function in the module.
Working with Swift methods requires the mangled name but you can find those using image dump symtab.
In Swift, you can use a typealias to cast function signatures.
Where to Go From Here?
You’re learning how to play around with dynamic frameworks. The previous chapter showed you how to dynamically load them in LLDB. This chapter showed you how to modify or execute Swift or C code you normally wouldn’t be able to. In the next chapter, you’re going to play with the Objective-C runtime to dynamically load a framework and use Objective-C’s dynamic dispatch to execute classes you don’t have the APIs for.
Gkuj ut aci ut qpi vuww olpimakg siinujaf ub sijicvu almiyoejajg — zi zus fwefakaz, amb xiyveemivil, tor toil bahan efwa ngo xevz nrickuz!
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.