<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Loki's Lab]]></title><description><![CDATA[Prashik Jadhav (CodedLoki) | Full-stack Developer & Cybersecurity Enthusiast. Exploring Next.js, Rust, and Linux internals. Documentation of projects, CTF writeups, and minimalist system ricing]]></description><link>https://blog.codedloki.is-a.dev</link><image><url>https://cdn.hashnode.com/uploads/logos/69d15c486792e486f6b79afb/0cab221d-fe75-4294-a283-041a245e3df1.png</url><title>Loki&apos;s Lab</title><link>https://blog.codedloki.is-a.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Thu, 04 Jun 2026 01:06:45 GMT</lastBuildDate><atom:link href="https://blog.codedloki.is-a.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[NexusProbe v0.2.0: Weaponizing Python with Multithreading & CLI Arguments]]></title><description><![CDATA[INTRODUCTION
The v0.1.0 we created in last post worked but its too slow to be used in real world scanning . Scanning a port range was like waiting for a government website to load .
Also in previous v]]></description><link>https://blog.codedloki.is-a.dev/nexusprobe-v0-2-0-weaponizing-python-with-multithreading-cli-arguments</link><guid isPermaLink="true">https://blog.codedloki.is-a.dev/nexusprobe-v0-2-0-weaponizing-python-with-multithreading-cli-arguments</guid><category><![CDATA[Python]]></category><category><![CDATA[cybersecurity]]></category><category><![CDATA[networking]]></category><category><![CDATA[buildinpublic]]></category><category><![CDATA[ethicalhacking]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[Programming Blogs]]></category><category><![CDATA[Programming Tips]]></category><category><![CDATA[#cybersecurity]]></category><category><![CDATA[CybersecurityTools]]></category><category><![CDATA[reconnaissance ]]></category><category><![CDATA[portscanner]]></category><category><![CDATA[NexusProbepy]]></category><category><![CDATA[beginnersguide]]></category><dc:creator><![CDATA[Prashik Jadhav]]></dc:creator><pubDate>Thu, 16 Apr 2026 12:44:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69d15c486792e486f6b79afb/2aaa7f38-eec9-42a3-8ca1-71677af8e8df.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h3>INTRODUCTION</h3>
<p>The v0.1.0 we created in last post worked but its too slow to be used in real world scanning . Scanning a port range was like waiting for a government website to load .</p>
<p>Also in previous version we passed the target value in static code . So if we wanted to change a target we would need to edit the target in code and then run the program .</p>
<h3>ARCHITECTURE</h3>
<p>As we move forward with adding features to the scanner and fixing different issues the size of code goes on increasing . If this code is not managed properly can cause mess at time of debugging and adding updates to the code. So we will divide the code into modules so if any error occurs we can easily detect which code exactly is causing the error</p>
<p>To modularize the code I will be following folder structure</p>
<pre><code class="language-text">├── main.py                        #entrypoint
├── nexusprobe                     # main package 
│   ├── cli.py                     # CLI Argument parser
│   ├── engine.py                  # Threadpoool logic          
│   ├── __init__.py                # Metadata &amp; exports
│   └── scanner.py                 #Scanner logic
└── README.md
</code></pre>
<p>cli.py : This file will contain code that will allow us to to parse command line argument while running the code for eg ip address, port , port range , etc</p>
<p>engine.py : This file will contain code to run ur scanner concurrently making the scanning of large amount of ports faster</p>
<p>scanner.py : This is main part of ur code which we implemented previously for scanning for ports but with threading</p>
<h3>ENGINE</h3>
<p>The engine is the brain of our scanner which will make our program multi threaded so the ports are scanned faster . In this engine we will be implementing Threadpool for carrying out threading in port scanner</p>
<h5>What 's Threadpool ?</h5>
<img src="https://www.xanthium.in/sites/default/files/inline-images/python-thread-model.jpg" alt="Alt threading" style="display:block;margin:0 auto" />

<p>In <strong>Multi threading</strong> when a task is created a new thread is created for that task and when task assigned is completed the thread is removed or deleted .The process of creating new threads costs time and cpu resources . Making it more time consuming .</p>
<p>Learning from a real life example</p>
<p>Consider Situation you want to distribute Party invitation cards to 10 different people u will ask help from 10 friends (10 threads) to each visit 1 person give the card and return to their home (thread destroyed ) . This way you will need to everytime find a friend explain him the task and route and then he performs it and returns to his home . For 100 people we will require to ask help from 10 friends .This is total wastage of time and resources</p>
<img src="https://media.geeksforgeeks.org/wp-content/uploads/20250901124611569759/Thread-Pool-1.webp" alt="Alt text" style="display:block;margin:0 auto" />

<p>Where as in <strong>Threadpool</strong> a given group of threads (Pool) are created beforehand and when a task enters the system a thread is assigned to task and when its execution is completed the thread returns back to pool instead of getting destroyed . This saves the time of again and again creating new threads saving time and cpu resources</p>
<p>Solving above example with threadpool</p>
<p>In a threadpool , instead of asking help from 10 friend for distributing cards to 10 people we will ask help from 2 friends (2 threads) only and each of them take 1 card visit the person give the card and instead of returning home come back and check for more cards to be delivered (tasks to be implemented) and deliver then and when all cards are distributed then the friends return to their home (threads destroyed) . This saves time required for creating new threads</p>
<h3>CLI WEAPONIZATION</h3>
<p>In this version we are updating the method of accepting input from user. Instead hardcoding target ip to the source code we are allowing user to pass the input from command line with help of flags like we see in other terminal based programs like</p>
<pre><code class="language-bash">python3 main.py  --help
python3 main.py -t 192.168.1.1
</code></pre>
<h3>DIVING TO CODE</h3>
<p>As we have modulated our code into multiples modules making our code clean</p>
<h4><code>nexusprobe/cli.py</code> :</h4>
<pre><code class="language-python">import argparse

from . import __version__


def receive_args():
    parser = argparse.ArgumentParser(
        prog="nexusprobepy", description="Nexus ProbePy CLI", epilog="nexusporbepy"
    )
    parser.add_argument("-t", "--target", help="Target IP address or hostname")
    parser.add_argument("-p", "--port", help="Target port number")
    parser.add_argument("-a", "--all", action="store_true", help="Scan all ports")
    parser.add_argument("-r", "--range", help="Port range to scan")
    parser.add_argument(
        "-v", "--version", action="version", version=f"%(prog)s {__version__}"
    )
    args = parser.parse_args()

    if not args.target:
        parser.error("Target is required")
    return args


if __name__ == "__main__":
    args = receive_args()
</code></pre>
<p>This code allows to accept cli args from user</p>
<ol>
<li><p><code>--target</code> : This argument is used to pass target ip to the program for scanning</p>
</li>
<li><p><code>--port</code> : To carry out single port scan on specified ip</p>
</li>
<li><p><code>--range</code>: To carry port scan on specified range</p>
</li>
<li><p><code>--all</code>: The action property <strong>store_value</strong> value is used to specify that if -a flag specified that means the flag is true and no external value for -a flag need to be passed by user . We are using this in condition wants to scan all 65536 ports</p>
</li>
</ol>
<blockquote>
<p><strong>Note</strong> : There are total 65536 ports in every system which can be used by applications to carry out their network communication .</p>
</blockquote>
<ol>
<li><code>--version</code> : This is to allow user to check current version of scanner . The <code>%</code> sign in f string of version property is the placeholder for the program name only in argparse context , <code>{prog}</code> is the program name we are assigning to prog when creating parser for cli argument in same file in below line</li>
</ol>
<pre><code class="language-python">parser = argparse.ArgumentParser(
       prog="nexusprobepy", description="Nexus ProbePy CLI", epilog="nexusporbepy"
</code></pre>
<p><code>__version__</code> contains version number of scanning which we will assign in <code>__init__.py</code></p>
<blockquote>
<p>Here the <code>--target</code> argument value is compulsory required even when -a value used</p>
</blockquote>
<p>For cli arguments we are using <code>argparse</code> a built in library in python for accept inputs as flags from command line</p>
<p>a parser is created using the <code>argparse.ArgumentParser()</code> to define the argument flags</p>
<h4><code>nexusprobe/scanner.py</code></h4>
<pre><code class="language-python">import errno
import socket
import subprocess


def is_online(host):
    """
    Check if the host is online by pinging it once.
    """
    response = subprocess.run(["ping", "-c", "1", host], capture_output=True, text=True)
    return response.returncode == 0


def scan_port(task):
    host, port = task

    try:
        # print(f"Scanning {host}:{port}")
        # print(f"[ + ] Scanning {host}")
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

        sock.settimeout(1.5)

        result = sock.connect_ex((host, int(port)))

        if result == 0:
            data = sock.recv(1024)
            print("|           |              |")
            print(f"| {port}        |       Open   |")
            print("|___________|______________|")
            if not data:
                sock.close()
            sock.close()

        elif result in (errno.EAGAIN, errno.EALREADY, 115):
            print(f" {port}         |  Filtered")
            sock.close()

        elif result == errno.ECONNREFUSED:
            # print(f" {port}          |  Closed")
            sock.close()
    except KeyboardInterrupt as e:
        print("KeyboardInterrupt from user")
        print("Exiting...")
        exit(1)

    except socket.gaierror as e:
        print(f"Error: {e}")
        exit(1)

    except socket.timeout as e:
        print(f"Error:{port} {e}")
        exit(1)
</code></pre>
<p>This our scanner code with some extra exception handling. Instead of code based hamdling we are preferring accepting error based exception handling for proper detection like if the port is filtered or closed</p>
<p>with exception handlers like <code>errno.EAGAIN, errno.EALREADY</code> ,<code>ECONNREFUSED</code></p>
<p><code>ECONNREFUSED</code> : This clearly defines that the target system port refused for connection</p>
<p><code>errno.EAGAIN</code> : This error is received from non blocking sockets .so if there is more time required two get response data from target system which we requested with use of <code>data.recv(1024)</code></p>
<p><code>errno.EALREADY</code> : This exception tells that previous request to the target is currently in process and hence u should wait to make request to same port</p>
<h4><code>nexusprobe/engine.py</code></h4>
<pre><code class="language-python">
import concurrent.futures
import time


from .cli import receive_args
from .scanner import is_online, scan_port

# -p  single port
# -r range of user defined ports



def run_engine():
    args = receive_args()
    # print(f"Scanning {args}")
    if not is_online(args.target):
        print(f"[ - ] Host {args.target} is not online")
        exit(0)

    # if not args.port and not args.range:

    if args.port:
        portargs = args.port.split(",")

        print(f"\n [ + ] Scanning {args.target} \n")
        tasks = [(args.target, port) for port in portargs]

        #        print(f"Port       |       status ")
        print(f"| Port      |       status |")
        print("|___________|______________|")

        with concurrent.futures.ThreadPoolExecutor() as executor:
            executor.map(scan_port, tasks)
    elif args.range:
        print(f"\n [ + ] Scanning {args.target} \n")
        start_port = int(args.range.split("-")[0])
        end_port = int(args.range.split("-")[1])
        if start_port &gt; end_port:
            print(f"[ - ] Invalid range: {args.range}")
            return
        ports_range = range(start_port, end_port + 1)
        # print(ports_range)
        tasks = [(args.target, int(p)) for p in ports_range]

        #        print(f"Port       |       status ")
        print(f"| Port      |       status |")
        print("|___________|______________|")

        with concurrent.futures.ThreadPoolExecutor() as executor:
            executor.map(scan_port, tasks)
    elif args.all:
        print(f"\n [ + ] Scanning {args.target} \n")
        ports_range = range(1, 65536)
        tasks = [(args.target, p) for p in ports_range]
        print(f"|Port       |       status |")
        print("|___________|______________|")
        with concurrent.futures.ThreadPoolExecutor() as executor:
            # print(f"Scanning {args} : {tasks}")
            executor.map(scan_port, tasks)

    else:
        print(f"\n [ + ] Scanning {args.target} \n")
        ports_range = [
            21,
            22,
            23,
            25,
            53,
            80,
            110,
            139,
            143,
            443,
            445,
            465,
            587,
            993,
            995,
            1433,
            3306,
            3389,
            5432,
            6379,
            8080,
            8443,
            5000,
            5001,
            8088,
            17000,
            17001,
            25565,
            27015,
        ]
        tasks = [(args.target, p) for p in ports_range]

        #        print(f"Port       |       status ")
        print(f"| Port      |       status |")
        print("|___________|______________|")

        with concurrent.futures.ThreadPoolExecutor() as executor:
            executor.map(scan_port, tasks)


if __name__ == "__main__":
    run_engine()

</code></pre>
<p>This file carries code for executing our scanner using threadpool to make it faster scan</p>
<p>We are implementing four conditions:</p>
<ol>
<li><p><code>if not is_online</code> :</p>
<p>This condtion checks output of <code>is_online</code> function to confirm if specified ip is online in network and prevent scanning for ports of offline device</p>
</li>
<li><p><code>if args.port</code> :</p>
<p>This condition is used when user wants to scan a single piort open or closed. or user can pass multiple ports seperted by comma <code>,</code> eg :</p>
<pre><code class="language-bash">#SINGLE PORT
python3 main -t 192.168.1.10 -p 22
#MULTIPLE PORTS
python3 main.py -t 192.168.1.10 -p 22,23
</code></pre>
</li>
<li><p><code>if args.range</code> :</p>
</li>
</ol>
<p>This condition can be used when user wants to scan a range of ports where two ports one starting port and second end port is passed by the user</p>
<p>eg:</p>
<pre><code class="language-bash">#this scan port from 10-30
python3 main.py -r 10-30
</code></pre>
<ol>
<li><p><code>elif args.all</code> :</p>
<p>In this condition we perform scan on complete 65536 ports of a system . eg :</p>
<pre><code class="language-bash">python3 main.py -a
</code></pre>
</li>
</ol>
<h4><code>nexusprobe/__init__.py</code></h4>
<pre><code class="language-python">__version__ = "0.2.0"
__author__ = "codedloki"


from .cli import receive_args
from .engine import run_engine
from .scanner import scan_port
</code></pre>
<p>This code is to transform your code folder into a python package . By using this you can keep ur code clean by tranforming ur imports from</p>
<pre><code class="language-python">from nexusprobe.engine import run_engine
from nexusprobe.cli import receive_args
</code></pre>
<p>to</p>
<pre><code class="language-python">from nexusprobe import run_engine,receive_args
</code></pre>
<p>The <code>__version__</code> and <code>__author__</code> are like properties to our scanner so after we create executable for our scanner the user can simply run command <code>nexusprobepy.__version__</code> to get current version to check if they are using updated scanner</p>
<h4><code>main.py</code></h4>
<pre><code class="language-python">from nexusprobe import run_engine


def main():
    run_engine()


if __name__ == "__main__":
    main()
</code></pre>
<p>The main.py file imports and calls the run_engine function we have created in <code>nexusprobe/engine.py</code> file</p>
<h3>CONCLUSION</h3>
<p>Its time to wrap up v0.2.0 with solving the speed problem of code with Threadpool and modularizing code into seperated modules so its easier for us to make updates to the code in future</p>
<p>We are not gonna stop here . Ofcourse this version is blazing fast but yet it just tells if the port is open or closed . And as developer or a cybersecurity enthusiasist its very little info</p>
<p>in next version we will be implementing service detection , Saving the output and showing progress of scan live</p>
<p>Source Code : <a href="https://github.com/codedloki/nexusprobepy/releases/tag/v0.2.0">v0.2.0</a></p>
]]></content:encoded></item><item><title><![CDATA[NexusProbepy  v0.1.0  Building PortScanner from Scratch]]></title><description><![CDATA[Why Python for Reconnaissance?
I am starting a series to build security tools from scratch . Here is the First up : Nexus Probe
Python is the swiss army knife for security experts and hackers lightwei]]></description><link>https://blog.codedloki.is-a.dev/nexusprobpy-part1</link><guid isPermaLink="true">https://blog.codedloki.is-a.dev/nexusprobpy-part1</guid><category><![CDATA[Python]]></category><category><![CDATA[Security]]></category><category><![CDATA[Cyber Security Tools]]></category><category><![CDATA[reconnaisance]]></category><category><![CDATA[portscanner]]></category><category><![CDATA[NexusProbepy]]></category><category><![CDATA[NexusProbepyser]]></category><category><![CDATA[beginnersguide]]></category><category><![CDATA[PythonForHackers]]></category><category><![CDATA[codingsecuri]]></category><dc:creator><![CDATA[Prashik Jadhav]]></dc:creator><pubDate>Wed, 08 Apr 2026 13:17:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69d15c486792e486f6b79afb/17da29da-f678-47bf-9689-7ca6a391d9e6.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h2>Why Python for Reconnaissance?</h2>
<p>I am starting a series to build security tools from scratch . Here is the First up : Nexus Probe</p>
<p>Python is the swiss army knife for security experts and hackers lightweight , fast to write and has socket library which allow us to talk to each port</p>
<h3>Working of the scanner</h3>
<p>For developing the portscanner we will be using the TCP three way handshake . Its a very important step in connection setup in TCP Protocol between two systems .</p>
<img src="https://static.afteracademy.com/images/what-is-a-tcp-3-way-handshake-process-three-way-handshaking-establishing-connection-6a724e77ba96e241.jpg" alt="Tcp Handshake" style="display:block;margin:0 auto" />

<p>SYN , ACK and RST are important flags in TCP connection setup</p>
<p>In TCP handshake the client sends and SYN (synchronization flag ) to server (Target). The SYN flag initiates the connection and synchronizes starting sequence numbers between two devices</p>
<p>In response to SYN flag the target server responds with SYN+ACK flag which contains the server response to client connection initialization. The server sets ACK flag to client sequence number + 1 signaling its ready for next part for next stream</p>
<p>When the client receives SYN+ACK flag from target server it responds with a ACK flag ( target sequence number + 1) signalling that the connection setup if successful</p>
<p>Now if the connection is successful the the server will send SYN+ACK flag this can be used to confirm if a specific port is open</p>
<p>On the contrary if the port is closed the target will respond with RST flag which means reset the connection</p>
<p>If the response contains none of them it means the port is filtered</p>
<h2>DIVING TO DEVELOP</h2>
<p>For developing the port scanner in python we will be using <code>socket</code> built in library which allows systems to communicate with each other .</p>
<p>This initial version will implement simple scanner which check if port is open closed or filtered.</p>
<pre><code class="language-python">import socket
import subprocess


def is_online(host):
    """
    Check if the host is online by pinging it once.
    """
    response = subprocess.run(["ping", "-c", "1", host], capture_output=True, text=True)
    return response.returncode == 0


def main():
    host = "192.168.1.2"
    port = 22
    
    
    if not is_online(host):
                print(f"Host {host} is not online")
                exit(1)

    try:
        for port in range(1, 50):
            sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

            sock.settimeout(1)


            result = sock.connect_ex((host, port))
            if result == 0:
                print(f"Port {port} is Open")
                sock.close()
                
            elif result == 111:
                print(f"Port {port} is Filtered")
                sock.close()

            else:
                print(f"Port {port} is Closed")
                sock.close()
    except KeyboardInterrupt as e:
        print("KeyboardInterrupt from user")
        print("Exiting...")
        exit(1)

    
    except socket.timeout as e:
        print(f"Error: {e}")
        exit(1)


if __name__ == "__main__":
    main()
</code></pre>
<p>These code has two functions currently</p>
<ul>
<li><p>is_online</p>
</li>
<li><p>main</p>
</li>
</ul>
<h4>Is_online</h4>
<p>The is_online function is executing the <code>ping</code> command to check if the host we are going to scan for open port is online so we dont waste time scanning ports for offline host</p>
<p>Here we make use of built in python library <code>subprocess</code> to run the os command ping and capture it output to a variable <code>response</code> and the <code>response.returncode</code> contains the exit code of command which tells if it was success or a failure</p>
<p>So in our case we compare the response.returncode with 0 so if the ping was success which means host is online and returncode will be 0 so comparing 0=0 will return <code>true</code> else if the return code is 1 it will return <code>false</code></p>
<p>This boolean value is returned value of the function</p>
<h3>main</h3>
<p>Here in main function we currently statically pass values <code>host</code> and <code>port</code> . Moving to socket programming this line is base of entire socket programming in python</p>
<pre><code class="language-python"> sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
</code></pre>
<p>the sock.socket function is used to create a socket object with variable name sock</p>
<p>Here are two important parament passed to the socket funcion :</p>
<ul>
<li><p><code>socket.AF_INET</code> : This specifies the Address family. The address family specifies type of address or Network Layer protocol we are going to use to establish connection between two systems . According to our current code we are using INET ( IPV4 address) for communication</p>
</li>
<li><p><code>socket.SOCK_STREAM</code> : This tell about the Transport layer protocols we will be using to send message to specific system for communication . The sock.SOCK_STREAM will use the TCP (Transmission control Protcol) for delivery of the packets</p>
</li>
</ul>
<p>The settimeout function of the sock object help us to set timeout for the response from the target server so if it take more that specified time to receive response from target server the that connection is aborted to increase speed of scanning ports</p>
<h4>connect () and connect_ex () mystery</h4>
<p>Now many of us at beginning that there are two function for connection in socket library so when is best time to use which</p>
<p>The connect function is simple when your are confident that connection will be establish and even if error occcurs its either connectionrefused errror or timeout error</p>
<p>The connect_ex function is the extended version of connect function .If there is any failure in execution it does direct stop the the execution instead it resturns u with a errror code</p>
<p>For example : if connection succcess the error code is zero else if connection fails the error code C error code is returned (eg : 111,10061)</p>
<p>This is best for portscanner project as it also can be used for banner grabbing which we will implement in future improvizations</p>
<p>For important programs like portscanner proper erro handling the following exception handlers we have here</p>
<ul>
<li><p>KeyboardInterrupt : So if user want to exit the program and tries to force escape it (For eg : CTRL + C )</p>
</li>
<li><p>socket.timeout : If response from server take more time than the timeout set before the error is occured</p>
</li>
</ul>
<p>The for loop implement to scan ports range . Current we are scanning first 50 ports .</p>
<h2>Conclusion</h2>
<p>Concluding initial work In next update we will implement command line argeument and Threads to receive input from arguement and run the program in multiple threads</p>
<p><strong>Source code :</strong> <a href="https://github.com/codedloki/nexusprobepy">GITHUB</a></p>
]]></content:encoded></item><item><title><![CDATA[root@codedloki:~$ ./start_journey.sh]]></title><description><![CDATA["In the silence of a TTY shell, I found the clarity that high-level abstractions often hide."

Welcome to Loki's Lab.
If you are here, you probably care about performance, privacy, and the raw power o]]></description><link>https://blog.codedloki.is-a.dev/manifesto</link><guid isPermaLink="true">https://blog.codedloki.is-a.dev/manifesto</guid><category><![CDATA[manifesto]]></category><category><![CDATA[introduction]]></category><category><![CDATA[Beginner Developers]]></category><category><![CDATA[Career]]></category><category><![CDATA[Linux]]></category><category><![CDATA[cybersecurity]]></category><category><![CDATA[Web3]]></category><category><![CDATA[Blockchain]]></category><category><![CDATA[Open Source]]></category><category><![CDATA[minimalism]]></category><category><![CDATA[rust lang]]></category><category><![CDATA[privacy]]></category><category><![CDATA[devlog]]></category><dc:creator><![CDATA[Prashik Jadhav]]></dc:creator><pubDate>Sun, 05 Apr 2026 15:11:40 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/69d15c486792e486f6b79afb/315a3389-5bc1-452f-80b6-7f3d9105c42c.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<blockquote>
<p>"In the silence of a TTY shell, I found the clarity that high-level abstractions often hide."</p>
</blockquote>
<p>Welcome to <strong>Loki's Lab</strong>.</p>
<p>If you are here, you probably care about performance, privacy, and the raw power of open-source software. This isn't just a blog; it's a digital logbook of my journey through the layers of the OSI model, the kernels of Linux, and the blocks of the chain.</p>
<hr />
<h2>Who is CodedLoki?</h2>
<p>I am <strong>Prashik Jadhav</strong>, a developer and a seeker of technical truth. While the world moves towards "heavy" and "bloated" software, I am obsessed with <strong>Minimalism</strong>.</p>
<p>My daily driver is <strong>Arch Linux</strong> (yes, I use Arch, btw), managed via <strong>i3wm/Openbox</strong>. I believe that a developer should understand the tools they use, down to the last config line.</p>
<hr />
<h2>What to Expect in the Lab?</h2>
<p>In this space, I will be documenting my deep dives into:</p>
<ul>
<li><p><strong>🐧 Linux Internals:</strong> From ricing my desktop to kernel-level explorations. No bloat, just pure configuration.</p>
</li>
<li><p><strong>🌐 Networking:</strong> Demystifying how data moves. From Cisco Packet Tracer labs to real-world protocol analysis.</p>
</li>
<li><p><strong>🛡️ Cybersecurity:</strong> My logs from CTFs, penetration testing experiments, and building security tools like <em>Nexus Probe</em>.</p>
</li>
<li><p><strong>⛓️ Blockchain &amp; Web3:</strong> Deciphering decentralized technology. Writing secure Smart Contracts in Solidity and exploring the future of dApps on networks like Polygon and Sui.</p>
</li>
<li><p><strong>🏗️ Build Logs:</strong> Real-talk about development. Why I chose Rust over Python for performance, and the architectural "aha!" moments.</p>
</li>
</ul>
<hr />
<h2>The Philosophy: Security. Simplicity. Code.</h2>
<ol>
<li><p><strong>Security is not an afterthought:</strong> It's the foundation. Whether I'm writing a Solidity contract or a Go backend, security comes first.</p>
</li>
<li><p><strong>Simplicity is the ultimate sophistication:</strong> If a script can do it in 10 lines, don't use a 100MB framework.</p>
</li>
<li><p><strong>Decentralization is Power:</strong> Understanding Web3 isn't just about code; it's about returning control to the users.</p>
</li>
</ol>
<hr />
<h2>Join the Journey</h2>
<p>I’m currently in a "drop year," but I’m not standing still. I’m building, breaking, and learning every single day.</p>
<p>If you're into <strong>Low-level programming</strong>, <strong>Offensive Security</strong>, or the <strong>Decentralized Web</strong>, you’re in the right place.</p>
<p><strong>Let's build something efficient.</strong></p>
<hr />
<p><strong>Connect with me:</strong> <a href="https://codedloki.is-a.dev">Portfolio</a> | <a href="https://github.com/codedloki">GitHub</a> | <a href="https://x.com/prashikcodes">Twitter/X</a></p>
]]></content:encoded></item></channel></rss>