Developing a TCP Network Proxy - Pwn Adventure 3

SdĂ­let
VloĆŸit
  • čas pƙidĂĄn 21. 06. 2018
  • Part 9: To analyse the game traffic, we are developing a simple proof of concept TCP network proxy. Then we can start to reverse engineer the protocol.
    GitHub: github.com/LiveOverflow/PwnAd...
    🌮 Playlist: ‱ Pwn Adventure 3: Pwnie...
    =[ 🔮 Stuff I use ]=
    → Microphone:* geni.us/ntg3b
    → Graphics tablet:* geni.us/wacom-intuos
    → Camera#1 for streaming:* geni.us/sony-camera
    → Lens for streaming:* geni.us/sony-lense
    → Connect Camera#1 to PC:* geni.us/cam-link
    → Keyboard:* geni.us/mech-keyboard
    → Old Microphone:* geni.us/mic-at2020usb
    US Store Front:* www.amazon.com/shop/liveoverflow
    =[ ❀ Support ]=
    → per Video: / liveoverflow
    → per Month: / @liveoverflow
    =[ 🐕 Social ]=
    → Twitter: / liveoverflow
    → Website: liveoverflow.com/
    → Subreddit: / liveoverflow
    → Facebook: / liveoverflow
    =[ 📄 P.S. ]=
    All links with "*" are affiliate links.
    LiveOverflow / Security Flag GmbH is part of the Amazon Affiliate Partner Programm.
    #PwnAdventure #NetworkSecurity #CTF

Komentáƙe • 287

  • @andreerfabbro
    @andreerfabbro Pƙed 6 lety +237

    LOVE YOUUUUU! KEEP IT UP!!
    Seriously, this CZcams series is some of the highest level stuff I’ve ever seen. ❀

    • @d3m815
      @d3m815 Pƙed 6 lety +2

      same

    • @muuzis
      @muuzis Pƙed 6 lety +1

      LOL as lots of love

    • @GrandpaGameHacker
      @GrandpaGameHacker Pƙed 6 lety

      This is so awesome!!! I'm taking out of it some python i didn't know too â˜ș

    • @benusman1738
      @benusman1738 Pƙed 6 lety

      Yep, I also binge watched the whole thing and can not wait for the next part to be released! Also, author has really good feel of what is interesting and what is dumb and technical. At least from my perspective. I really like it!

    • @kfftfuftur
      @kfftfuftur Pƙed 6 lety

      Actually it is low level stuff he is doing.

  • @benjaminbrady2385
    @benjaminbrady2385 Pƙed 6 lety +8

    I just want you to know that when I saw this I actually jumped with joy. The content you make has such a powerful positive effect on a lot of people and, at least for me, motivates. So thank you

  • @arisweedler4703
    @arisweedler4703 Pƙed 5 lety +1

    I've been watching all of these today, and HOLY moly this is fun and exciting! You take all the in-the-weeds stuff and call it out for being frustrating and tough, which is really validating. A lot of these tests just take confidence and willingness to potentially waste time - or as I feel after watching this, learn stuff but make less progress than I hoped.
    Thank you, big thank you :))))))))))) I love it

  • @Simon8162
    @Simon8162 Pƙed 6 lety +236

    TIL your can reload modules in python

    • @apenasmeucanal5984
      @apenasmeucanal5984 Pƙed 6 lety +14

      Simon816 in python 3 the “reload” function has been moved to “importlib” tho

    • @alexandrerozier1305
      @alexandrerozier1305 Pƙed 6 lety +2

      jeez that was a smart move right :)

    • @nonchip
      @nonchip Pƙed 4 lety

      had a similar experience with lua lately. turns out `require(name)` does its caching magic by just always returning `package.loaded[name] or some_complicated_load_logic(name)`. guess what happens if you `require("package").loaded[name]=nil`.
      can also be exploited in reverse: `require("package").loaded._some_dummy_global={}` makes every `require("_some_dummy_global")` (even though that module doesn't exist) in THE WHOLE VM (no matter the global environment being sandboxed, it living in another thread, etc) access the same table.

  • @himanshuagarwal3451
    @himanshuagarwal3451 Pƙed 5 lety +1

    You changed my perspective about programming and networking and made it so much fun .. Great work .. Keep it up ..

  • @nielsjonkman7196
    @nielsjonkman7196 Pƙed 6 lety +5

    Your voice is SO chilling omg. Awesome vid as always! ;)

  • @pete3897
    @pete3897 Pƙed 3 lety +1

    Over 2 years old and only 250 comments - I owe you a comment on this one then. Loving the playlist! Loving the content! Think of the effect you've had on so many people's education; you're more effective than many teachers and I think it's just your hobby?! :) Great work; be proud

  • @ulissemini5492
    @ulissemini5492 Pƙed 5 lety +3

    this, is, awesome! i never knew you could reload libraries mid python script and that totally blew my mind!

  • @wdai03
    @wdai03 Pƙed 6 lety

    Oh man the way you handled the parser with the reload and exception catcher is pretty smart. If it was me I'd probably just end restarting the whole thing a billion times and cursing

  • @jonasvanderschaaf
    @jonasvanderschaaf Pƙed 6 lety

    Finally I love this series. It is my favourite series!

  • @logix2435
    @logix2435 Pƙed 6 lety +1

    Nice! I love this series so much keep going!

  • @sanderninenine5333
    @sanderninenine5333 Pƙed 5 lety

    Thank you so much!! Please never stop youtube, i love you :D.

  • @icryo
    @icryo Pƙed 6 lety

    Excited for this one!! Thanks!!

  • @Fachher
    @Fachher Pƙed 6 lety

    Nice video. Well done. Keep on. I think the data at the end show us the result of the soccer match tomorrow (GER - SWE).

  • @TheMtenn100
    @TheMtenn100 Pƙed 6 lety +1

    You are a monster. I love your videos, please keep on doing, you're amazing at this

  • @jacobledbetter8243
    @jacobledbetter8243 Pƙed 5 lety +1

    This helped me fix an issue where I was doing Thread.run() instead of Thread.start() thanks for fixing a totally unrelated issue.

  • @NeoCortex3
    @NeoCortex3 Pƙed 6 lety

    Boy I just love the Pwn Adventure 3 videos

  • @johndelta4319
    @johndelta4319 Pƙed 5 lety +5

    I worked along with this and made a script a lot like this(Python3), this works for A LOT of games. Thank you sir i can't thank you enough!

    • @nifengjujuzhang8429
      @nifengjujuzhang8429 Pƙed 3 lety

      Do you know how to connect the client to the proxy for other online games? I tried to edit the host file to map proxy IP to game's host name, but it doesn't work :/

    • @mopozow6624
      @mopozow6624 Pƙed rokem

      @@nifengjujuzhang8429 Did you found a solution?

  • @Railrat420
    @Railrat420 Pƙed 2 lety

    Best series on CZcams right here no doubt about it

  • @hblaub
    @hblaub Pƙed 6 lety +1

    Nice introduction to proxies and to Python ! You are great

    • @ScottJFox
      @ScottJFox Pƙed 6 lety

      Hopefully he learns Python 3 though. :D

  • @muhammetaliarturk7107
    @muhammetaliarturk7107 Pƙed 6 lety

    such an amazing work man thanks , keep your works up :) đŸ€™

  • @chidaruma_
    @chidaruma_ Pƙed 6 lety

    Dude this is amazing! Great videos!

  • @ASCENDANTGAMERSAGE
    @ASCENDANTGAMERSAGE Pƙed 6 lety +92

    DUUUUDE THAT CLIFFHANGER
    I WANT THNEXT EPISODE NOOOOOW
    but I understand these take alot of hard work to make, keep it up, you're doing great. Don't rush anything :)
    PS you deserve more views

    • @triularity
      @triularity Pƙed 5 lety +1

      Makes me think of that one episode of Star Trek: TNG with "kiddie Picard"..
      czcams.com/video/L7ergVR6sb4/video.html

    • @milahu
      @milahu Pƙed 5 měsĂ­ci

      cliffhanger? 11:37 shows the player's X Y Z positions sent to the server. see also 12:04

  • @luax0
    @luax0 Pƙed 6 lety

    Thanks you for all of your videos !!!

  • @Fabian-_-
    @Fabian-_- Pƙed 6 lety +7

    Wow, wirklich die beste Serie auf CZcams! Mach weiter so! Finde es auch sehr gut erklĂ€rt fĂŒr Leute die sich nicht so mit den sonst so krassen Dingen auf deinem Kanal auskennen ^^ und ich konnte n paar Sachen fĂŒr Python an sich lernen :D 👍

    • @ScottJFox
      @ScottJFox Pƙed 6 lety

      Ich stimme dir zu, ich bin gespannt auf mehr!
      (Ich bin ein AnfÀnger auf Deutsch, Entschuldigung.)

    • @Fabian-_-
      @Fabian-_- Pƙed 6 lety

      Scott passt schon :D wenn ich dir helfen darf: "AnfÀnger in Deutsch" ;)

    • @ScottJFox
      @ScottJFox Pƙed 6 lety

      Vielen Dank!! Ich schÀtze es! Es ist einfacher zu lesen als zu schreiben.

  • @helgesverre
    @helgesverre Pƙed 6 lety

    Great content, learning lots here :D keep it up

  • @270jonp
    @270jonp Pƙed 6 lety

    Seriously a awesome adventure

  • @slagunes4705
    @slagunes4705 Pƙed 6 lety

    So creative, keep it up dude!

  • @A___Way
    @A___Way Pƙed 6 lety

    Great info, keep up the excellent work

  • @mierdamegusta
    @mierdamegusta Pƙed 6 lety +11

    This is the kind of "Let's plays" I want (:

  • @Justin-oo3bh
    @Justin-oo3bh Pƙed 6 lety

    Ok so I never knew about the reload method and wow is that going to be VERY useful in the future

  • @mywave82
    @mywave82 Pƙed 5 lety +2

    TCP socket is not packet-based, but stream. Assuming that each read operation will always hit the internal protocol packet boundaries will sometimes fail. IP stacks in all end-points can in there buffering split and join up data as they see fit

  • @patrick1020000
    @patrick1020000 Pƙed 6 lety +4

    awesome use of reload

  • @lentsukimori8288
    @lentsukimori8288 Pƙed 6 lety

    Loved it!!

  • @InjectionSec
    @InjectionSec Pƙed 6 lety

    I recently wrote an elevator attack simulator for university research that emulated sockets in python using pipes and we performed MitM attacks in a similar way (just locally instead of over the network). I WISH I HAD KNOWN ABOUT THE ABILITY TO RELOAD!!!! Every time we wanted make changes to our parser we had to kill it all and start over, so stupid!
    It’s always the little things *facepalm*. This series is awesome keep it up!

    • @rickiwinner
      @rickiwinner Pƙed 6 lety +1

      I bet you will never forget that xD

  • @futhorck771
    @futhorck771 Pƙed 4 lety

    liveoverflow is like "I'm not an expert but.." then proceeds to do the thing amazingly well

  • @spicybaguette7706
    @spicybaguette7706 Pƙed 4 lety

    One interesting idea is to issue commands to the network proxy via chat. You can even use a custom ASCII control character like ESC and invoke the commands from code you have overwritten with LD_PRELOAD! (Maybe custom keybindings or something)

  • @j3ker491
    @j3ker491 Pƙed 6 lety

    Your Channel is so great ! ^^

  • @legendkerl1650
    @legendkerl1650 Pƙed 6 lety +6

    What?! I've reached the end of the playlist? It's 3:00 AM and I want moar of this :D
    Love your series and how you explain everything!

    • @nifengjujuzhang8429
      @nifengjujuzhang8429 Pƙed 3 lety

      Do you know how to connect the client to the proxy for other online games? I tried to edit the host file to map proxy IP to game's host name, but it doesn't work :/

  • @maxistarling
    @maxistarling Pƙed 6 lety

    WoW, you amazed me.

  • @thiagosoares6362
    @thiagosoares6362 Pƙed 4 lety

    This video deserves millions of like

  • @hoxorious
    @hoxorious Pƙed 6 lety

    a wonderful video again

  • @elertan
    @elertan Pƙed 6 lety

    You could also place socket hooks in the game itself, instead of creating a proxy. You should look into hooking the send and recv functions.

  • @sSoKoSs
    @sSoKoSs Pƙed 6 lety +2

    GODLIKE!

  • @Andy-lf4di
    @Andy-lf4di Pƙed 6 lety +3

    Protip: Set self.daemon = True in the threads. No need to kill the script then.
    Cleanup may be skipped for the threads on exit as they are just killed if the script receives a SIGINT, but that's also the case when you just kill the script and still good enough for a hacky proxy.

  • @RuslanKoptiev
    @RuslanKoptiev Pƙed 6 lety

    Wow! I never know that it's possible to reload modules during runtime in python. Cool!

  • @medjassertoubib4467
    @medjassertoubib4467 Pƙed 6 lety

    well done . ther i only respect i have throw you . i wish you all the best :)

  • @wtfman468
    @wtfman468 Pƙed 2 lety +1

    Fr easy to understand tutorial

  • @haydene3802
    @haydene3802 Pƙed 2 lety +1

    Question. Around 11 minutes the python script was being modified while also being ran. Is this possible or was it just video editing?
    I tried with my own python packet sniffer script and it just continues to run. Tried googling around as well.
    Been going through your past videos as I learn more and gain confidence, thank you for making them

  • @TheJJ100100
    @TheJJ100100 Pƙed 6 lety

    Nice!

  • @BrandNewByxor
    @BrandNewByxor Pƙed 6 lety

    I've written a shitload of python over the last couple of years, but I haven't seen anything as cool as the `reload` function in months. Mind blown.

  • @GamePlayByFaks
    @GamePlayByFaks Pƙed 6 lety +1

    At the end gives possibility to manipulate position also gives pointers to write advanced hacking trainers or etc... so can go wild with that.

  • @MrDavidCrane
    @MrDavidCrane Pƙed 6 lety +5

    hex-encoded floating point triples for location data

  • @Adolf1Extra
    @Adolf1Extra Pƙed 6 lety

    I know I'm late, but you might want to take a look at tera-proxy, it's related to this.

  • @frognik79
    @frognik79 Pƙed 6 lety +1

    Very rare that a game doesn't use encrypted packets but a good start.

  • @DreamBlackHD
    @DreamBlackHD Pƙed 4 lety +1

    while i try to start the file, with the ip and port, i receive this error: socket.error: [Errno 10013] An attempt was made to access a socket in a way forbidden by its access permissions.
    using python 2.7

  • @metaorior
    @metaorior Pƙed 6 lety

    Thank you sir

  • @Gem-gi7km
    @Gem-gi7km Pƙed 3 lety

    What would need to be change to develop a UDP proxy? (ex. change socket type, ...etc.)

  • @tobe2105
    @tobe2105 Pƙed 6 lety

    I'd gone for a simpler approach, hooking the functions the game uses to send and receive data. A proxy, however, is a fairly more universal approach. Not to mention it works just well since the packets aren't encrypted.

  • @NavanBethrax
    @NavanBethrax Pƙed 6 lety

    Gonna try to implement a generic game-proxy in vb.net. If i know the encryption method would it be possible to decrypt and encrypt the data on the fly or would it be a problem performance wise (packet loss or something) ?
    And nice video mate i always wanted to do something like this but i didn't came up with a concept.

  • @yattsu8660
    @yattsu8660 Pƙed 5 lety

    this is so useful. i do have a problem, i'm getting an error because the port that the game client sends requests from is already in use. the "socket.SOL_SOCKET, socket.SO_REUSEADDR, 1" option did nothing unfortunately. how can i get over this?

  • @Pumpekk
    @Pumpekk Pƙed 5 lety

    Hey, great stuff. Quick question: what would you do if you couldn't use hosts file? How can you translate destination IP address so it could go to your proxy (on Windows)?

    • @buraktarm1463
      @buraktarm1463 Pƙed 5 lety

      You have to hook the connect function from windows socket dll in the game then change ip to your proxy. You can use detours or easyhook.

  • @philippep4036
    @philippep4036 Pƙed 5 lety

    wait , i don't understand , proxy might be impossbiel with the ash code that the server had??
    so why u can use those datas?

  • @NoNameBAM
    @NoNameBAM Pƙed 6 lety +5

    4:59 you can hear a quiet Discord notification sound ;)

    • @foor
      @foor Pƙed 4 lety

      wow

  • @prakashyadav008
    @prakashyadav008 Pƙed 6 lety +2

    can u mention any good resources for learning disassembly using gdb ?
    I hav started my information security career and wanna study malware analysis .So it starts with reverse engineering.

    • @LiveOverflow
      @LiveOverflow  Pƙed 6 lety +2

      Just learning by doing and google the instructions you don’t understand etc. keep an eye out for repeating patterns in the assembly code.

  • @__mk_km__
    @__mk_km__ Pƙed 6 lety +1

    I started with proxy, turns out I should've gone to messing with binaries. Mine one is running on node.js, because for some reason JavaScript is the language that is easiest for me

  • @spazman6117
    @spazman6117 Pƙed 4 lety

    Where are you getting the IP from that you put into your HOST file and the master.pwn3 part from???? And how are you opening python to look like that? The latest python when I open it, only shows me a command window?????

  • @palmenros
    @palmenros Pƙed 6 lety +4

    In the Proxy class, run function, why is everything inside a While True loop? Wouldn't that mean that it would create new game2proxy and Proxy2Server every iteration?
    Thanks

    • @LiveOverflow
      @LiveOverflow  Pƙed 6 lety +6

      The one call is waiting until a client connects. And only then the loop continues and creates a new object to wait for the next player.

    • @palmenros
      @palmenros Pƙed 6 lety +2

      Thanks! I completely forgot about multiple players...

    • @EvilSapphireR
      @EvilSapphireR Pƙed 6 lety

      LiveOverflow I'm sorry, but what do you mean by "the one call"?

  • @mohammedabdo.m576
    @mohammedabdo.m576 Pƙed 6 lety

    great I'll make one

  • @jordantrogdon7547
    @jordantrogdon7547 Pƙed 3 lety +2

    I need help somebody i followed tutorial and everytime i open my python script in terminal it just says setting up proxy and never actually shows packets please help

  • @Rednesswahn
    @Rednesswahn Pƙed 6 lety

    The next video is already the 10th in this series! Time flies!

  • @batlin
    @batlin Pƙed 6 lety

    How did you create your animated diagrams? I'm using Impress with SVG animation export now but would be keen to hear about nicer methods.

    • @LiveOverflow
      @LiveOverflow  Pƙed 6 lety +1

      Photoshop and Premiere. But I’m not that happy with the process

  • @user-rw4qr8uv1f
    @user-rw4qr8uv1f Pƙed 3 lety

    how do you get what ports are uses for client/server? Cant find that video

  • @omarbgm5898
    @omarbgm5898 Pƙed 4 lety

    well im still confused about the 3002 to 3006 ports for example my game here when i get to log in there is a label says its a 5555 port and when i use wireshark there is no port other than 5555 so im confused over what should i do about this can anyone help ?

  • @RAGHAVENDRASINGH17
    @RAGHAVENDRASINGH17 Pƙed 6 lety

    Nice

  • @R13TechNewbie
    @R13TechNewbie Pƙed 6 lety

    We should make this video be a trending video on youtube 😾

  • @gw2exploits83
    @gw2exploits83 Pƙed 6 lety

    Can you make a guide specifically on making Python proxy servers?

  • @smilecat2841
    @smilecat2841 Pƙed 6 lety

    can you do that to other online games? like a legends of league, fornite, dota 2

  • @BlackDawn
    @BlackDawn Pƙed 5 lety

    Can your proxy code be used to forward and intercept udp packets as well?

    • @jeyfus
      @jeyfus Pƙed 3 lety

      You would need to change SOCK_STREAM to SOCK_DGRAM for each socket declaration

  • @lucasnany397
    @lucasnany397 Pƙed 6 lety

    I'm trying to make a proxy server but with an online server. But I can't find a fff way to redirect outgoing traffic to localhost! Hosts don't help.

  • @crispy_rw
    @crispy_rw Pƙed 3 lety +1

    What is the reason he only receives 4096 bytes from the Game Server??

  • @agustinscazziotta8930
    @agustinscazziotta8930 Pƙed 4 lety +3

    In this video you can develop a proxy as the game server is accessed via DNS name (game.pwn3): what you can do if the game server is accessed using IP addresses?

  • @packiathaik2532
    @packiathaik2532 Pƙed 4 lety

    Hi I'm not experience with python 2 can you say what super(Proxy2Server,self).__init__() means?

  • @WeDifferent
    @WeDifferent Pƙed 6 lety

    Next level shitđŸ˜±đŸ˜„âœŒ

  • @xfadedxshadow
    @xfadedxshadow Pƙed 3 lety

    Im confused your pointing the same address to 2 different things in the host file??

  • @portswigger1038
    @portswigger1038 Pƙed 2 lety

    hello, how can we add client's server ip address to Proxy2Server automatically.

  • @zafercagatayumut916
    @zafercagatayumut916 Pƙed rokem

    I get socket.error: [Errno 10013] An attempt was made to access a socket in a way forbidden by its access permissions error

  • @L0j1k
    @L0j1k Pƙed 5 lety +1

    Cheeses. I just finished watching this after the previous 8 in a row, and I have to tell you... I am starting to feel like someone watching a baseball game, and it's the fourth inning and people are starting to notice that the pitcher only thrown strikes and not a single player from the opposing team has gotten on base the whole game.

  • @allokrvlastnamesareoverrat4914

    Why is there a while true in Proxy .run ?

  • @nenojay6832
    @nenojay6832 Pƙed 5 lety

    one thing I don't understand is, why do you have both the g2p and p2s inside the run method inside a while loop? why do we need the while loop?

    • @LiveOverflow
      @LiveOverflow  Pƙed 5 lety

      Because we have to receive packets from the game, g2p. And then directly forward them to the player p2s.

    • @nenojay6832
      @nenojay6832 Pƙed 5 lety

      @@LiveOverflow I tried to make a little example of the sockets and to my surprise it worked without the whole loop inside the Proxy class

  • @D3adStyle
    @D3adStyle Pƙed 4 lety

    Why are you using the buffer size of 4096 for receiving files? How did you figure out that you need that value? Or was it just the thought "to have the buffer big enough"?

    • @LiveOverflow
      @LiveOverflow  Pƙed 4 lety +1

      Big enough

    • @tulparid
      @tulparid Pƙed 3 lety

      Because the data was probably too big to receive

  • @Im_Ninooo
    @Im_Ninooo Pƙed 3 lety

    this would be soooooo easy and efficient to implement in Golang

  • @ArturKorobeynyk
    @ArturKorobeynyk Pƙed 5 lety

    Watched video, got and idea on how to improve this script... and then found a bug in our production code while testing my idea. That is a like

    • @LiveOverflow
      @LiveOverflow  Pƙed 5 lety

      Tell me more :P

    • @ArturKorobeynyk
      @ArturKorobeynyk Pƙed 5 lety

      Well, first of all I thought that Ctrl+C in your case does not work because you wrapped the whole logic in try catch Exception. And KeyboardInterrupt (Ctrl+C) is subclass of Exception. I was about to comment but I wanted to double check first. I did not want to setup the game so I was testing on one service. And I realized that my client actually changes its server once every 3-4 minutes and the range of IPs is unknown to me and cannot be predicted. And this logic is normal nowadays as most MMOs either use several servers to balance server load. That is when I found out that Wireshark is not able to track traffic per application (at least out of the box, of course custom modules can be written). So I started to make my own script using psutil.net_connections() and filtering results for needed pid then intercepting packets for all those connections. And that is where I saw TCP handshake: SYN -> SYN-ACK -> ACK was broken.

  • @ecdarreola
    @ecdarreola Pƙed 5 lety

    Can you by chance create a proxy for ragnarok online?

  • @pcccmn
    @pcccmn Pƙed rokem

    I don't understand why implementation on master server is necessary. Can't we just implement the proxy connecting to the game server? Meaning the user manually logs in, then runs the tcp proxy.

  • @thiagosoares6362
    @thiagosoares6362 Pƙed 3 lety

    I'm trying to do the same with an android game, I'm using CCProxy to receive the package and WPE PRO for analysis. But I only have the ip in numbers (without DNS), the host file does not accept only numbers, do you have any suggestions as I could do?

    • @ff6106
      @ff6106 Pƙed 2 lety

      @@BluBOo_ found a solution?

    • @ff6106
      @ff6106 Pƙed 2 lety

      @@BluBOo_ some programes that proxy server in the adroid games called hex bot 7

  • @o.l._l.o.000
    @o.l._l.o.000 Pƙed 6 lety +2

    How can you dislike this video? :O

  • @ryukshinigami4953
    @ryukshinigami4953 Pƙed 3 lety

    What if the port is static?

  • @Anonymouspock
    @Anonymouspock Pƙed 6 lety

    Are you participating in the Google CTF this weekend?

  • @0xp1nk66
    @0xp1nk66 Pƙed 6 lety

    Hi, wie heißt der Texteditor den du benutz?

    • @AmanGarg95
      @AmanGarg95 Pƙed 5 lety

      Das ist Sublime Text www.sublimetext.com/