[{"data":1,"prerenderedAt":446},["ShallowReactive",2],{"\u002Fblog\u002F2026\u002Fpublic-twitter":3,"\u002Fblog\u002F2026\u002Fpublic-twitter-surround":435},{"id":4,"title":5,"author":6,"badge":11,"body":13,"date":424,"description":425,"draft":426,"extension":427,"image":428,"meta":430,"navigation":426,"path":431,"seo":432,"stem":433,"__hash__":434},"posts\u002Fblog\u002F2026\u002Fpublic-twitter.md","Make Twitter Public Again!",{"name":7,"to":8,"avatar":9},"Nir Galon","https:\u002F\u002Fx.com\u002Fnirgn975",{"src":10},"\u002Favatar.webp",{"label":12},"reverse engineering",{"type":14,"value":15,"toc":416},"minimark",[16,33,36,51,61,66,75,90,95,113,157,160,167,170,177,181,200,212,226,233,248,306,322,334,337,341,349,360,398,408,412],[17,18,19,20,27,28,32],"p",{},"Everybody talks about Twitter these days, so I would do it too. I love browsing Twitter and if you don't know - you can do it without being registered, just go to ",[21,22,26],"a",{"href":23,"rel":24},"https:\u002F\u002Ftwitter.com",[25],"nofollow","twitter.com"," and you have a search bar at the top and ",[29,30,31],"em",{},"\"Explore\""," button in the left menu, you can search posts, browse hashtags, go to users' profiles and see their info, tweets, media, following, followers - everything. Twitter is public and they're not hiding it.",[17,34,35],{},"But what if you go to their mobile app? I downloaded their mobile app to my Android device and was presented with a login\u002Fsignup screen without a way to go around it. So I thought to myself, if their viewing API is public on the web, maybe it's open on mobile too and I just need to (somehow) go past that login\u002Fsignup screen. But how would I do that?",[17,37,38,39,44,45,50],{},"Enter ",[21,40,43],{"href":41,"rel":42},"https:\u002F\u002Ffrida.re",[25],"Frida","! Frida is a ",[29,46,47],{},[29,48,49],{},"Dynamic instrumentation toolkit for developers, reverse-engineers, and security researchers"," by its own definition, but in simple language it's just a tool that lets you inject snippets of JavaScript into native apps on Windows, macOS, GNU\u002FLinux, iOS, Android, and QNX.",[17,52,53],{},[54,55],"img",{"alt":56,"className":57,"src":60},"Frida Toolkit",[58,59],"rounded-lg","mx-auto","\u002Fposts\u002F2025\u002Fpublic-twitter\u002Ffrida-toolkit.webp",[62,63,65],"h2",{"id":64},"_1-the-plan","1. The Plan",[17,67,68,69,74],{},"Another great tool that we'll need to install on our local machine is ",[21,70,73],{"href":71,"rel":72},"https:\u002F\u002Fdeveloper.android.com\u002Fstudio",[25],"Android Studio",", this is an IDE that's used by Android app developers to develop their apps, it comes with an Android Virtual Device (AVD) to test and see the app while developing it, and we'll use it to run the Twitter app and Frida.",[17,76,77,78,83,84,89],{},"The last thing we need is the actual Twitter app, you can download the Twitter ",[21,79,82],{"href":80,"rel":81},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FApk_(file_format)",[25],"apk"," from ",[21,85,88],{"href":86,"rel":87},"https:\u002F\u002Fapkmirror.com",[25],"here",".",[91,92,94],"h3",{"id":93},"_11-avd","1.1. AVD",[17,96,97,98,103,104,108,109,112],{},"I'll not go over the installation part of Android Studio and how to create an AVD, just search Google for it, there are plenty of tutorials about it. Once you have your AVD up and running on your local machine, and the Twitter apk, you can check that your virtual device is up and you can interact with it through ",[21,99,102],{"href":100,"rel":101},"https:\u002F\u002Fdeveloper.android.com\u002Fstudio\u002Fcommand-line\u002Fadb",[25],"adb"," with the ",[105,106,107],"code",{},"adb devices"," command, and then install the apk with the ",[105,110,111],{},"install"," command.",[114,115,121],"pre",{"className":116,"code":117,"filename":118,"language":119,"meta":120,"style":120},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","adb install ~\u002FDownloads\u002Fcom.twitter.android_9.65.3-release.0-29653000_minAPI21\\(arm64-v8a,armeabi-v7a,x86,x86_64\\)\\(nodpi\\)_apkmirror.com.apk\n","terminal","bash","",[105,122,123],{"__ignoreMap":120},[124,125,128,131,135,138,142,145,148,151,154],"span",{"class":126,"line":127},"line",1,[124,129,102],{"class":130},"sBMFI",[124,132,134],{"class":133},"sfazB"," install",[124,136,137],{"class":133}," ~\u002FDownloads\u002Fcom.twitter.android_9.65.3-release.0-29653000_minAPI21",[124,139,141],{"class":140},"sTEyZ","\\(",[124,143,144],{"class":133},"arm64-v8a,armeabi-v7a,x86,x86_64",[124,146,147],{"class":140},"\\)\\(",[124,149,150],{"class":133},"nodpi",[124,152,153],{"class":140},"\\)",[124,155,156],{"class":133},"_apkmirror.com.apk\n",[17,158,159],{},"This is how it'll look if it all went successfully",[17,161,162],{},[54,163],{"alt":164,"className":165,"src":166},"ADB Install",[58,59],"\u002Fposts\u002F2025\u002Fpublic-twitter\u002Fadb-install.webp",[17,168,169],{},"And then you'll see the Twitter app on your virtual device",[17,171,172],{},[54,173],{"alt":174,"className":175,"src":176},"Twitter in AVD",[58,59],"\u002Fposts\u002F2025\u002Fpublic-twitter\u002Ftwitter-in-avd.webp",[91,178,180],{"id":179},"_12-frida","1.2. Frida",[17,182,183,184,187,188,191,192,195,196,199],{},"Before we continue, let's talk a bit about ",[21,185,43],{"href":41,"rel":186},[25],". In our case, Frida is split into 2 parts: the ",[105,189,190],{},"frida-tools"," which is a Python package that offers some CLI tools that can be used for quick instrumentation, and the ",[105,193,194],{},"frida-server"," which is just a daemon that exposes ",[105,197,198],{},"frida-core"," over TCP (listening on localhost:27042 by default) and accepts injection commands. This allows Frida to connect via ADB\u002FUSB debugging to our device.",[17,201,202,203,205,206,211],{},"So the first step is to install ",[105,204,190],{}," on your local machine, which you can do with ",[21,207,210],{"href":208,"rel":209},"https:\u002F\u002Fpypi.org\u002Fproject\u002Fpip",[25],"pip"," (package installer for Python)",[114,213,215],{"className":116,"code":214,"filename":118,"language":119,"meta":120,"style":120},"pip install frida-tools\n",[105,216,217],{"__ignoreMap":120},[124,218,219,221,223],{"class":126,"line":127},[124,220,210],{"class":130},[124,222,134],{"class":133},[124,224,225],{"class":133}," frida-tools\n",[17,227,228,229,232],{},"To check that frida was installed and everything is working as expected you can write ",[105,230,231],{},"frida-ps"," and see an output of all the running processes on your local machine.",[17,234,235,236,238,239,244,245,247],{},"Next let's download the latest ",[105,237,194],{}," from its ",[21,240,243],{"href":241,"rel":242},"https:\u002F\u002Fgithub.com\u002Ffrida\u002Ffrida\u002Freleases",[25],"GitHub page here",", and unzip it and extract the file inside it. Then we need to rename it to ",[105,246,194],{}," (just for convenience) and push it to the virtual device and run it as a background process",[114,249,251],{"className":116,"code":250,"filename":118,"language":119,"meta":120,"style":120},"adb root\nadb push frida-server \u002Fdata\u002Flocal\u002Ftmp\u002F\nadb shell \"chmod 755 \u002Fdata\u002Flocal\u002Ftmp\u002Ffrida-server\"\nadb shell \"\u002Fdata\u002Flocal\u002Ftmp\u002Ffrida-server &\"\n",[105,252,253,260,274,292],{"__ignoreMap":120},[124,254,255,257],{"class":126,"line":127},[124,256,102],{"class":130},[124,258,259],{"class":133}," root\n",[124,261,263,265,268,271],{"class":126,"line":262},2,[124,264,102],{"class":130},[124,266,267],{"class":133}," push",[124,269,270],{"class":133}," frida-server",[124,272,273],{"class":133}," \u002Fdata\u002Flocal\u002Ftmp\u002F\n",[124,275,277,279,282,286,289],{"class":126,"line":276},3,[124,278,102],{"class":130},[124,280,281],{"class":133}," shell",[124,283,285],{"class":284},"sMK4o"," \"",[124,287,288],{"class":133},"chmod 755 \u002Fdata\u002Flocal\u002Ftmp\u002Ffrida-server",[124,290,291],{"class":284},"\"\n",[124,293,295,297,299,301,304],{"class":126,"line":294},4,[124,296,102],{"class":130},[124,298,281],{"class":133},[124,300,285],{"class":284},[124,302,303],{"class":133},"\u002Fdata\u002Flocal\u002Ftmp\u002Ffrida-server &",[124,305,291],{"class":284},[17,307,308,309,311,312,103,314,317,318,321],{},"To check that ",[105,310,194],{}," is running on the virtual device and your local frida can talk to it, run ",[105,313,231],{},[105,315,316],{},"U"," flag (for ",[105,319,320],{},"usb",")",[114,323,325],{"className":116,"code":324,"filename":118,"language":119,"meta":120,"style":120},"frida-ps -U\n",[105,326,327],{"__ignoreMap":120},[124,328,329,331],{"class":126,"line":127},[124,330,231],{"class":130},[124,332,333],{"class":133}," -U\n",[17,335,336],{},"If you see all the running processes of the android device - you are good to go.",[62,338,340],{"id":339},"_2-find-the-hook","2. Find the hook",[17,342,343,344,321],{},"To know which function to hook with Frida we need to do some digging in the app code, but we don't have its source code, just the compiled code. So we'll use some tools to decompile the app (using ",[21,345,348],{"href":346,"rel":347},"https:\u002F\u002Fgithub.com\u002Fpxb1988\u002Fdex2jar",[25],"dex2jar",[17,350,351,355,356],{},[21,352,353],{"href":353,"rel":354},"http:\u002F\u002Fwww.javadecompilers.com\u002F",[25]," or ",[21,357,358],{"href":358,"rel":359},"https:\u002F\u002Fwww.decompiler.com\u002F",[25],[114,361,363],{"className":116,"code":362,"filename":118,"language":119,"meta":120,"style":120},"brew install dex2jar\nd2j-dex2jar -d com.twitter.android_9.65.3-release.0-29653000_minAPI21\\(arm64-v8a,armeabi-v7a,x86,x86_64\\)\\(nodpi\\)_apkmirror.com.apk\n",[105,364,365,375],{"__ignoreMap":120},[124,366,367,370,372],{"class":126,"line":127},[124,368,369],{"class":130},"brew",[124,371,134],{"class":133},[124,373,374],{"class":133}," dex2jar\n",[124,376,377,380,383,386,388,390,392,394,396],{"class":126,"line":262},[124,378,379],{"class":130},"d2j-dex2jar",[124,381,382],{"class":133}," -d",[124,384,385],{"class":133}," com.twitter.android_9.65.3-release.0-29653000_minAPI21",[124,387,141],{"class":140},[124,389,144],{"class":133},[124,391,147],{"class":140},[124,393,150],{"class":133},[124,395,153],{"class":140},[124,397,156],{"class":133},[17,399,400,401,404,405,407],{},"And you'll see a ",[105,402,403],{},".jar"," file with the same name of the ",[105,406,82],{},". Now we need to open it some software that can",[62,409,411],{"id":410},"_5-summary","5. Summary",[413,414,415],"style",{},"html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}",{"title":120,"searchDepth":262,"depth":262,"links":417},[418,422,423],{"id":64,"depth":262,"text":65,"children":419},[420,421],{"id":93,"depth":276,"text":94},{"id":179,"depth":276,"text":180},{"id":339,"depth":262,"text":340},{"id":410,"depth":262,"text":411},"2026-12-01","Using Frida to try bypassing the Twitter mobile app's login wall (draft).",true,"md",{"src":429},"\u002Fposts\u002F2026\u002Fpublic-twitter\u002Fcover.webp",{},"\u002Fblog\u002F2026\u002Fpublic-twitter",{"title":5,"description":425},"blog\u002F2026\u002Fpublic-twitter","OdtxKfkIDm4hyZQzf-q1Uk2TwKhag0SyCsINqIWxIAk",[436,441],{"title":437,"path":438,"stem":439,"description":440,"children":-1},"Getting to know my new neighbors","\u002Fblog\u002F2026\u002Fgetting-to-know-my-neighbors","blog\u002F2026\u002Fgetting-to-know-my-neighbors","Using a Hak5 WiFi Pineapple to plan an attack on a neighbor's wifi (draft).",{"title":442,"path":443,"stem":444,"description":445,"children":-1},"Wardriving become fun again","\u002Fblog\u002F2026\u002Fwardriving","blog\u002F2026\u002Fwardriving","Revisiting wardriving as an adult.",1786001640181]