├── patch.sh ├── before_after.jpg ├── objection.cfg.json ├── README.md └── okc.js /patch.sh: -------------------------------------------------------------------------------- 1 | objection patchapk -s OKCupid.apk -c objection.cfg.json -l okc.js --use-aapt2 -------------------------------------------------------------------------------- /before_after.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Seadox/OKC-Likes-Viewer/HEAD/before_after.jpg -------------------------------------------------------------------------------- /objection.cfg.json: -------------------------------------------------------------------------------- 1 | { 2 | "interaction": { 3 | "type": "script", 4 | "path": "libfrida-gadget.script.so", 5 | "on_load": "resume" 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # View Who Liked Your OkCupid Profile 2 | 3 | This project contains scripts and configurations for hooking into the OkCupid Android application using Frida and Objection. The Frida script allows you to see who "liked" your profile in the "Discover" tab. 4 | 5 | ## ⚠️ Disclaimer ⚠️ 6 | 7 | I DO NOT take any responsibility for security issues or bans. 8 | 9 | ## Files 10 | 11 | 1. `okc.js` 12 | 13 | A Frida script used to hook and modify specific behaviors in the OkCupid app. Allowing you to see who "liked" your profile in the "Discover" tab. 14 | 15 | 2. `objection.cfg.json` 16 | 17 | Configuration file for Objection. 18 | 19 | 3. `patch.sh` 20 | 21 | A shell script to automate the patching of the OkCupid APK using Objection and Frida. 22 | 23 | ## Usage 24 | 25 | ### Prerequisites 26 | 27 | - Android device or emulator with the OkCupid app installed. 28 | 29 | - Frida installed on both the host machine and the Android device. 30 | 31 | - Objection installed (`pip install objection`). 32 | 33 | ### Steps to Run 34 | 35 | 1. Patch the APK using the provided script: 36 | 37 | `./patch.sh` 38 | 39 | 2. Install the patched APK on your device or go to [releases](https://github.com/Seadox/OKC-Likes-Viewer/releases) and dowload the apk file to your deivce. 40 | 41 | `adb install -r OKCupid_app-version_CPU-architecture.apk` 42 | 43 | ## Before and After Images 44 | 45 | ![Before & after](/before_after.jpg) 46 | 47 | ## Patched Versions 48 | 49 | Patched APK files are available for specific CPU architectures. Make sure to download the correct version for your device. 50 | 51 | ### How to Check Your Device's CPU Architecture 52 | 53 | To check your device's CPU architecture, you can use one of the following methods: 54 | 55 | - **Using ADB:** Run the following command: 56 | 57 | `adb shell getprop ro.product.cpu.abi` 58 | 59 | This will return the CPU architecture, such as `arm64-v8a` or `armeabi-v7a`. 60 | 61 | - **Using a Terminal on the Device:** If you have a terminal app installed, you can check with: 62 | 63 | `getprop ro.product.cpu.abi` 64 | 65 | - **Using a Third-Party App.** 66 | 67 | ## Known Issues 68 | 69 | - After logging in, you may encounter an error message prompting you to update the app. Simply reopen the app, and you will be logged in successfully. 70 | - The app disconnects the user every few hours. 71 | -------------------------------------------------------------------------------- /okc.js: -------------------------------------------------------------------------------- 1 | Java.perform(() => { 2 | const VoteTypeEnum = Java.use("com.okcupid.okcupid.data.model.VoteTypeEnum"); 3 | 4 | const ids = new Set(); 5 | 6 | const OnStackMatch = Java.use( 7 | "com.okcupid.okcupid.graphql.api.fragment.ApolloDoubleTakeStack$OnStackMatch" 8 | ); 9 | OnStackMatch["$init"].implementation = function ( 10 | match, 11 | stream, 12 | targetLikesSender, 13 | profileHighlights, 14 | hasSuperlikeRecommendation 15 | ) { 16 | if (targetLikesSender === true && match.user !== null) { 17 | const user = match.user.value; 18 | const userId = user.id.value; 19 | 20 | ids.add(userId); 21 | } 22 | this["$init"]( 23 | match, 24 | stream, 25 | targetLikesSender, 26 | profileHighlights, 27 | hasSuperlikeRecommendation 28 | ); 29 | }; 30 | 31 | const User = Java.use("com.okcupid.okcupid.data.model.User"); 32 | User["$init"].overload( 33 | "java.lang.String", 34 | "java.lang.Boolean", 35 | "com.okcupid.okcupid.data.model.Percentages", 36 | "com.okcupid.okcupid.data.model.UserInfo", 37 | "java.lang.String", 38 | "java.util.List", 39 | "java.lang.Boolean", 40 | "com.okcupid.okcupid.data.model.Likes", 41 | "com.okcupid.okcupid.ui.doubletake.models.LastContacts", 42 | "java.lang.Boolean", 43 | "java.lang.Boolean", 44 | "java.lang.String", 45 | "java.lang.Long", 46 | "java.util.List", 47 | "com.okcupid.okcupid.data.model.Story", 48 | "java.lang.String", 49 | "java.util.List", 50 | "boolean", 51 | "java.lang.Boolean", 52 | "java.util.List", 53 | "java.lang.Boolean", 54 | "java.lang.Boolean", 55 | "com.okcupid.okcupid.ui.profile.model.FirstMessage", 56 | "java.lang.String", 57 | "java.lang.String", 58 | "java.lang.String", 59 | "boolean", 60 | "boolean", 61 | "com.okcupid.okcupid.ui.profile.model.Badge", 62 | "com.okcupid.okcupid.ui.profile.model.Badge", 63 | "java.lang.String", 64 | "com.okcupid.okcupid.data.model.VoteTypeEnum", 65 | "com.okcupid.okcupid.data.model.VoteTypeEnum", 66 | "java.lang.Boolean", 67 | "java.util.List", 68 | "java.lang.Boolean", 69 | "com.okcupid.okcupid.data.model.UserVerificationStatus", 70 | "java.util.List", 71 | "com.okcupid.okcupid.data.model.UserLocation", 72 | "java.lang.Integer", 73 | "boolean", 74 | "boolean", 75 | "com.okcupid.okcupid.ui.message.data.Message" 76 | ).implementation = function ( 77 | userid, 78 | online, 79 | percentages, 80 | userInfo, 81 | username, 82 | list, 83 | bool, 84 | likes, 85 | lastContacts, 86 | inactive, 87 | bool2, 88 | str, 89 | l, 90 | list2, 91 | story, 92 | str2, 93 | list3, 94 | z, 95 | bool3, 96 | list4, 97 | bool4, 98 | bool5, 99 | firstMessage, 100 | str3, 101 | str4, 102 | str5, 103 | z2, 104 | z3, 105 | badge, 106 | badge2, 107 | str6, 108 | voteTypeEnum, 109 | voteTypeEnum2, 110 | bool6, 111 | list5, 112 | bool7, 113 | userVerificationStatus, 114 | list6, 115 | userLocation, 116 | num, 117 | z4, 118 | z5, 119 | message 120 | ) { 121 | if (ids[userid] && userInfo !== null) { 122 | const name = userInfo.displayName.value; 123 | const age = userInfo.age.value; 124 | const location = userInfo.location.value; 125 | 126 | const match_percentages = percentages.match.value; 127 | 128 | voteTypeEnum2 = VoteTypeEnum.valueOf("SUPERLIKE"); 129 | 130 | console.log( 131 | `Name: ${name}, age: ${age}, location: ${location}, match percentages: ${match_percentages}%` 132 | ); 133 | } 134 | this["$init"]( 135 | userid, 136 | online, 137 | percentages, 138 | userInfo, 139 | username, 140 | list, 141 | bool, 142 | likes, 143 | lastContacts, 144 | inactive, 145 | bool2, 146 | str, 147 | l, 148 | list2, 149 | story, 150 | str2, 151 | list3, 152 | z, 153 | bool3, 154 | list4, 155 | bool4, 156 | bool5, 157 | firstMessage, 158 | str3, 159 | str4, 160 | str5, 161 | z2, 162 | z3, 163 | badge, 164 | badge2, 165 | str6, 166 | voteTypeEnum, 167 | voteTypeEnum2, 168 | bool6, 169 | list5, 170 | bool7, 171 | userVerificationStatus, 172 | list6, 173 | userLocation, 174 | num, 175 | z4, 176 | z5, 177 | message 178 | ); 179 | }; 180 | }); 181 | --------------------------------------------------------------------------------