hulu

package
v1.10.9 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 23, 2026 License: OSL-3.0 Imports: 7 Imported by: 0

README

Hulu

tv

phone after login

create Android 7.1 device. install system certificate. do the login without proxy, then kill app, start proxy and start app again, you will be able to capture everything after the login

phone login

create Android 7.1 device. install system certificate. enter credentials:

adb shell input text HELLO

after entering password, if you click LOG IN you get this:

Hulu servers are not reachable. Check your internet connection and try again.

if we disable proxy? it works. next:

pip install frida-tools

download and extract server:

https://github.com/frida/frida/releases

for example:

frida-server-17.3.2-android-x86.xz 

install app, then push server:

$frida = 'frida-server-17.3.2-android-x86'
adb root
adb push $frida /data/app/frida-server
adb shell chmod +x /data/app/frida-server
adb shell /data/app/frida-server

then:

https://github.com/httptoolkit/frida-interception-and-unpinning

update config.js:

  1. CERT_PEM from C:\Users\Steven\.mitmproxy\mitmproxy-ca-cert.pem
  2. PROXY_PORT to 8080
  3. DEBUG_MODE to true

then:

frida -U `
-l config.js `
-l android/android-certificate-unpinning.js `
-l android/android-certificate-unpinning-fallback.js `
-f com.hulu.plus

if you get "Waiting for USB device to appear", you might need to reinstall Python. now I get "Hulu has stopped". then:

adb logcat -T1 > hulu.txt

then:

[!] Matched class okhttp3.CertificatePinner but could not patch any methods

get methodName:

Thrown by okhttp3.internal.platform.android.AndroidCertificateChainCleaner->a

this worked a couple of times:

+++ b/android/android-certificate-unpinning.js
@@ -223,7 +223,7 @@ const PINNING_FIXES = {

     'okhttp3.CertificatePinner': [
         {
-            methodName: 'check',
+            methodName: 'a',
             overload: ['java.lang.String', 'java.util.List'],
             replacement: () => NO_OP
         },

but it seems to be a race condition or something, as it only works sometimes. like it might fail the first time, but then if I restart the app it will work. not sure.

https://github.com/httptoolkit/frida-interception-and-unpinning/issues/55

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func Id

func Id(link string) (string, error)

hulu.com/movie/05e76ad8-c3dd-4c3e-bab9-df3cf71c6871 hulu.com/movie/alien-romulus-05e76ad8-c3dd-4c3e-bab9-df3cf71c6871

Types

type Dash

type Dash struct {
	Body []byte
	Url  *url.URL
}
type DeepLink struct {
	EabId   string `json:"eab_id"`
	Message string
}

type Playlist

type Playlist struct {
	DashPrServer string `json:"dash_pr_server"`
	WvServer     string `json:"wv_server"`
	Message      string
	StreamUrl    string `json:"stream_url"` // MPD
}

func (*Playlist) Dash

func (p *Playlist) Dash() (*Dash, error)

func (*Playlist) PlayReady

func (p *Playlist) PlayReady(data []byte) ([]byte, error)

func (*Playlist) Widevine

func (p *Playlist) Widevine(data []byte) ([]byte, error)

type Session

type Session struct {
	Data struct {
		DeviceToken string `json:"device_token"`
		UserToken   string `json:"user_token"`
	}
}
func (s *Session) DeepLink(id string) (*DeepLink, error)

func (*Session) Fetch

func (s *Session) Fetch(email, password string) error

func (*Session) Playlist

func (s *Session) Playlist(deep *DeepLink) (*Playlist, error)

1080p L3, SL2000 1440p SL3000

func (*Session) TokenRefresh

func (s *Session) TokenRefresh() error

returns user_token only

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL