Full Code of realgam3/pymultitor for AI

master 44ff84ba7b72 cached
12 files
116.3 KB
34.8k tokens
41 symbols
1 requests
Download .txt
Repository: realgam3/pymultitor
Branch: master
Commit: 44ff84ba7b72
Files: 12
Total size: 116.3 KB

Directory structure:
gitextract_xf2j_25a/

├── .github/
│   └── workflows/
│       └── publish.yml
├── .gitignore
├── Dockerfile
├── LICENSE.md
├── README.md
├── examples/
│   ├── john.txt
│   ├── on-count_whatismyip.py
│   ├── on-regex_credential_stuffing.py
│   └── on-string_bruteforce.py
├── pymultitor.py
├── requirements.txt
└── setup.py

================================================
FILE CONTENTS
================================================

================================================
FILE: .github/workflows/publish.yml
================================================
name: Build and Publish

on:
  push:
    branches:
      - '**'
    tags:
      - 'v[0-9]+.[0-9]+'  # Trigger on tags like v1.0, 2.3, etc.
      - 'v[0-9]+.[0-9]+.*'  # Trigger on tags like v1.0.0, 2.3.0, etc.

permissions:
  contents: read

jobs:
  dockerhub-publish:
    runs-on: ubuntu-latest
    environment: release
    if: github.ref_type == 'branch' || github.ref_type == 'tag'
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Login to Docker Hub
        run: docker login -u "${{ vars.DOCKERHUB_USER }}" -p "${{ secrets.DOCKERHUB_TOKEN }}"

      - name: Build Docker Image
        run: |
          DOCKER_IMAGE_TAG="${GITHUB_REPOSITORY}:${GITHUB_REF_NAME}"
          docker build -t "$DOCKER_IMAGE_TAG" .
          if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
              docker tag "$DOCKER_IMAGE_TAG" "${GITHUB_REPOSITORY}:latest"
          fi

      - name: Publish Docker Image
        run: |
          DOCKER_IMAGE_TAG="${GITHUB_REPOSITORY}:${GITHUB_REF_NAME}"
          docker push "$DOCKER_IMAGE_TAG"
          if [[ "${GITHUB_REF_TYPE}" == "tag" ]]; then
              docker push "${GITHUB_REPOSITORY}:latest"
          fi

  pypi-publish:
    runs-on: ubuntu-latest
    environment: release
    permissions:
      id-token: write
    if: github.ref_type == 'tag'
    steps:
      - name: Checkout code
        uses: actions/checkout@v4

      - name: Set up Python
        uses: actions/setup-python@v5
        with:
          python-version: '3.10'

      - name: Install dependencies
        run: |
          python -m pip install --upgrade pip
          pip install wheel

      - name: Build Python Package
        run: python setup.py sdist bdist_wheel

      - name: Publish Python Package
        uses: pypa/gh-action-pypi-publish@release/v1


================================================
FILE: .gitignore
================================================
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class

# C extensions
*.so

# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg

# PyInstaller
#  Usually these files are written by a python script from a template
#  before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec

# Installer logs
pip-log.txt
pip-delete-this-directory.txt

# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/

# Translations
*.mo
*.pot

# Django stuff:
*.log
local_settings.py

# Flask stuff:
instance/
.webassets-cache

# Scrapy stuff:
.scrapy

# Sphinx documentation
docs/_build/

# PyBuilder
target/

# IPython Notebook
.ipynb_checkpoints

# pyenv
.python-version

# celery beat schedule file
celerybeat-schedule

# dotenv
.env

# virtualenv
venv/
ENV/

# Spyder project settings
.spyderproject

# Rope project settings
.ropeproject

# Pycharm project settings
.idea/
/Pipfile
/Pipfile.lock


================================================
FILE: Dockerfile
================================================
FROM mitmproxy/mitmproxy:12.1

# Create app directory
WORKDIR /app

# Bundle app source
COPY requirements.txt /app/
RUN set -eux; \
    \
    apt-get update && apt-get install -y tor; \
    pip install -r requirements.txt

COPY pymultitor.py /app/

EXPOSE 8080

ENTRYPOINT [ "python3", "/app/pymultitor.py", "-lh", "0.0.0.0", "-lp", "8080" ]

================================================
FILE: LICENSE.md
================================================
GNU GENERAL PUBLIC LICENSE

                       Version 3, 29 June 2007



 Copyright (C) 2007 Free Software Foundation, Inc. {http://fsf.org/}

 Everyone is permitted to copy and distribute verbatim copies

 of this license document, but changing it is not allowed.



                            Preamble



  The GNU General Public License is a free, copyleft license for

software and other kinds of works.



  The licenses for most software and other practical works are designed

to take away your freedom to share and change the works.  By contrast,

the GNU General Public License is intended to guarantee your freedom to

share and change all versions of a program--to make sure it remains free

software for all its users.  We, the Free Software Foundation, use the

GNU General Public License for most of our software; it applies also to

any other work released this way by its authors.  You can apply it to

your programs, too.



  When we speak of free software, we are referring to freedom, not

price.  Our General Public Licenses are designed to make sure that you

have the freedom to distribute copies of free software (and charge for

them if you wish), that you receive source code or can get it if you

want it, that you can change the software or use pieces of it in new

free programs, and that you know you can do these things.



  To protect your rights, we need to prevent others from denying you

these rights or asking you to surrender the rights.  Therefore, you have

certain responsibilities if you distribute copies of the software, or if

you modify it: responsibilities to respect the freedom of others.



  For example, if you distribute copies of such a program, whether

gratis or for a fee, you must pass on to the recipients the same

freedoms that you received.  You must make sure that they, too, receive

or can get the source code.  And you must show them these terms so they

know their rights.



  Developers that use the GNU GPL protect your rights with two steps:

(1) assert copyright on the software, and (2) offer you this License

giving you legal permission to copy, distribute and/or modify it.



  For the developers' and authors' protection, the GPL clearly explains

that there is no warranty for this free software.  For both users' and

authors' sake, the GPL requires that modified versions be marked as

changed, so that their problems will not be attributed erroneously to

authors of previous versions.



  Some devices are designed to deny users access to install or run

modified versions of the software inside them, although the manufacturer

can do so.  This is fundamentally incompatible with the aim of

protecting users' freedom to change the software.  The systematic

pattern of such abuse occurs in the area of products for individuals to

use, which is precisely where it is most unacceptable.  Therefore, we

have designed this version of the GPL to prohibit the practice for those

products.  If such problems arise substantially in other domains, we

stand ready to extend this provision to those domains in future versions

of the GPL, as needed to protect the freedom of users.



  Finally, every program is threatened constantly by software patents.

States should not allow patents to restrict development and use of

software on general-purpose computers, but in those that do, we wish to

avoid the special danger that patents applied to a free program could

make it effectively proprietary.  To prevent this, the GPL assures that

patents cannot be used to render the program non-free.



  The precise terms and conditions for copying, distribution and

modification follow.



                       TERMS AND CONDITIONS



  0. Definitions.



  "This License" refers to version 3 of the GNU General Public License.



  "Copyright" also means copyright-like laws that apply to other kinds of

works, such as semiconductor masks.



  "The Program" refers to any copyrightable work licensed under this

License.  Each licensee is addressed as "you".  "Licensees" and

"recipients" may be individuals or organizations.



  To "modify" a work means to copy from or adapt all or part of the work

in a fashion requiring copyright permission, other than the making of an

exact copy.  The resulting work is called a "modified version" of the

earlier work or a work "based on" the earlier work.



  A "covered work" means either the unmodified Program or a work based

on the Program.



  To "propagate" a work means to do anything with it that, without

permission, would make you directly or secondarily liable for

infringement under applicable copyright law, except executing it on a

computer or modifying a private copy.  Propagation includes copying,

distribution (with or without modification), making available to the

public, and in some countries other activities as well.



  To "convey" a work means any kind of propagation that enables other

parties to make or receive copies.  Mere interaction with a user through

a computer network, with no transfer of a copy, is not conveying.



  An interactive user interface displays "Appropriate Legal Notices"

to the extent that it includes a convenient and prominently visible

feature that (1) displays an appropriate copyright notice, and (2)

tells the user that there is no warranty for the work (except to the

extent that warranties are provided), that licensees may convey the

work under this License, and how to view a copy of this License.  If

the interface presents a list of user commands or options, such as a

menu, a prominent item in the list meets this criterion.



  1. Source Code.



  The "source code" for a work means the preferred form of the work

for making modifications to it.  "Object code" means any non-source

form of a work.



  A "Standard Interface" means an interface that either is an official

standard defined by a recognized standards body, or, in the case of

interfaces specified for a particular programming language, one that

is widely used among developers working in that language.



  The "System Libraries" of an executable work include anything, other

than the work as a whole, that (a) is included in the normal form of

packaging a Major Component, but which is not part of that Major

Component, and (b) serves only to enable use of the work with that

Major Component, or to implement a Standard Interface for which an

implementation is available to the public in source code form.  A

"Major Component", in this context, means a major essential component

(kernel, window system, and so on) of the specific operating system

(if any) on which the executable work runs, or a compiler used to

produce the work, or an object code interpreter used to run it.



  The "Corresponding Source" for a work in object code form means all

the source code needed to generate, install, and (for an executable

work) run the object code and to modify the work, including scripts to

control those activities.  However, it does not include the work's

System Libraries, or general-purpose tools or generally available free

programs which are used unmodified in performing those activities but

which are not part of the work.  For example, Corresponding Source

includes interface definition files associated with source files for

the work, and the source code for shared libraries and dynamically

linked subprograms that the work is specifically designed to require,

such as by intimate data communication or control flow between those

subprograms and other parts of the work.



  The Corresponding Source need not include anything that users

can regenerate automatically from other parts of the Corresponding

Source.



  The Corresponding Source for a work in source code form is that

same work.



  2. Basic Permissions.



  All rights granted under this License are granted for the term of

copyright on the Program, and are irrevocable provided the stated

conditions are met.  This License explicitly affirms your unlimited

permission to run the unmodified Program.  The output from running a

covered work is covered by this License only if the output, given its

content, constitutes a covered work.  This License acknowledges your

rights of fair use or other equivalent, as provided by copyright law.



  You may make, run and propagate covered works that you do not

convey, without conditions so long as your license otherwise remains

in force.  You may convey covered works to others for the sole purpose

of having them make modifications exclusively for you, or provide you

with facilities for running those works, provided that you comply with

the terms of this License in conveying all material for which you do

not control copyright.  Those thus making or running the covered works

for you must do so exclusively on your behalf, under your direction

and control, on terms that prohibit them from making any copies of

your copyrighted material outside their relationship with you.



  Conveying under any other circumstances is permitted solely under

the conditions stated below.  Sublicensing is not allowed; section 10

makes it unnecessary.



  3. Protecting Users' Legal Rights From Anti-Circumvention Law.



  No covered work shall be deemed part of an effective technological

measure under any applicable law fulfilling obligations under article

11 of the WIPO copyright treaty adopted on 20 December 1996, or

similar laws prohibiting or restricting circumvention of such

measures.



  When you convey a covered work, you waive any legal power to forbid

circumvention of technological measures to the extent such circumvention

is effected by exercising rights under this License with respect to

the covered work, and you disclaim any intention to limit operation or

modification of the work as a means of enforcing, against the work's

users, your or third parties' legal rights to forbid circumvention of

technological measures.



  4. Conveying Verbatim Copies.



  You may convey verbatim copies of the Program's source code as you

receive it, in any medium, provided that you conspicuously and

appropriately publish on each copy an appropriate copyright notice;

keep intact all notices stating that this License and any

non-permissive terms added in accord with section 7 apply to the code;

keep intact all notices of the absence of any warranty; and give all

recipients a copy of this License along with the Program.



  You may charge any price or no price for each copy that you convey,

and you may offer support or warranty protection for a fee.



  5. Conveying Modified Source Versions.



  You may convey a work based on the Program, or the modifications to

produce it from the Program, in the form of source code under the

terms of section 4, provided that you also meet all of these conditions:



    a) The work must carry prominent notices stating that you modified

    it, and giving a relevant date.



    b) The work must carry prominent notices stating that it is

    released under this License and any conditions added under section

    7.  This requirement modifies the requirement in section 4 to

    "keep intact all notices".



    c) You must license the entire work, as a whole, under this

    License to anyone who comes into possession of a copy.  This

    License will therefore apply, along with any applicable section 7

    additional terms, to the whole of the work, and all its parts,

    regardless of how they are packaged.  This License gives no

    permission to license the work in any other way, but it does not

    invalidate such permission if you have separately received it.



    d) If the work has interactive user interfaces, each must display

    Appropriate Legal Notices; however, if the Program has interactive

    interfaces that do not display Appropriate Legal Notices, your

    work need not make them do so.



  A compilation of a covered work with other separate and independent

works, which are not by their nature extensions of the covered work,

and which are not combined with it such as to form a larger program,

in or on a volume of a storage or distribution medium, is called an

"aggregate" if the compilation and its resulting copyright are not

used to limit the access or legal rights of the compilation's users

beyond what the individual works permit.  Inclusion of a covered work

in an aggregate does not cause this License to apply to the other

parts of the aggregate.



  6. Conveying Non-Source Forms.



  You may convey a covered work in object code form under the terms

of sections 4 and 5, provided that you also convey the

machine-readable Corresponding Source under the terms of this License,

in one of these ways:



    a) Convey the object code in, or embodied in, a physical product

    (including a physical distribution medium), accompanied by the

    Corresponding Source fixed on a durable physical medium

    customarily used for software interchange.



    b) Convey the object code in, or embodied in, a physical product

    (including a physical distribution medium), accompanied by a

    written offer, valid for at least three years and valid for as

    long as you offer spare parts or customer support for that product

    model, to give anyone who possesses the object code either (1) a

    copy of the Corresponding Source for all the software in the

    product that is covered by this License, on a durable physical

    medium customarily used for software interchange, for a price no

    more than your reasonable cost of physically performing this

    conveying of source, or (2) access to copy the

    Corresponding Source from a network server at no charge.



    c) Convey individual copies of the object code with a copy of the

    written offer to provide the Corresponding Source.  This

    alternative is allowed only occasionally and noncommercially, and

    only if you received the object code with such an offer, in accord

    with subsection 6b.



    d) Convey the object code by offering access from a designated

    place (gratis or for a charge), and offer equivalent access to the

    Corresponding Source in the same way through the same place at no

    further charge.  You need not require recipients to copy the

    Corresponding Source along with the object code.  If the place to

    copy the object code is a network server, the Corresponding Source

    may be on a different server (operated by you or a third party)

    that supports equivalent copying facilities, provided you maintain

    clear directions next to the object code saying where to find the

    Corresponding Source.  Regardless of what server hosts the

    Corresponding Source, you remain obligated to ensure that it is

    available for as long as needed to satisfy these requirements.



    e) Convey the object code using peer-to-peer transmission, provided

    you inform other peers where the object code and Corresponding

    Source of the work are being offered to the general public at no

    charge under subsection 6d.



  A separable portion of the object code, whose source code is excluded

from the Corresponding Source as a System Library, need not be

included in conveying the object code work.



  A "User Product" is either (1) a "consumer product", which means any

tangible personal property which is normally used for personal, family,

or household purposes, or (2) anything designed or sold for incorporation

into a dwelling.  In determining whether a product is a consumer product,

doubtful cases shall be resolved in favor of coverage.  For a particular

product received by a particular user, "normally used" refers to a

typical or common use of that class of product, regardless of the status

of the particular user or of the way in which the particular user

actually uses, or expects or is expected to use, the product.  A product

is a consumer product regardless of whether the product has substantial

commercial, industrial or non-consumer uses, unless such uses represent

the only significant mode of use of the product.



  "Installation Information" for a User Product means any methods,

procedures, authorization keys, or other information required to install

and execute modified versions of a covered work in that User Product from

a modified version of its Corresponding Source.  The information must

suffice to ensure that the continued functioning of the modified object

code is in no case prevented or interfered with solely because

modification has been made.



  If you convey an object code work under this section in, or with, or

specifically for use in, a User Product, and the conveying occurs as

part of a transaction in which the right of possession and use of the

User Product is transferred to the recipient in perpetuity or for a

fixed term (regardless of how the transaction is characterized), the

Corresponding Source conveyed under this section must be accompanied

by the Installation Information.  But this requirement does not apply

if neither you nor any third party retains the ability to install

modified object code on the User Product (for example, the work has

been installed in ROM).



  The requirement to provide Installation Information does not include a

requirement to continue to provide support service, warranty, or updates

for a work that has been modified or installed by the recipient, or for

the User Product in which it has been modified or installed.  Access to a

network may be denied when the modification itself materially and

adversely affects the operation of the network or violates the rules and

protocols for communication across the network.



  Corresponding Source conveyed, and Installation Information provided,

in accord with this section must be in a format that is publicly

documented (and with an implementation available to the public in

source code form), and must require no special password or key for

unpacking, reading or copying.



  7. Additional Terms.



  "Additional permissions" are terms that supplement the terms of this

License by making exceptions from one or more of its conditions.

Additional permissions that are applicable to the entire Program shall

be treated as though they were included in this License, to the extent

that they are valid under applicable law.  If additional permissions

apply only to part of the Program, that part may be used separately

under those permissions, but the entire Program remains governed by

this License without regard to the additional permissions.



  When you convey a copy of a covered work, you may at your option

remove any additional permissions from that copy, or from any part of

it.  (Additional permissions may be written to require their own

removal in certain cases when you modify the work.)  You may place

additional permissions on material, added by you to a covered work,

for which you have or can give appropriate copyright permission.



  Notwithstanding any other provision of this License, for material you

add to a covered work, you may (if authorized by the copyright holders of

that material) supplement the terms of this License with terms:



    a) Disclaiming warranty or limiting liability differently from the

    terms of sections 15 and 16 of this License; or



    b) Requiring preservation of specified reasonable legal notices or

    author attributions in that material or in the Appropriate Legal

    Notices displayed by works containing it; or



    c) Prohibiting misrepresentation of the origin of that material, or

    requiring that modified versions of such material be marked in

    reasonable ways as different from the original version; or



    d) Limiting the use for publicity purposes of names of licensors or

    authors of the material; or



    e) Declining to grant rights under trademark law for use of some

    trade names, trademarks, or service marks; or



    f) Requiring indemnification of licensors and authors of that

    material by anyone who conveys the material (or modified versions of

    it) with contractual assumptions of liability to the recipient, for

    any liability that these contractual assumptions directly impose on

    those licensors and authors.



  All other non-permissive additional terms are considered "further

restrictions" within the meaning of section 10.  If the Program as you

received it, or any part of it, contains a notice stating that it is

governed by this License along with a term that is a further

restriction, you may remove that term.  If a license document contains

a further restriction but permits relicensing or conveying under this

License, you may add to a covered work material governed by the terms

of that license document, provided that the further restriction does

not survive such relicensing or conveying.



  If you add terms to a covered work in accord with this section, you

must place, in the relevant source files, a statement of the

additional terms that apply to those files, or a notice indicating

where to find the applicable terms.



  Additional terms, permissive or non-permissive, may be stated in the

form of a separately written license, or stated as exceptions;

the above requirements apply either way.



  8. Termination.



  You may not propagate or modify a covered work except as expressly

provided under this License.  Any attempt otherwise to propagate or

modify it is void, and will automatically terminate your rights under

this License (including any patent licenses granted under the third

paragraph of section 11).



  However, if you cease all violation of this License, then your

license from a particular copyright holder is reinstated (a)

provisionally, unless and until the copyright holder explicitly and

finally terminates your license, and (b) permanently, if the copyright

holder fails to notify you of the violation by some reasonable means

prior to 60 days after the cessation.



  Moreover, your license from a particular copyright holder is

reinstated permanently if the copyright holder notifies you of the

violation by some reasonable means, this is the first time you have

received notice of violation of this License (for any work) from that

copyright holder, and you cure the violation prior to 30 days after

your receipt of the notice.



  Termination of your rights under this section does not terminate the

licenses of parties who have received copies or rights from you under

this License.  If your rights have been terminated and not permanently

reinstated, you do not qualify to receive new licenses for the same

material under section 10.



  9. Acceptance Not Required for Having Copies.



  You are not required to accept this License in order to receive or

run a copy of the Program.  Ancillary propagation of a covered work

occurring solely as a consequence of using peer-to-peer transmission

to receive a copy likewise does not require acceptance.  However,

nothing other than this License grants you permission to propagate or

modify any covered work.  These actions infringe copyright if you do

not accept this License.  Therefore, by modifying or propagating a

covered work, you indicate your acceptance of this License to do so.



  10. Automatic Licensing of Downstream Recipients.



  Each time you convey a covered work, the recipient automatically

receives a license from the original licensors, to run, modify and

propagate that work, subject to this License.  You are not responsible

for enforcing compliance by third parties with this License.



  An "entity transaction" is a transaction transferring control of an

organization, or substantially all assets of one, or subdividing an

organization, or merging organizations.  If propagation of a covered

work results from an entity transaction, each party to that

transaction who receives a copy of the work also receives whatever

licenses to the work the party's predecessor in interest had or could

give under the previous paragraph, plus a right to possession of the

Corresponding Source of the work from the predecessor in interest, if

the predecessor has it or can get it with reasonable efforts.



  You may not impose any further restrictions on the exercise of the

rights granted or affirmed under this License.  For example, you may

not impose a license fee, royalty, or other charge for exercise of

rights granted under this License, and you may not initiate litigation

(including a cross-claim or counterclaim in a lawsuit) alleging that

any patent claim is infringed by making, using, selling, offering for

sale, or importing the Program or any portion of it.



  11. Patents.



  A "contributor" is a copyright holder who authorizes use under this

License of the Program or a work on which the Program is based.  The

work thus licensed is called the contributor's "contributor version".



  A contributor's "essential patent claims" are all patent claims

owned or controlled by the contributor, whether already acquired or

hereafter acquired, that would be infringed by some manner, permitted

by this License, of making, using, or selling its contributor version,

but do not include claims that would be infringed only as a

consequence of further modification of the contributor version.  For

purposes of this definition, "control" includes the right to grant

patent sublicenses in a manner consistent with the requirements of

this License.



  Each contributor grants you a non-exclusive, worldwide, royalty-free

patent license under the contributor's essential patent claims, to

make, use, sell, offer for sale, import and otherwise run, modify and

propagate the contents of its contributor version.



  In the following three paragraphs, a "patent license" is any express

agreement or commitment, however denominated, not to enforce a patent

(such as an express permission to practice a patent or covenant not to

sue for patent infringement).  To "grant" such a patent license to a

party means to make such an agreement or commitment not to enforce a

patent against the party.



  If you convey a covered work, knowingly relying on a patent license,

and the Corresponding Source of the work is not available for anyone

to copy, free of charge and under the terms of this License, through a

publicly available network server or other readily accessible means,

then you must either (1) cause the Corresponding Source to be so

available, or (2) arrange to deprive yourself of the benefit of the

patent license for this particular work, or (3) arrange, in a manner

consistent with the requirements of this License, to extend the patent

license to downstream recipients.  "Knowingly relying" means you have

actual knowledge that, but for the patent license, your conveying the

covered work in a country, or your recipient's use of the covered work

in a country, would infringe one or more identifiable patents in that

country that you have reason to believe are valid.



  If, pursuant to or in connection with a single transaction or

arrangement, you convey, or propagate by procuring conveyance of, a

covered work, and grant a patent license to some of the parties

receiving the covered work authorizing them to use, propagate, modify

or convey a specific copy of the covered work, then the patent license

you grant is automatically extended to all recipients of the covered

work and works based on it.



  A patent license is "discriminatory" if it does not include within

the scope of its coverage, prohibits the exercise of, or is

conditioned on the non-exercise of one or more of the rights that are

specifically granted under this License.  You may not convey a covered

work if you are a party to an arrangement with a third party that is

in the business of distributing software, under which you make payment

to the third party based on the extent of your activity of conveying

the work, and under which the third party grants, to any of the

parties who would receive the covered work from you, a discriminatory

patent license (a) in connection with copies of the covered work

conveyed by you (or copies made from those copies), or (b) primarily

for and in connection with specific products or compilations that

contain the covered work, unless you entered into that arrangement,

or that patent license was granted, prior to 28 March 2007.



  Nothing in this License shall be construed as excluding or limiting

any implied license or other defenses to infringement that may

otherwise be available to you under applicable patent law.



  12. No Surrender of Others' Freedom.



  If conditions are imposed on you (whether by court order, agreement or

otherwise) that contradict the conditions of this License, they do not

excuse you from the conditions of this License.  If you cannot convey a

covered work so as to satisfy simultaneously your obligations under this

License and any other pertinent obligations, then as a consequence you may

not convey it at all.  For example, if you agree to terms that obligate you

to collect a royalty for further conveying from those to whom you convey

the Program, the only way you could satisfy both those terms and this

License would be to refrain entirely from conveying the Program.



  13. Use with the GNU Affero General Public License.



  Notwithstanding any other provision of this License, you have

permission to link or combine any covered work with a work licensed

under version 3 of the GNU Affero General Public License into a single

combined work, and to convey the resulting work.  The terms of this

License will continue to apply to the part which is the covered work,

but the special requirements of the GNU Affero General Public License,

section 13, concerning interaction through a network will apply to the

combination as such.



  14. Revised Versions of this License.



  The Free Software Foundation may publish revised and/or new versions of

the GNU General Public License from time to time.  Such new versions will

be similar in spirit to the present version, but may differ in detail to

address new problems or concerns.



  Each version is given a distinguishing version number.  If the

Program specifies that a certain numbered version of the GNU General

Public License "or any later version" applies to it, you have the

option of following the terms and conditions either of that numbered

version or of any later version published by the Free Software

Foundation.  If the Program does not specify a version number of the

GNU General Public License, you may choose any version ever published

by the Free Software Foundation.



  If the Program specifies that a proxy can decide which future

versions of the GNU General Public License can be used, that proxy's

public statement of acceptance of a version permanently authorizes you

to choose that version for the Program.



  Later license versions may give you additional or different

permissions.  However, no additional obligations are imposed on any

author or copyright holder as a result of your choosing to follow a

later version.



  15. Disclaimer of Warranty.



  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY

APPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT

HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY

OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,

THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR

PURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM

IS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF

ALL NECESSARY SERVICING, REPAIR OR CORRECTION.



  16. Limitation of Liability.



  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING

WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS

THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY

GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE

USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF

DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD

PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),

EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF

SUCH DAMAGES.



  17. Interpretation of Sections 15 and 16.



  If the disclaimer of warranty and limitation of liability provided

above cannot be given local legal effect according to their terms,

reviewing courts shall apply local law that most closely approximates

an absolute waiver of all civil liability in connection with the

Program, unless a warranty or assumption of liability accompanies a

copy of the Program in return for a fee.



                     END OF TERMS AND CONDITIONS



            How to Apply These Terms to Your New Programs



  If you develop a new program, and you want it to be of the greatest

possible use to the public, the best way to achieve this is to make it

free software which everyone can redistribute and change under these terms.



  To do so, attach the following notices to the program.  It is safest

to attach them to the start of each source file to most effectively

state the exclusion of warranty; and each file should have at least

the "copyright" line and a pointer to where the full notice is found.



    {one line to give the program's name and a brief idea of what it does.}

    Copyright (C) {year}  {name of author}



    This program is free software: you can redistribute it and/or modify

    it under the terms of the GNU General Public License as published by

    the Free Software Foundation, either version 3 of the License, or

    (at your option) any later version.



    This program is distributed in the hope that it will be useful,

    but WITHOUT ANY WARRANTY; without even the implied warranty of

    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

    GNU General Public License for more details.



    You should have received a copy of the GNU General Public License

    along with this program.  If not, see {http://www.gnu.org/licenses/}.



Also add information on how to contact you by electronic and paper mail.



  If the program does terminal interaction, make it output a short

notice like this when it starts in an interactive mode:



    {{project}}  Copyright (C) {{year}}  {{fullname}}

    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.

    This is free software, and you are welcome to redistribute it

    under certain conditions; type `show c' for details.



The hypothetical commands `show w' and `show c' should show the appropriate

parts of the General Public License.  Of course, your program's commands

might be different; for a GUI interface, you would use an "about box".



  You should also get your employer (if you work as a programmer) or school,

if any, to sign a "copyright disclaimer" for the program, if necessary.

For more information on this, and how to apply and follow the GNU GPL, see

{http://www.gnu.org/licenses/}.



  The GNU General Public License does not permit incorporating your program

into proprietary programs.  If your program is a subroutine library, you

may consider it more useful to permit linking proprietary applications with

the library.  If this is what you want to do, use the GNU Lesser General

Public License instead of this License.  But first, please read

{http://www.gnu.org/philosophy/why-not-lgpl.html}.



================================================
FILE: README.md
================================================
## PyMultiTor

[![PyPI version](https://img.shields.io/pypi/v/pymultitor)](https://pypi.org/project/pymultitor/)
[![Downloads](https://pepy.tech/badge/pymultitor)](https://pepy.tech/project/pymultitor)
![PyPI - Python Version](https://img.shields.io/pypi/pyversions/pymultitor)  

Python Multi Threaded Tor Proxy,  
Did you ever want to be at two different places at the same time?  
When I asked myself this question, I actually started developing this solution in my mind.  
While performing penetration tests there are often problems caused by security devices that block the "attacking" IP.  
This really annoyed me, so I wrote a script to supply a solution for this problem.  
With a large number of IP addresses performing the attacks, better results are guaranteed - especially when attempting
attacks to bypass Web Application Firewalls, Brute-Force type attacks and many more.

[Blackhat Asia] https://www.blackhat.com/asia-17/arsenal.html#pymultitor  
[Owasp-IL Presentation] https://www.owasp.org/images/3/3d/OWASPIL-2016-02-02_PyMultiTor_TomerZait.pdf  
[DigitalWhisper Article (Hebrew)] http://www.digitalwhisper.co.il/files/Zines/0x2E/DW46-3-PyMultitor.pdf

![Logo](https://raw.githubusercontent.com/realgam3/pymultitor/master/assets/img/pymultitor-logo.png)

## Installation

### Prerequisites

* Python 3.10+.
* mitmproxy (https://mitmproxy.org/).
* tor.
    * On Ubuntu / Kali, `sudo apt install -y tor`
    * On Centos, `sudo yum install -y tor`
    * On Fedora, `sudo dnf install -y tor`
    * On Windows,
        * download tor expert bundle: https://www.torproject.org/download/tor/
        * insert tor to your path environment: `{tor-win32-*_path}\Tor`
        * if you don't know how remember tor.exe path and use `--tor-cmd` argument on pymultitor (for
          example: `pymultitor --tor-cmd "c:\Pentest\Web\tor-win32-0.2.9.9\Tor\tor.exe"`)
    * On MacOS, `brew install tor`

### From pip

```shell
pip3 install pymultitor
```

### From Docker

```shell
docker pull realgam3/pymultitor
```

### From Source

```shell
git clone https://github.com/realgam3/pymultitor.git
cd pymultitor

# Install python dependencies.
# Depending on your setup, one or both of these may require sudo.
pip3 install -r requirements.txt
python3 setup.py install

# Confirm that everything works
pymultitor --help
```

Bug reports on installation issues are welcome!

## Usage

### Basic Usage

1. Run `pymultitor --on-string "Your IP Address Blocked"`.  
2. On your script use proxy (`http://127.0.0.1:8080`).  
   When the string `Your IP Address Blocked` will present in the response content, you will exit from another IP address.  

### Docker Usage

1. Run `docker run --rm -p 8080:8080 realgam3/pymultitor --on-string "Your IP Address Blocked"`.  
2. On your script use proxy (`http://127.0.0.1:8080`).  
   When the string `Your IP Address Blocked` will present in the response content, you will exit from another IP address.  

### API Usage

PyMultiTor provides a REST API for managing proxy identities. You can use the API to change your proxy identity on demand.

#### Authentication

The API requires authentication using a Bearer token. You can set the token in two ways:

1. **Environment Variable**: Set the `PYMULTITOR_TOKEN` environment variable:
   ```bash
   export PYMULTITOR_TOKEN="your-secret-token-here"
   ```
   **Note**: If `PYMULTITOR_TOKEN` is not set, PyMultiTor will automatically generate a random token for you.

2. **Command Line**: starting PyMultiTor:
   ```bash
   pymultitor
   ```

#### Endpoints

**Change Identity**
- **URL**: `/identity`
- **Method**: `POST`

**Example Usage**:
```bash
curl http://pymultitor/identity -X POST \
  --header "Proxy-Authorization: Bearer {Token}" \
  --proxy http://localhost:8080
```

**Status**
- **URL**: `/status`
- **Method**: `GET`

**Example Usage**:
```bash
curl http://pymultitor/status \
  --header "Proxy-Authorization: Bearer {Token}" \
  --proxy http://localhost:8080
```

**Note**: Replace `{Token}` with your actual authentication token.

### Command Line Arguments

```shell
pymultitor --help
```

```text
usage: pymultitor.py [-h] [-v] [-lh LISTEN_HOST] [-lp LISTEN_PORT] [-s] [-a AUTH] [-i] [-d] [-p PROCESSES] [-c CMD] [-e CONFIG] [-t TIMEOUT] [-r TRIES]
                     [--request-timeout REQUEST_TIMEOUT] [--on-count ON_COUNT] [--on-string ON_STRING] [--on-regex ON_REGEX] [--on-rst] [--on-status-code [ON_STATUS_CODE ...]]
                     [--on-timeout]

options:
  -h, --help            show this help message and exit
  -v, --version         show program's version number and exit
  -lh, --host LISTEN_HOST
                        proxy listen host. (default: 127.0.0.1)
  -lp, --port LISTEN_PORT
                        proxy listen port (default: 8080)
  -s, --socks           use as socks proxy (not http proxy) (default: False)
  -a, --auth AUTH       set proxy authentication (format: 'username:pass') (default: )
  -i, --insecure        insecure ssl (default: False)
  -d, --debug           Debug Log. (default: False)
  -p, --tor-processes PROCESSES
                        number of tor processes in the cycle (default: 2)
  -c, --tor-cmd CMD     tor cmd (executable path + arguments) (default: tor)
  -e, --tor-config CONFIG
                        tor extended json configuration (default: {})
  -t, --tor-timeout TIMEOUT
                        timeout in seconds for starting a tor instance; 0 disables timeout (default: 90)
  -r, --tor-tries TRIES
                        number tries to start a tor instance before it fails (default: 5)
  --request-timeout REQUEST_TIMEOUT
                        timeout in seconds for http requests; 0 disables timeout (default: 0)
  --on-count ON_COUNT   change ip every x requests (resources also counted) (default: 0)
  --on-string ON_STRING
                        change ip when string found in the response content (default: )
  --on-regex ON_REGEX   change ip when regex found in The response content (default: )
  --on-rst              change ip when connection closed with tcp rst (default: False)
  --on-status-code [ON_STATUS_CODE ...]
                        change ip when one of the specified status codes is returned (default: [])
  --on-timeout          change ip when request times out (default: False)
```


================================================
FILE: examples/john.txt
================================================
12345:12345
abc123:abc123
password:password
computer:computer
123456:123456
tigger:tigger
1234:1234
a1b2c3:a1b2c3
qwerty:qwerty
123:123
xxx:xxx
money:money
test:test
carmen:carmen
mickey:mickey
secret:secret
summer:summer
internet:internet
service:service
canada:canada
hello:hello
ranger:ranger
shadow:shadow
baseball:baseball
donald:donald
harley:harley
hockey:hockey
letmein:letmein
maggie:maggie
mike:mike
mustang:mustang
snoopy:snoopy
buster:buster
dragon:dragon
jordan:jordan
michael:michael
michelle:michelle
mindy:mindy
patrick:patrick
123abc:123abc
andrew:andrew
bear:bear
calvin:calvin
changeme:changeme
diamond:diamond
fuckme:fuckme
fuckyou:fuckyou
matthew:matthew
miller:miller
ou812:ou812
tiger:tiger
trustno1:trustno1
12345678:12345678
alex:alex
apple:apple
avalon:avalon
brandy:brandy
chelsea:chelsea
coffee:coffee
dave:dave
falcon:falcon
freedom:freedom
gandalf:gandalf
golf:golf
green:green
helpme:helpme
linda:linda
magic:magic
merlin:merlin
molson:molson
newyork:newyork
soccer:soccer
thomas:thomas
wizard:wizard
Monday:Monday
asdfgh:asdfgh
bandit:bandit
batman:batman
boris:boris
butthead:butthead
dorothy:dorothy
eeyore:eeyore
fishing:fishing
football:football
george:george
happy:happy
iloveyou:iloveyou
jennifer:jennifer
jonathan:jonathan
love:love
marina:marina
master:master
missy:missy
monday:monday
monkey:monkey
natasha:natasha
ncc1701:ncc1701
newpass:newpass
pamela:pamela
pepper:pepper
piglet:piglet
poohbear:poohbear
pookie:pookie
rabbit:rabbit
rachel:rachel
rocket:rocket
rose:rose
smile:smile
sparky:sparky
spring:spring
steven:steven
success:success
sunshine:sunshine
thx1138:thx1138
victoria:victoria
whatever:whatever
zapata:zapata
1:1
8675309:8675309
Internet:Internet
amanda:amanda
andy:andy
angel:angel
august:august
barney:barney
biteme:biteme
boomer:boomer
brian:brian
casey:casey
coke:coke
cowboy:cowboy
delta:delta
doctor:doctor
fisher:fisher
foobar:foobar
island:island
john:john
joshua:joshua
karen:karen
marley:marley
orange:orange
please:please
rascal:rascal
richard:richard
sarah:sarah
scooter:scooter
shalom:shalom
silver:silver
skippy:skippy
stanley:stanley
taylor:taylor
welcome:welcome
zephyr:zephyr
111111:111111
1928:1928
aaaaaa:aaaaaa
abc:abc
access:access
albert:albert
alexander:alexander
andrea:andrea
anna:anna
anthony:anthony
asdfjkl;:asdfjkl;
ashley:ashley
basf:basf
basketball:basketball
beavis:beavis
black:black
bob:bob
booboo:booboo
bradley:bradley
brandon:brandon
buddy:buddy
caitlin:caitlin
camaro:camaro
charlie:charlie
chicken:chicken
chris:chris
cindy:cindy
cricket:cricket
dakota:dakota
dallas:dallas
daniel:daniel
david:david
debbie:debbie
dolphin:dolphin
elephant:elephant
emily:emily
fish:fish
fred:fred
friend:friend
fucker:fucker
ginger:ginger
goodluck:goodluck
hammer:hammer
heather:heather
help:help
iceman:iceman
jason:jason
jessica:jessica
jesus:jesus
joseph:joseph
jupiter:jupiter
justin:justin
kevin:kevin
knight:knight
lacrosse:lacrosse
lakers:lakers
lizard:lizard
madison:madison
mary:mary
mother:mother
muffin:muffin
murphy:murphy
ncc1701d:ncc1701d
newuser:newuser
nirvana:nirvana
none:none
paris:paris
pat:pat
pentium:pentium
phoenix:phoenix
picture:picture
rainbow:rainbow
sandy:sandy
saturn:saturn
scott:scott
shannon:shannon
shithead:shithead
skeeter:skeeter
sophie:sophie
special:special
stephanie:stephanie
stephen:stephen
steve:steve
sweetie:sweetie
teacher:teacher
tennis:tennis
test123:test123
tommy:tommy
topgun:topgun
tristan:tristan
wally:wally
william:william
wilson:wilson
1q2w3e:1q2w3e
654321:654321
666666:666666
777:777
a12345:a12345
a1b2c3d4:a1b2c3d4
alpha:alpha
amber:amber
angela:angela
angie:angie
archie:archie
asdf:asdf
blazer:blazer
bond007:bond007
booger:booger
charles:charles
christin:christin
claire:claire
control:control
danny:danny
david1:david1
dennis:dennis
digital:digital
disney:disney
dog:dog
duck:duck
duke:duke
edward:edward
elvis:elvis
felix:felix
flipper:flipper
floyd:floyd
franklin:franklin
frodo:frodo
guest:guest
honda:honda
horses:horses
hunter:hunter
indigo:indigo
info:info
james:james
jasper:jasper
jeremy:jeremy
joe:joe
julian:julian
kelsey:kelsey
killer:killer
kingfish:kingfish
lauren:lauren
marie:marie
maryjane:maryjane
matrix:matrix
maverick:maverick
mayday:mayday
mercury:mercury
micro:micro
mitchell:mitchell
morgan:morgan
mountain:mountain
niners:niners
nothing:nothing
oliver:oliver
peace:peace
peanut:peanut
pearljam:pearljam
phantom:phantom
popcorn:popcorn
princess:princess
psycho:psycho
pumpkin:pumpkin
purple:purple
randy:randy
rebecca:rebecca
reddog:reddog
robert:robert
rocky:rocky
roses:roses
salmon:salmon
sam:sam
samson:samson
sharon:sharon
sierra:sierra
smokey:smokey
startrek:startrek
steelers:steelers
stimpy:stimpy
sunflower:sunflower
superman:superman
support:support
sydney:sydney
techno:techno
telecom:telecom
test1:test1
walter:walter
willie:willie
willow:willow
winner:winner
ziggy:ziggy
zxcvbnm:zxcvbnm
7777:7777
OU812:OU812
a:a
absolut:absolut
alaska:alaska
alexis:alexis
alice:alice
animal:animal
apples:apples
babylon5:babylon5
backup:backup
barbara:barbara
benjamin:benjamin
bill:bill
billy:billy
bird33:bird33
blue:blue
bluebird:bluebird
bobby:bobby
bonnie:bonnie
bubba:bubba
camera:camera
chocolate:chocolate
clark:clark
claudia:claudia
cocacola:cocacola
compton:compton
connect:connect
cookie:cookie
cruise:cruise
deliver:deliver
douglas:douglas
dreamer:dreamer
dreams:dreams
duckie:duckie
eagles:eagles
eddie:eddie
einstein:einstein
enter:enter
explorer:explorer
faith:faith
family:family
ferrari:ferrari
fire:fire
flamingo:flamingo
flip:flip
flower:flower
foxtrot:foxtrot
francis:francis
freddy:freddy
friday:friday
froggy:froggy
galileo:galileo
giants:giants
gizmo:gizmo
global:global
goofy:goofy
gopher:gopher
hansolo:hansolo
happy1:happy1
hendrix:hendrix
henry:henry
herman:herman
homer:homer
honey:honey
house:house
houston:houston
iguana:iguana
indiana:indiana
insane:insane
inside:inside
irish:irish
ironman:ironman
jake:jake
jane:jane
jasmin:jasmin
jeanne:jeanne
jerry:jerry
jim:jim
joey:joey
justice:justice
katherine:katherine
kermit:kermit
kitty:kitty
koala:koala
larry:larry
leslie:leslie
logan:logan
lucky:lucky
mark:mark
martin:martin
matt:matt
minnie:minnie
misty:misty
mitch:mitch
mom:mom
mouse:mouse
nancy:nancy
nascar:nascar
nelson:nelson
netware:netware
pantera:pantera
parker:parker
passwd:passwd
penguin:penguin
peter:peter
phil:phil
phish:phish
piano:piano
pizza:pizza
porsche911:porsche911
prince:prince
punkin:punkin
pyramid:pyramid
rain:rain
raymond:raymond
red:red
robin:robin
roger:roger
rosebud:rosebud
route66:route66
royal:royal
running:running
sadie:sadie
sasha:sasha
security:security
sergei:sergei
sheena:sheena
sheila:sheila
skiing:skiing
snapple:snapple
snowball:snowball
sparrow:sparrow
spencer:spencer
spike:spike
star:star
stealth:stealth
student:student
sun:sun
sunny:sunny
sylvia:sylvia
tamara:tamara
taurus:taurus
tech:tech
teresa:teresa
theresa:theresa
thunderbird:thunderbird
tigers:tigers
tony:tony
toyota:toyota
training:training
travel:travel
truck:truck
tuesday:tuesday
victory:victory
video:video
viper1:viper1
volvo:volvo
wesley:wesley
whisky:whisky
winnie:winnie
winter:winter
wolves:wolves
xyz123:xyz123
zorro:zorro
!@#$%:!@#$%
007:007
123123:123123
1234567:1234567
1969:1969
5683:5683
696969:696969
888888:888888
Anthony:Anthony
Bond007:Bond007
Friday:Friday
Hendrix:Hendrix
Joshua:Joshua
Matthew:Matthew
October:October
Taurus:Taurus
Tigger:Tigger
aaa:aaa
aaron:aaron
abby:abby
abcdef:abcdef
adidas:adidas
adrian:adrian
alexandr:alexandr
alfred:alfred
arthur:arthur
athena:athena
austin:austin
awesome:awesome
badger:badger
bamboo:bamboo
beagle:beagle
bears:bears
beatles:beatles
beautiful:beautiful
beaver:beaver
benny:benny
bigmac:bigmac
bingo:bingo
bitch:bitch
blonde:blonde
boogie:boogie
boston:boston
brenda:brenda
bright:bright
bubba1:bubba1
bubbles:bubbles
buffy:buffy
button:button
buttons:buttons
cactus:cactus
candy:candy
captain:captain
carlos:carlos
caroline:caroline
carrie:carrie
casper:casper
catalog:catalog
catch22:catch22
challenge:challenge
chance:chance
charity:charity
charlotte:charlotte
cheese:cheese
cheryl:cheryl
chloe:chloe
chris1:chris1
clancy:clancy
clipper:clipper
coltrane:coltrane
compaq:compaq
conrad:conrad
cooper:cooper
cooter:cooter
copper:copper
cosmos:cosmos
cougar:cougar
cracker:cracker
crawford:crawford
crystal:crystal
curtis:curtis
cyclone:cyclone
cyrano:cyrano
dan:dan
dance:dance
dawn:dawn
dean:dean
deutsch:deutsch
diablo:diablo
dilbert:dilbert
dollars:dollars
dookie:dookie
doom:doom
dumbass:dumbass
dundee:dundee
e-mail:e-mail
elizabeth:elizabeth
eric:eric
europe:europe
export:export
farmer:farmer
firebird:firebird
fletcher:fletcher
fluffy:fluffy
ford:ford
fountain:fountain
fox:fox
france:france
freak1:freak1
friends:friends
frog:frog
fuckoff:fuckoff
gabriel:gabriel
gabriell:gabriell
galaxy:galaxy
gambit:gambit
garden:garden
garfield:garfield
garlic:garlic
garnet:garnet
genesis:genesis
genius:genius
godzilla:godzilla
goforit:goforit
golfer:golfer
goober:goober
grace:grace
grateful:grateful
greenday:greenday
groovy:groovy
grover:grover
guitar:guitar
hacker:hacker
harry:harry
hazel:hazel
hector:hector
herbert:herbert
hoops:hoops
horizon:horizon
hornet:hornet
howard:howard
icecream:icecream
imagine:imagine
impala:impala
informix:informix
jack:jack
janice:janice
jasmine:jasmine
jason1:jason1
jeanette:jeanette
jeffrey:jeffrey
jenifer:jenifer
jenni:jenni
jesus1:jesus1
jewels:jewels
joker:joker
julie:julie
julie1:julie1
junior:junior
justin1:justin1
kathleen:kathleen
keith:keith
kelly:kelly
kelly1:kelly1
kennedy:kennedy
kevin1:kevin1
knicks:knicks
lady:lady
larry1:larry1
ledzep:ledzep
lee:lee
leonard:leonard
lestat:lestat
library:library
lincoln:lincoln
lionking:lionking
london:london
louise:louise
lucky1:lucky1
lucy:lucy
maddog:maddog
mailman:mailman
majordomo:majordomo
mantra:mantra
margaret:margaret
mariposa:mariposa
market:market
marlboro:marlboro
martin1:martin1
marty:marty
master1:master1
mazda1:mazda1
mensuck:mensuck
mercedes:mercedes
metal:metal
metallic:metallic
midori:midori
mikey:mikey
millie:millie
mirage:mirage
mmm:mmm
molly:molly
monet:monet
money1:money1
monica:monica
monopoly:monopoly
mookie:mookie
moose:moose
moroni:moroni
music:music
naomi:naomi
nathan:nathan
ncc1701e:ncc1701e
nesbitt:nesbitt
news:news
nguyen:nguyen
nicholas:nicholas
nicole:nicole
nimrod:nimrod
october:october
olive:olive
olivia:olivia
one:one
online:online
open:open
oscar:oscar
oxford:oxford
pacific:pacific
painter:painter
peaches:peaches
penelope:penelope
pepsi:pepsi
pete:pete
petunia:petunia
philip:philip
phoenix1:phoenix1
photo:photo
pickle:pickle
player:player
poiuyt:poiuyt
porsche:porsche
porter:porter
ppp:ppp
puppy:puppy
python:python
quality:quality
quest:quest
raquel:raquel
raven:raven
remember:remember
republic:republic
research:research
robbie:robbie
robert1:robert1
roman:roman
rugby:rugby
runner:runner
russell:russell
ryan:ryan
sailing:sailing
sailor:sailor
samantha:samantha
savage:savage
sbdc:sbdc
scarlett:scarlett
school:school
sean:sean
seven:seven
shadow1:shadow1
sheba:sheba
shelby:shelby
shit:shit
shoes:shoes
simba:simba
simple:simple
skipper:skipper
smiley:smiley
snake:snake
snickers:snickers
sniper:sniper
snoopdog:snoopdog
snowman:snowman
sonic:sonic
spitfire:spitfire
sprite:sprite
spunky:spunky
starwars:starwars
station:station
stella:stella
stingray:stingray
storm:storm
stormy:stormy
stupid:stupid
sumuinen:sumuinen
sunny1:sunny1
sunrise:sunrise
supra:supra
surfer:surfer
susan:susan
tammy:tammy
tango:tango
tanya:tanya
tara:tara
teddy1:teddy1
temp:temp
testing:testing
theboss:theboss
theking:theking
thumper:thumper
tina:tina
tintin:tintin
tomcat:tomcat
trebor:trebor
trek:trek
trevor:trevor
tweety:tweety
unicorn:unicorn
valentine:valentine
valerie:valerie
vanilla:vanilla
veronica:veronica
victor:victor
vincent:vincent
viper:viper
warrior:warrior
warriors:warriors
weasel:weasel
wheels:wheels
wilbur:wilbur
winston:winston
wisdom:wisdom
wombat:wombat
xanadu:xanadu
xavier:xavier
xxxx:xxxx
yellow:yellow
zaphod:zaphod
zeppelin:zeppelin
zeus:zeus
!@#$%^:!@#$%^
!@#$%^&*:!@#$%^&*
*:*
0007:0007
1022:1022
10sne1:10sne1
1111:1111
1212:1212
1911:1911
1948:1948
1973:1973
1978:1978
1996:1996
1p2o3i:1p2o3i
2000:2000
2222:2222
3bears:3bears
5252:5252
Andrew:Andrew
Broadway:Broadway
Champs:Champs
Family:Family
Fisher:Fisher
Friends:Friends
Jeanne:Jeanne
Killer:Killer
Knight:Knight
Master:Master
Michael:Michael
Michelle:Michelle
Pentium:Pentium
Pepper:Pepper
Raistlin:Raistlin
Sierra:Sierra
Snoopy:Snoopy
Tennis:Tennis
Tuesday:Tuesday
abacab:abacab
abcd:abcd
abcd1234:abcd1234
abcdefg:abcdefg
abigail:abigail
account:account
ace:ace
acropolis:acropolis
adam:adam
adi:adi
alex1:alex1
alice1:alice1
allison:allison
alpine:alpine
amy:amy
anders:anders
andre1:andre1
andrea1:andrea1
angel1:angel1
anita:anita
annette:annette
antares:antares
apache:apache
apollo:apollo
aragorn:aragorn
arizona:arizona
arnold:arnold
arsenal:arsenal
asdfasdf:asdfasdf
asdfg:asdfg
asdfghjk:asdfghjk
avenger:avenger
avenir:avenir
baby:baby
babydoll:babydoll
bach:bach
bailey:bailey
banana:banana
barry:barry
basil:basil
basket:basket
bass:bass
batman1:batman1
beaner:beaner
beast:beast
beatrice:beatrice
beer:beer
bella:bella
ben:ben
bertha:bertha
bigben:bigben
bigdog:bigdog
biggles:biggles
bigman:bigman
binky:binky
biology:biology
bishop:bishop
bliss:bliss
blondie:blondie
blowfish:blowfish
bluefish:bluefish
bmw:bmw
bobcat:bobcat
bosco:bosco
boss:boss
braves:braves
brazil:brazil
bridges:bridges
bruce:bruce
bruno:bruno
brutus:brutus
buck:buck
buffalo:buffalo
bugsy:bugsy
bull:bull
bulldog:bulldog
bullet:bullet
bullshit:bullshit
bunny:bunny
business:business
butch:butch
butler:butler
butter:butter
california:california
cannondale:cannondale
canon:canon
carebear:carebear
carol:carol
carol1:carol1
carole:carole
cassie:cassie
castle:castle
catalina:catalina
catherine:catherine
catnip:catnip
cccccc:cccccc
celine:celine
center:center
champion:champion
chanel:chanel
chaos:chaos
chelsea1:chelsea1
chester1:chester1
chicago:chicago
chico:chico
chip:chip
christian:christian
christy:christy
church:church
cinder:cinder
civil:civil
colleen:colleen
colorado:colorado
columbia:columbia
commander:commander
connie:connie
content:content
cook:cook
cookies:cookies
cooking:cooking
cordelia:cordelia
corona:corona
cowboys:cowboys
coyote:coyote
crack1:crack1
craig:craig
creative:creative
crow:crow
cuddles:cuddles
cuervo:cuervo
cutie:cutie
cyber:cyber
daddy:daddy
daisie:daisie
daisy:daisy
daniel1:daniel1
danielle:danielle
dark1:dark1
database:database
davids:davids
deadhead:deadhead
death:death
denali:denali
denis:denis
depeche:depeche
derek:derek
design:design
destiny:destiny
diana:diana
diane:diane
dickens:dickens
dickhead:dickhead
digger:digger
dodger:dodger
don:don
donna:donna
dougie:dougie
draft:draft
dragonfly:dragonfly
dylan:dylan
eagle:eagle
eclipse:eclipse
electric:electric
emerald:emerald
emmitt:emmitt
entropy:entropy
etoile:etoile
excalibur:excalibur
express:express
farout:farout
farside:farside
feedback:feedback
fender:fender
fidel:fidel
fiona:fiona
fireman:fireman
firenze:firenze
fish1:fish1
flash:flash
fletch:fletch
florida:florida
flowers:flowers
fool:fool
foster:foster
fozzie:fozzie
francesco:francesco
francine:francine
francois:francois
frank:frank
french:french
fuckface:fuckface
fun:fun
gargoyle:gargoyle
gasman:gasman
gemini:gemini
general:general
gerald:gerald
germany:germany
gilbert:gilbert
goaway:goaway
gold:gold
golden:golden
goldfish:goldfish
goose:goose
gordon:gordon
graham:graham
grant:grant
graphic:graphic
gregory:gregory
gretchen:gretchen
gunner:gunner
hal9000:hal9000
hannah:hannah
harold:harold
harrison:harrison
harvey:harvey
hawkeye:hawkeye
heaven:heaven
heidi:heidi
helen:helen
helena:helena
hell:hell
herzog:herzog
hithere:hithere
hobbit:hobbit
huey:huey
ibanez:ibanez
idontknow:idontknow
image:image
integra:integra
intern:intern
intrepid:intrepid
ireland:ireland
irene:irene
isaac:isaac
isabel:isabel
jackie:jackie
jackson:jackson
jaguar:jaguar
jamaica:jamaica
japan:japan
jeff:jeff
jenny1:jenny1
jessie:jessie
jethrotull:jethrotull
jkl123:jkl123
joel:joel
johan:johan
johanna1:johanna1
johnny:johnny
joker1:joker1
jordan23:jordan23
judith:judith
julia:julia
jumanji:jumanji
jussi:jussi
kangaroo:kangaroo
karen1:karen1
kathy:kathy
keepout:keepout
keith1:keith1
kenneth:kenneth
kidder:kidder
kim:kim
kimberly:kimberly
king:king
kingdom:kingdom
kirk:kirk
kitkat:kitkat
kramer:kramer
kris:kris
kristen:kristen
lambda:lambda
laura:laura
laurie:laurie
law:law
lawrence:lawrence
lawyer:lawyer
legend:legend
leon:leon
liberty:liberty
light:light
lindsay:lindsay
lindsey:lindsey
lisa:lisa
liverpool:liverpool
logical:logical
lola:lola
lonely:lonely
lorrie:lorrie
louis:louis
lovely:lovely
loveme:loveme
lucas:lucas
m:m
madonna:madonna
mail:mail
major:major
malcolm:malcolm
malibu:malibu
marathon:marathon
marcel:marcel
maria1:maria1
mariah:mariah
mariah1:mariah1
marilyn:marilyn
mariner:mariner
mario:mario
mark1:mark1
marvin:marvin
maurice:maurice
max:max
maxine:maxine
maxwell:maxwell
me:me
media:media
meggie:meggie
melanie:melanie
melissa:melissa
melody:melody
merlot:merlot
mexico:mexico
michael1:michael1
michele:michele
midnight:midnight
midway:midway
mike1:mike1
miki:miki
mine:mine
miracle:miracle
misha:misha
mishka:mishka
mmouse:mmouse
molly1:molly1
monique:monique
montreal:montreal
moocow:moocow
moon:moon
moore:moore
mopar:mopar
morris:morris
mort:mort
mortimer:mortimer
mouse1:mouse1
mulder:mulder
nautica:nautica
nellie:nellie
nermal:nermal
new:new
newton:newton
nicarao:nicarao
nick:nick
nina:nina
nirvana1:nirvana1
nissan:nissan
norman:norman
notebook:notebook
ocean:ocean
olivier:olivier
ollie:ollie
olsen:olsen
opera:opera
opus:opus
oranges:oranges
oregon:oregon
orion:orion
overkill:overkill
pacers:pacers
packer:packer
panda:panda
pandora:pandora
panther:panther
passion:passion
patricia:patricia
pearl:pearl
peewee:peewee
pencil:pencil
penny:penny
people:people
percy:percy
person:person
peter1:peter1
petey:petey
picard:picard
picasso:picasso
pierre:pierre
pinkfloyd:pinkfloyd
pit:pit
plus:plus
polar:polar
polaris:polaris
police:police
polo:polo
pookie1:pookie1
poppy:poppy
power:power
predator:predator
preston:preston
primus:primus
prometheus:prometheus
public:public
q1w2e3:q1w2e3
queen:queen
queenie:queenie
quentin:quentin
radio:radio
ralph:ralph
random:random
rangers:rangers
raptor:raptor
rastafarian:rastafarian
reality:reality
redrum:redrum
remote:remote
reptile:reptile
reynolds:reynolds
rhonda:rhonda
ricardo:ricardo
ricardo1:ricardo1
ricky:ricky
river:river
roadrunner:roadrunner
rob:rob
robinhood:robinhood
robotech:robotech
rocknroll:rocknroll
rocky1:rocky1
rodeo:rodeo
rolex:rolex
ronald:ronald
rouge:rouge
roxy:roxy
roy:roy
ruby:ruby
ruthie:ruthie
sabrina:sabrina
sakura:sakura
salasana:salasana
sally:sally
sampson:sampson
samuel:samuel
sandra:sandra
santa:santa
sapphire:sapphire
scarecrow:scarecrow
scarlet:scarlet
scorpio:scorpio
scott1:scott1
scottie:scottie
scout:scout
scruffy:scruffy
scuba1:scuba1
seattle:seattle
serena:serena
sergey:sergey
shanti:shanti
shark:shark
shogun:shogun
simon:simon
singer:singer
skibum:skibum
skull:skull
skunk:skunk
skywalker:skywalker
slacker:slacker
smashing:smashing
smiles:smiles
snowflake:snowflake
snowski:snowski
snuffy:snuffy
soccer1:soccer1
soleil:soleil
sonny:sonny
sound:sound
spanky:spanky
speedy:speedy
spider:spider
spooky:spooky
stacey:stacey
star69:star69
start:start
starter:starter
steven1:steven1
sting1:sting1
stinky:stinky
strawberry:strawberry
stuart:stuart
sugar:sugar
sunbird:sunbird
sundance:sundance
superfly:superfly
suzanne:suzanne
suzuki:suzuki
swimmer:swimmer
swimming:swimming
system:system
taffy:taffy
tarzan:tarzan
tbird:tbird
teddy:teddy
teddybear:teddybear
teflon:teflon
temporal:temporal
terminal:terminal
terry:terry
the:the
theatre:theatre
thejudge:thejudge
thunder:thunder
thursday:thursday
time:time
tinker:tinker
toby:toby
today:today
tokyo:tokyo
tootsie:tootsie
tornado:tornado
tracy:tracy
tree:tree
tricia:tricia
trident:trident
trojan:trojan
trout:trout
truman:truman
trumpet:trumpet
tucker:tucker
turtle:turtle
tyler:tyler
utopia:utopia
vader:vader
val:val
valhalla:valhalla
visa:visa
voyager:voyager
warcraft:warcraft
warlock:warlock
warren:warren
water:water
wayne:wayne
wendy:wendy
williams:williams
willy:willy
win95:win95
windsurf:windsurf
winona:winona
wolf:wolf
wolf1:wolf1
woody:woody
woofwoof:woofwoof
wrangler:wrangler
wright:wright
www:www
xcountry:xcountry
xfiles:xfiles
xxxxxx:xxxxxx
y:y
yankees:yankees
yoda:yoda
yukon:yukon
yvonne:yvonne
zebra:zebra
zenith:zenith
zigzag:zigzag
zombie:zombie
zxc123:zxc123
zxcvb:zxcvb
zzz:zzz
000000:000000
007007:007007
11111:11111
11111111:11111111
1213:1213
1214:1214
1225:1225
123321:123321
1313:1313
1316:1316
1332:1332
1412:1412
1430:1430
171717:171717
1818:1818
181818:181818
1950:1950
1952:1952
1953:1953
1955:1955
1956:1956
1960:1960
1964:1964
1975:1975
1977:1977
1991:1991
1a2b3c:1a2b3c
1chris:1chris
1kitty:1kitty
1qw23e:1qw23e
2001:2001
2020:2020
2112:2112
22:22
2200:2200
2252:2252
2kids:2kids
3010:3010
3112:3112
3141:3141
333:333
3533:3533
4055:4055
4444:4444
4788:4788
4854:4854
4runner:4runner
5050:5050
5121:5121
54321:54321
55555:55555
57chevy:57chevy
6262:6262
6301:6301
6969:6969
7777777:7777777
789456:789456
7dwarfs:7dwarfs
88888888:88888888
Abcdefg:Abcdefg
Alexis:Alexis
Alpha:Alpha
Animals:Animals
Ariel:Ariel
BOSS:BOSS
Bailey:Bailey
Bastard:Bastard
Beavis:Beavis
Bismillah:Bismillah
Bonzo:Bonzo
Booboo:Booboo
Boston:Boston
Canucks:Canucks
Cardinal:Cardinal
Carol:Carol
Celtics:Celtics
ChangeMe:ChangeMe
Charlie:Charlie
Chris:Chris
Computer:Computer
Cougar:Cougar
Creative:Creative
Curtis:Curtis
Daniel:Daniel
Darkman:Darkman
Denise:Denise
Dragon:Dragon
Eagles:Eagles
Elizabeth:Elizabeth
Esther:Esther
Figaro:Figaro
Fishing:Fishing
Fortune:Fortune
Freddy:Freddy
Front242:Front242
Gandalf:Gandalf
Geronimo:Geronimo
Gingers:Gingers
Golden:Golden
Goober:Goober
Gretel:Gretel
HARLEY:HARLEY
Hacker:Hacker
Hammer:Hammer
Harley:Harley
Heather:Heather
Henry:Henry
Hershey:Hershey
Homer:Homer
Jackson:Jackson
Janet:Janet
Jennifer:Jennifer
Jersey:Jersey
Jessica:Jessica
Joanna:Joanna
Johnson:Johnson
Jordan:Jordan
KILLER:KILLER
Katie:Katie
Kitten:Kitten
Liberty:Liberty
Lindsay:Lindsay
Lizard:Lizard
Madeline:Madeline
Margaret:Margaret
Maxwell:Maxwell
Mellon:Mellon
Merlot:Merlot
Metallic:Metallic
Michel1:Michel1
Money:Money
Monster:Monster
Montreal:Montreal
Newton:Newton
Nicholas:Nicholas
Noriko:Noriko
Paladin:Paladin
Pamela:Pamela
Password:Password
Peaches:Peaches
Peanuts:Peanuts
Peter:Peter
Phoenix:Phoenix
Piglet:Piglet
Pookie:Pookie
Princess:Princess
Purple:Purple
Rabbit:Rabbit
Raiders:Raiders
Random:Random
Rebecca:Rebecca
Robert:Robert
Russell:Russell
Sammy:Sammy
Saturn:Saturn
Service:Service
Shadow:Shadow
Sidekick:Sidekick
Skeeter:Skeeter
Smokey:Smokey
Sparky:Sparky
Speedy:Speedy
Sterling:Sterling
Steven:Steven
Summer:Summer
Sunshine:Sunshine
Superman:Superman
Sverige:Sverige
Swoosh:Swoosh
Taylor:Taylor
Theresa:Theresa
Thomas:Thomas
Thunder:Thunder
Vernon:Vernon
Victoria:Victoria
Vincent:Vincent
Waterloo:Waterloo
Webster:Webster
Willow:Willow
Winnie:Winnie
Wolverine:Wolverine
Woodrow:Woodrow
World:World
aa:aa
aaaa:aaaa
aardvark:aardvark
abbott:abbott
abcd123:abcd123
abcde:abcde
accord:accord
active:active
acura:acura
adg:adg
admin:admin
admin1:admin1
adrock:adrock
aerobics:aerobics
africa:africa
agent:agent
airborne:airborne
airwolf:airwolf
aki123:aki123
alfaro:alfaro
ali:ali
alicia:alicia
alien:alien
aliens:aliens
alina:alina
aline:aline
alison:alison
allegro:allegro
allen:allen
allstate:allstate
aloha:aloha
alpha1:alpha1
altamira:altamira
althea:althea
altima:altima
altima1:altima1
amanda1:amanda1
amazing:amazing
america:america
amour:amour
anderson:anderson
andre:andre
andrew!:andrew!
andrew1:andrew1
andromed:andromed
angels:angels
angie1:angie1
ann:ann
anne:anne
anneli:anneli
annie:annie
anything:anything
apple1:apple1
apple2:apple2
applepie:applepie
april:april
aptiva:aptiva
aqua:aqua
aquarius:aquarius
ariane:ariane
ariel:ariel
arlene:arlene
arrow:arrow
artemis:artemis
asdf1234:asdf1234
asdf;lkj:asdf;lkj
asdfjkl:asdfjkl
ashley1:ashley1
ashraf:ashraf
ashton:ashton
assmunch:assmunch
asterix:asterix
attila:attila
autumn:autumn
avatar:avatar
ayelet:ayelet
aylmer:aylmer
babes:babes
bambi:bambi
baraka:baraka
barbie:barbie
barn:barn
barney1:barney1
barnyard:barnyard
barrett:barrett
bart:bart
bartman:bartman
bball:bball
beaches:beaches
beanie:beanie
beans:beans
beasty:beasty
beauty:beauty
beavis1:beavis1
bebe:bebe
becca:becca
belgium:belgium
belize:belize
belle:belle
belmont:belmont
benji:benji
benson:benson
beowulf:beowulf
bernardo:bernardo
berry:berry
beryl:beryl
best:best
beta:beta
betacam:betacam
betsy:betsy
betty:betty
bharat:bharat
bichon:bichon
bigal:bigal
bigboss:bigboss
bigred:bigred
biker:biker
bilbo:bilbo
bills:bills
billy1:billy1
bimmer:bimmer
bioboy:bioboy
biochem:biochem
birdie:birdie
birdy:birdy
birthday:birthday
biscuit:biscuit
bitter:bitter
biz:biz
blackjack:blackjack
blah:blah
blanche:blanche
blinds:blinds
blitz:blitz
blood:blood
blowjob:blowjob
blowme:blowme
blueeyes:blueeyes
bluejean:bluejean
blues:blues
boat:boat
bogart:bogart
bogey:bogey
bogus:bogus
bombay:bombay
boobie:boobie
boots:boots
bootsie:bootsie
boulder:boulder
bourbon:bourbon
boxer:boxer
boxers:boxers
bozo:bozo
brain:brain
branch:branch
brandi:brandi
brent:brent
brewster:brewster
bridge:bridge
britain:britain
broker:broker
bronco:bronco
bronte:bronte
brooke:brooke
brother:brother
bryan:bryan
bubble:bubble
bucks:bucks
buddha:buddha
budgie:budgie
buffett:buffett
bugs:bugs
bulls:bulls
burns:burns
burton:burton
butterfly:butterfly
buzz:buzz
byron:byron
c00per:c00per
calendar:calendar
calgary:calgary
calvin1:calvin1
camay:camay
camel:camel
camille:camille
campbell:campbell
camping:camping
cancer:cancer
canela:canela
cannon:cannon
car:car
carbon:carbon
carl:carl
carnage:carnage
carolyn:carolyn
carrot:carrot
cascade:cascade
cat:cat
catfish:catfish
cathy:cathy
catwoman:catwoman
cecile:cecile
celica:celica
cement:cement
cessna:cessna
chad:chad
chainsaw:chainsaw
chameleon:chameleon
chang:chang
change:change
chantal:chantal
charger:charger
chat:chat
cherry:cherry
chess:chess
chiara:chiara
chiefs:chiefs
china:china
chinacat:chinacat
chinook:chinook
chouette:chouette
chris123:chris123
christ1:christ1
christmas:christmas
christopher:christopher
chronos:chronos
chuck:chuck
cicero:cicero
cindy1:cindy1
cinema:cinema
circuit:circuit
cirque:cirque
cirrus:cirrus
civic:civic
clapton:clapton
clarkson:clarkson
class:class
claude:claude
claudel:claudel
cleo:cleo
cliff:cliff
clock:clock
clueless:clueless
cobain:cobain
cobra:cobra
cody:cody
colette:colette
college:college
color:color
colors:colors
colt45:colt45
comet:comet
concept:concept
concorde:concorde
confused:confused
cool:cool
coolbean:coolbean
cora:cora
corky:corky
cornflake:cornflake
corvette:corvette
corwin:corwin
cosmo:cosmo
country:country
courier:courier
cows:cows
crescent:crescent
cross:cross
crowley:crowley
crusader:crusader
cthulhu:cthulhu
cuda:cuda
cunningham:cunningham
cunt:cunt
cupcake:cupcake
current:current
cutlass:cutlass
cynthia:cynthia
daedalus:daedalus
dagger:dagger
dagger1:dagger1
daily:daily
dale:dale
dammit:dammit
damogran:damogran
dana:dana
dancer:dancer
daphne:daphne
darkstar:darkstar
darren:darren
darryl:darryl
darwin:darwin
data1:data1
datatrain:datatrain
daytek:daytek
dead:dead
deborah:deborah
december:december
decker:decker
deedee:deedee
deeznuts:deeznuts
def:def
delano:delano
delete:delete
demon:demon
denise:denise
denny:denny
desert:desert
deskjet:deskjet
detroit:detroit
devil:devil
devine:devine
devon:devon
dexter:dexter
dharma:dharma
dianne:dianne
diesel:diesel
dillweed:dillweed
dim:dim
dipper:dipper
director:director
disco:disco
dixie:dixie
dixon:dixon
doc:doc
dodgers:dodgers
dogbert:dogbert
doggy:doggy
doitnow:doitnow
dollar:dollar
dolly:dolly
dominique:dominique
domino:domino
dontknow:dontknow
doogie:doogie
doors:doors
dork:dork
doudou:doudou
doug:doug
downtown:downtown
dragon1:dragon1
driver:driver
dude:dude
dudley:dudley
dutch:dutch
dutchess:dutchess
dwight:dwight
eagle1:eagle1
easter:easter
eastern:eastern
edith:edith
edmund:edmund
effie:effie
eieio:eieio
eight:eight
element:element
elina1:elina1
elissa:elissa
ella:ella
ellen:ellen
elliot:elliot
elsie:elsie
empire:empire
engage:engage
enigma:enigma
enterprise:enterprise
eric1:eric1
erin:erin
ernie1:ernie1
escort:escort
escort1:escort1
estelle:estelle
eugene:eugene
evelyn:evelyn
excel:excel
explore:explore
eyal:eyal
faculty:faculty
fairview:fairview
family1:family1
fatboy:fatboy
faust:faust
felipe:felipe
fenris:fenris
ferguson:ferguson
ferret:ferret
ferris:ferris
finance:finance
fireball:fireball
first:first
fishes:fishes
fishhead:fishhead
fishie:fishie
flanders:flanders
fleurs:fleurs
flight:flight
florida1:florida1
flowerpot:flowerpot
flute:flute
fly:fly
flyboy:flyboy
flyer:flyer
forward:forward
franka:franka
freddie:freddie
frederic:frederic
free:free
freebird:freebird
freeman:freeman
frisco:frisco
fritz:fritz
froggie:froggie
froggies:froggies
frogs:frogs
front242:front242
frontier:frontier
fucku:fucku
fugazi:fugazi
funguy:funguy
funtime:funtime
future:future
fuzz:fuzz
gabby:gabby
gaby:gaby
gaelic:gaelic
gambler:gambler
games:games
gammaphi:gammaphi
garcia:garcia
garfunkel:garfunkel
garth:garth
gary:gary
gaston:gaston
gateway:gateway
gateway2:gateway2
gator1:gator1
george1:george1
georgia:georgia
german:german
germany1:germany1
getout:getout
ggeorge:ggeorge
ghost:ghost
gibbons:gibbons
gibson:gibson
gigi:gigi
gilgamesh:gilgamesh
giselle:giselle
glider1:glider1
gmoney:gmoney
goat:goat
goblin:goblin
goblue:goblue
godiva:godiva
goethe:goethe
gofish:gofish
gollum:gollum
gone:gone
good:good
gramps:gramps
grandma:grandma
gravis:gravis
gray:gray
greed:greed
greg:greg
greg1:greg1
gremlin:gremlin
greta:greta
gretzky:gretzky
grizzly:grizzly
grumpy:grumpy
guess:guess
guido:guido
guitar1:guitar1
gumby:gumby
gustavo:gustavo
h2opolo:h2opolo
haggis:haggis
haha:haha
hailey:hailey
hal:hal
halloween:halloween
hallowell:hallowell
hamid:hamid
hamilton:hamilton
hamlet:hamlet
hank:hank
hanna:hanna
hanson:hanson
happy123:happy123
happyday:happyday
hardcore:hardcore
harley1:harley1
haro:haro
harriet:harriet
harris:harris
harvard:harvard
hawk:hawk
hawkeye1:hawkeye1
health:health
health1:health1
heart:heart
heather1:heather1
heather2:heather2
hedgehog:hedgehog
heikki:heikki
helene:helene
hello1:hello1
hello123:hello123
hello8:hello8
hellohello:hellohello
help123:help123
helper:helper
hermes:hermes
heythere:heythere
highland:highland
hilda:hilda
hillary:hillary
histoire:histoire
history:history
hitler:hitler
hobbes:hobbes
holiday:holiday
holly:holly
homerj:homerj
honda1:honda1
hongkong:hongkong
hoosier:hoosier
hootie:hootie
hope:hope
horse:horse
hosehead:hosehead
hotrod:hotrod
huang:huang
hudson:hudson
hugh:hugh
hugo:hugo
hummer:hummer
huskies:huskies
hydrogen:hydrogen
i:i
ib6ub9:ib6ub9
idiot:idiot
if6was9:if6was9
iforget:iforget
ilmari:ilmari
iloveu:iloveu
impact:impact
indonesia:indonesia
ingvar:ingvar
insight:insight
instruct:instruct
integral:integral
iomega:iomega
irina:irina
iris:iris
irmeli:irmeli
isabelle:isabelle
israel:israel
italia:italia
italy:italy
izzy:izzy
j0ker:j0ker
j1l2t3:j1l2t3
jackie1:jackie1
jacob:jacob
jakey:jakey
james1:james1
jamesbond:jamesbond
jamie:jamie
jamjam:jamjam
jan:jan
jazz:jazz
jean:jean
jedi:jedi
jeepster:jeepster
jeffrey1:jeffrey1
jennie:jennie
jenny:jenny
jensen:jensen
jer:jer
jesse:jesse
jesse1:jesse1
jester:jester
jethro:jethro
jetta1:jetta1
jimbob:jimbob
jimi:jimi
jimmy:jimmy
joanie:joanie
joanna:joanna
joelle:joelle
john316:john316
jordie:jordie
jorge:jorge
josee:josee
josh:josh
journey:journey
joy:joy
joyce:joyce
jubilee:jubilee
juhani:juhani
jules:jules
julia2:julia2
julien:julien
juliet:juliet
jumbo:jumbo
jump:jump
junebug:junebug
juniper:juniper
justdoit:justdoit
justice4:justice4
kalamazo:kalamazo
kali:kali
karin:karin
karine:karine
karma:karma
kat:kat
kate:kate
katerina:katerina
katie:katie
katie1:katie1
kayla:kayla
kcin:kcin
keeper:keeper
keller:keller
kendall:kendall
kenny:kenny
kerala:kerala
kerrya:kerrya
ketchup:ketchup
khan:khan
kids:kids
kings:kings
kissa2:kissa2
kissme:kissme
kitten:kitten
kittycat:kittycat
kiwi:kiwi
kkkkkk:kkkkkk
kleenex:kleenex
kombat:kombat
kristi:kristi
kristine:kristine
lab1:lab1
labtec:labtec
laddie:laddie
ladybug:ladybug
lamer:lamer
lance:lance
laser:laser
laserjet:laserjet
lassie1:lassie1
laurel:laurel
lawson:lawson
leader:leader
leaf:leaf
leblanc:leblanc
legal:legal
leland:leland
lemon:lemon
leo:leo
lester:lester
letter:letter
letters:letters
lev:lev
lexus1:lexus1
libra:libra
life:life
lights:lights
lima:lima
lionel:lionel
lions:lions
lissabon:lissabon
little:little
liz:liz
lizzy:lizzy
logger:logger
logos:logos
loislane:loislane
loki:loki
lolita:lolita
lonestar:lonestar
longer:longer
longhorn:longhorn
looney:looney
loren:loren
lori:lori
lorna:lorna
loser:loser
lost:lost
lotus:lotus
lou:lou
lovers:lovers
loveyou:loveyou
lucia:lucia
lucifer:lucifer
lucky14:lucky14
macha:macha
macross:macross
macse30:macse30
maddie:maddie
madmax:madmax
madoka:madoka
magic1:magic1
magnum:magnum
maiden:maiden
maine:maine
makeitso:makeitso
mallard:mallard
manageme:manageme
manson:manson
manuel:manuel
marc:marc
marcus:marcus
maria:maria
marielle:marielle
marine:marine
marino:marino
marshall:marshall
mart:mart
martha:martha
math:math
matti1:matti1
mattingly:mattingly
maxmax:maxmax
meatloaf:meatloaf
mech:mech
mechanic:mechanic
medical:medical
megan:megan
meister:meister
melina:melina
memphis:memphis
mercer:mercer
merde:merde
mermaid:mermaid
merrill:merrill
miami:miami
michal:michal
michel:michel
michigan:michigan
michou:michou
mickel:mickel
mickey1:mickey1
microsoft:microsoft
midvale:midvale
mikael:mikael
milano:milano
miles:miles
millenium:millenium
million:million
minou:minou
miranda:miranda
miriam:miriam
mission:mission
mmmmmm:mmmmmm
mobile:mobile
mobydick:mobydick
modem:modem
mojo:mojo
monkey1:monkey1
monroe:monroe
montana:montana
montana3:montana3
montrose:montrose
monty:monty
moomoo:moomoo
moonbeam:moonbeam
morecats:morecats
morpheus:morpheus
motor:motor
motorola:motorola
movies:movies
mowgli:mowgli
mozart:mozart
mulder1:mulder1
munchkin:munchkin
murray:murray
muscle:muscle
mustang1:mustang1
nadia:nadia
nadine:nadine
napoleon:napoleon
nation:nation
national:national
neil:neil
neko:neko
nesbit:nesbit
nestle:nestle
neutrino:neutrino
newaccount:newaccount
newlife:newlife
newyork1:newyork1
nexus6:nexus6
nichole:nichole
nicklaus:nicklaus
nightshadow:nightshadow
nightwind:nightwind
nike:nike
nikita:nikita
nikki:nikki
nintendo:nintendo
nisse:nisse
nokia:nokia
nomore:nomore
none1:none1
nopass:nopass
normal:normal
norton:norton
notta1:notta1
nouveau:nouveau
novell:novell
noway:noway
nugget:nugget
number9:number9
numbers:numbers
nurse:nurse
nutmeg:nutmeg
oaxaca:oaxaca
obiwan:obiwan
obsession:obsession
ohshit:ohshit
oicu812:oicu812
omega:omega
openup:openup
orchid:orchid
oreo:oreo
orlando:orlando
orville:orville
otter:otter
ozzy:ozzy
paagal:paagal
packard:packard
packers:packers
packrat:packrat
paint:paint
paloma:paloma
pam:pam
pancake:pancake
panic:panic
papa:papa
paradigm:paradigm
park:park
parola:parola
parrot:parrot
partner:partner
pascal:pascal
pass:pass
patches:patches
patriots:patriots
paula:paula
pauline:pauline
pavel:pavel
payton:payton
peach:peach
peanuts:peanuts
pedro1:pedro1
peggy:peggy
pekka:pekka
perfect:perfect
performa:performa
perry:perry
peterk:peterk
peterpan:peterpan
phialpha:phialpha
philips:philips
phillips:phillips
phishy:phishy
phone:phone
piano1:piano1
pianoman:pianoman
pianos:pianos
pierce:pierce
pigeon:pigeon
pink:pink
pioneer:pioneer
pipeline:pipeline
piper1:piper1
pirate:pirate
pisces:pisces
plato:plato
play:play
playboy:playboy
pluto:pluto
poetic:poetic
poetry:poetry
pole:pole
pontiac:pontiac
pookey:pookey
pope:pope
popeye:popeye
prayer:prayer
precious:precious
prelude:prelude
premier:premier
print:print
printing:printing
prof:prof
provider:provider
puddin:puddin
pulsar:pulsar
pussy:pussy
pussy1:pussy1
pyro:pyro
qqq111:qqq111
quebec:quebec
qwer:qwer
qwert:qwert
qwerty12:qwerty12
qwertyui:qwertyui
r0ger:r0ger
rabbit1:rabbit1
racer:racer
racerx:racerx
rachelle:rachelle
racoon:racoon
radar:radar
rafiki:rafiki
raleigh:raleigh
ram:ram
rambo:rambo
randy1:randy1
rasta1:rasta1
ratio:ratio
ravens:ravens
redcloud:redcloud
redfish:redfish
redman:redman
redskins:redskins
redwing:redwing
redwood:redwood
reed:reed
reggae:reggae
reggie:reggie
reliant:reliant
rene:rene
renee:renee
renegade:renegade
rescue:rescue
revolution:revolution
rex:rex
reznor:reznor
rhino:rhino
rhjrjlbk:rhjrjlbk
richard1:richard1
richards:richards
richmond:richmond
riley:riley
ripper:ripper
ripple:ripple
rita:rita
robby:robby
roberts:roberts
robocop:robocop
robotics:robotics
roche:roche
rock:rock
rocket1:rocket1
rockie:rockie
rockon:rockon
roger1:roger1
rogers:rogers
roland:roland
rommel:rommel
roni:roni
rookie:rookie
rootbeer:rootbeer
rosie:rosie
rossigno:rossigno
rufus:rufus
rugger:rugger
rush:rush
rusty:rusty
ruthless:ruthless
sabbath:sabbath
sabina:sabina
safety:safety
safety1:safety1
saigon:saigon
saint:saint
samIam:samIam
samiam:samiam
sammie:sammie
sammy:sammy
samsam:samsam
sandi:sandi
sanjose:sanjose
saphire:saphire
sarah1:sarah1
saskia:saskia
sassy:sassy
satori:satori
saturday:saturday
saturn5:saturn5
schnapps:schnapps
science:science
scooby:scooby
scoobydoo:scoobydoo
scooter1:scooter1
scorpion:scorpion
scotch:scotch
scotty:scotty
scouts:scouts
scuba:scuba
search:search
secret3:secret3
seeker:seeker
seoul:seoul
september:september
server:server
services:services
seven7:seven7
sex:sex
sexy:sexy
shaggy:shaggy
shanghai:shanghai
shanny:shanny
shaolin:shaolin
shasta:shasta
shayne:shayne
shazam:shazam
shelly:shelly
shelter:shelter
sherry:sherry
ship:ship
shirley:shirley
shorty:shorty
shotgun:shotgun
sidney:sidney
sigmachi:sigmachi
signal:signal
signature:signature
simba1:simba1
simsim:simsim
sinatra:sinatra
sirius:sirius
skate:skate
skip:skip
skipper1:skipper1
skydive:skydive
skyler:skyler
slayer:slayer
sleepy:sleepy
slick:slick
slider:slider
slip:slip
smegma:smegma
smile1:smile1
smiths:smiths
smitty:smitty
smoke:smoke
smurfy:smurfy
snakes:snakes
snapper:snapper
snoop:snoop
snow:snow
sober1:sober1
solomon:solomon
sonics:sonics
sony:sony
sophia:sophia
space:space
sparks:sparks
spartan:spartan
spazz:spazz
sphynx:sphynx
spike1:spike1
spock:spock
sponge:sponge
spoon:spoon
spot:spot
sprocket:sprocket
spurs:spurs
squash:squash
stan:stan
starbuck:starbuck
stargate:stargate
starlight:starlight
stars:stars
steel:steel
steph1:steph1
stephi:stephi
steve1:steve1
stevens:stevens
stewart:stewart
sting:sting
stivers:stivers
stocks:stocks
stone:stone
storage:storage
stranger:stranger
strat:strat
strato:strato
stretch:stretch
strong:strong
stud:stud
student2:student2
studio:studio
stumpy:stumpy
sucker:sucker
suckme:suckme
sue:sue
sultan:sultan
summit:summit
sunfire:sunfire
sunset:sunset
super:super
superstar:superstar
surfing:surfing
susan1:susan1
susanna:susanna
sutton:sutton
suzy:suzy
swanson:swanson
sweden:sweden
sweetpea:sweetpea
sweety:sweety
swim:swim
switzer:switzer
swordfish:swordfish
system5:system5
t-bone:t-bone
tab:tab
tabatha:tabatha
tacobell:tacobell
taiwan:taiwan
talon:talon
tamtam:tamtam
tanner:tanner
tapani:tapani
targas:targas
target:target
tarheel:tarheel
tasha:tasha
tata:tata
tattoo:tattoo
tazdevil:tazdevil
tequila:tequila
terry1:terry1
test2:test2
test3:test3
tester:tester
testi:testi
testtest:testtest
texas:texas
thankyou:thankyou
theend:theend
thelorax:thelorax
thisisit:thisisit
thompson:thompson
thorne:thorne
thrasher:thrasher
tiger2:tiger2
tightend:tightend
tika:tika
tim:tim
timber:timber
timothy:timothy
tinkerbell:tinkerbell
tnt:tnt
tom:tom
tool:tool
topcat:topcat
topher:topher
toshiba:toshiba
total:total
toto1:toto1
tototo:tototo
toucan:toucan
transfer:transfer
transit:transit
transport:transport
trapper:trapper
trash:trash
travis:travis
tre:tre
treasure:treasure
trees:trees
tricky:tricky
trish:trish
triton:triton
trombone:trombone
trophy:trophy
trouble:trouble
trucker:trucker
tucson:tucson
tula:tula
turbo:turbo
turbo2:turbo2
twins:twins
tyler1:tyler1
ultimate:ultimate
unique:unique
united:united
unity:unity
unix:unix
upsilon:upsilon
ursula:ursula
user1:user1
vacation:vacation
valley:valley
vampire:vampire
vanessa:vanessa
vedder:vedder
velo:velo
venice:venice
venus:venus
vermont:vermont
vette:vette
vicki:vicki
vicky:vicky
victor1:victor1
vikram:vikram
vincent1:vincent1
violet:violet
violin:violin
virago:virago
virgil:virgil
virginia:virginia
vision:vision
visual:visual
volcano:volcano
volley:volley
voodoo:voodoo
vortex:vortex
waiting:waiting
walden:walden
waldo:waldo
walleye:walleye
wanker:wanker
warner:warner
water1:water1
wayne1:wayne1
webmaster:webmaster
webster:webster
wedge:wedge
weezer:weezer
wendy1:wendy1
western:western
whale1:whale1
whit:whit
white:white
whitney:whitney
whocares:whocares
whoville:whoville
wibble:wibble
wildcat:wildcat
will:will
william1:william1
wilma:wilma
wind:wind
window:window
winniethepooh:winniethepooh
wolfgang:wolfgang
wolverine:wolverine
wombat1:wombat1
wonder:wonder
word:word
world:world
x-files:x-files
x-men:x-men
xanth:xanth
xxx123:xxx123
xxxxxxxx:xxxxxxxx
xyz:xyz
yamaha:yamaha
yankee:yankee
yogibear:yogibear
yolanda:yolanda
yomama:yomama
yvette:yvette
zachary:zachary
zack:zack
zebras:zebras
zepplin:zepplin
zoltan:zoltan
zoomer:zoomer
zxc:zxc
zxcvbn:zxcvbn
!@#$%^&:!@#$%^&
00000000:00000000
121212:121212
1234qwer:1234qwer
123go:123go
131313:131313
13579:13579
1701d:1701d
21122112:21122112
369:369
5555:5555
80486:80486
90210:90210
911:911
99999999:99999999
@#$%^&:@#$%^&
ABC123:ABC123
Abcdef:Abcdef
Asdfgh:Asdfgh
Casio:Casio
Changeme:Changeme
FuckYou:FuckYou
Fuckyou:Fuckyou
Gizmo:Gizmo
Hello:Hello
JSBach:JSBach
Michel:Michel
NCC1701:NCC1701
PPP:PPP
Qwert:Qwert
Qwerty:Qwerty
Windows:Windows
Zxcvb:Zxcvb
Zxcvbnm:Zxcvbnm
action:action
advil:advil
allo:allo
amelie:amelie
anaconda:anaconda
angus:angus
apollo13:apollo13
artist:artist
aspen:aspen
ass:ass
asshole:asshole
ath:ath
benoit:benoit
bernard:bernard
bernie:bernie
bigbird:bigbird
bird:bird
blizzard:blizzard
bluesky:bluesky
bonjour:bonjour
booster:booster
byteme:byteme
caesar:caesar
cardinal:cardinal
carolina:carolina
cats:cats
cedic:cedic
cesar:cesar
chandler:chandler
changeit:changeit
chapman:chapman
charlie1:charlie1
chevy:chevy
chiquita:chiquita
chocolat:chocolat
christia:christia
christoph:christoph
classroom:classroom
cloclo:cloclo
coco:coco
corrado:corrado
cougars:cougars
courtney:courtney
dasha:dasha
demo:demo
dirk:dirk
dolphins:dolphins
dominic:dominic
donkey:donkey
doom2:doom2
dusty:dusty
e:e
energy:energy
fearless:fearless
fiction:fiction
forest:forest
french1:french1
fubar:fubar
gator:gator
gilles:gilles
glenn:glenn
go:go
gocougs:gocougs
good-luck:good-luck
graymail:graymail
guinness:guinness
hilbert:hilbert
hola:hola
home:home
homebrew:homebrew
hotdog:hotdog
indian:indian
jared:jared
jimbo:jimbo
jkm:jkm
johnson:johnson
jojo:jojo
josie:josie
judy:judy
koko:koko
kristin:kristin
lloyd:lloyd
lorraine:lorraine
lulu:lulu
lynn:lynn
m1911a1:m1911a1
mac:mac
macintosh:macintosh
mailer:mailer
mars:mars
maxime:maxime
memory:memory
meow:meow
mimi:mimi
mirror:mirror
nat:nat
ne1410s:ne1410s
ne1469:ne1469
ne14a69:ne14a69
nebraska:nebraska
nemesis:nemesis
network:network
newcourt:newcourt
nigel:nigel
niki:niki
nite:nite
notused:notused
oatmeal:oatmeal
patton:patton
paul:paul
pedro:pedro
planet:planet
players:players
politics:politics
pomme:pomme
portland:portland
praise:praise
property:property
protel:protel
psalms:psalms
qwaszx:qwaszx
raiders:raiders
rambo1:rambo1
rancid:rancid
ruth:ruth
sales:sales
salut:salut
scrooge:scrooge
shawn:shawn
shelley:shelley
skidoo:skidoo
softball:softball
spain:spain
speedo:speedo
sports:sports
sss:sss
ssssss:ssssss
steele:steele
steph:steph
stephani:stephani
sunday:sunday
surf:surf
sylvie:sylvie
symbol:symbol
tiffany:tiffany
tigre:tigre
toronto:toronto
trixie:trixie
undead:undead
valentin:valentin
velvet:velvet
viking:viking
walker:walker
watson:watson
young:young
zhongguo:zhongguo

================================================
FILE: examples/on-count_whatismyip.py
================================================
import socket
import requests
from os import path
from time import sleep
from multiprocessing import Process
from importlib.machinery import SourceFileLoader

__folder__ = path.dirname(__file__)


def check_pymultitor(address='127.0.0.1', port=8080):
    s = socket.socket()
    try:
        s.connect((address, port))
        return True
    except socket.error:
        return False


def execute_pymultitor():
    pymultitor_path = path.abspath(path.join(__folder__, '..', 'pymultitor.py'))
    pymultitor_module = SourceFileLoader('pymultitor', pymultitor_path).load_module("pymultitor")
    process = Process(target=pymultitor_module.main, kwargs={
        'args': ['-d', '-p', '5', '--on-count', '2']
    })
    process.start()

    while not check_pymultitor():
        sleep(1)

    return process


if __name__ == '__main__':
    process = execute_pymultitor()

    for i in range(20):
        res = requests.get('http://httpbin.org/ip', proxies={'http': '127.0.0.1:8080'}).json()
        print("%d) %s" % (i + 1, res['origin']))

    process.terminate()
    process.join()


================================================
FILE: examples/on-regex_credential_stuffing.py
================================================
import socket
import requests
from os import path
from time import sleep
from multiprocessing import Process
from multiprocessing.pool import ThreadPool
from importlib.machinery import SourceFileLoader

__folder__ = path.dirname(__file__)


def check_pymultitor(address='127.0.0.1', port=8080):
    s = socket.socket()
    try:
        s.connect((address, port))
        return True
    except socket.error:
        return False


def execute_pymultitor():
    pymultitor_path = path.abspath(path.join(__folder__, '..', 'pymultitor.py'))
    pymultitor_module = SourceFileLoader('pymultitor', pymultitor_path).load_module("pymultitor")
    process = Process(target=pymultitor_module.main, kwargs={
        'args': ['-d', '-p', '5', '--on-regex', r'Your\s+IP\s+Address\s+Blocked']
    })
    process.start()

    while not check_pymultitor():
        sleep(1)

    return process


def iter_credentials(size=0):
    with open(path.join(__folder__, 'john.txt')) as credentials_file:
        for i, credentials in enumerate(credentials_file):
            if size and i >= size:
                break
            yield credentials.rstrip('\n').split(':')


def auth(username, password, session=requests.Session()):
    res = session.post(
        url='http://multitor.realgame.co.il/login',
        data={
            'username': username,
            'password': password,
        },
        proxies={'http': '127.0.0.1:8080'}
    )
    auth_res = str.encode('Successfully login!') in res.content
    return auth_res, username, password


def callback(res):
    auth_res, username, password = res
    if auth_res:
        print("Username: %s, Password: %s -> Success :)" % (username, password))
        return
    print("Username: %s, Password: %s -> Fail :(" % (username, password))


if __name__ == '__main__':
    process = execute_pymultitor()

    username = 'test'
    pool = ThreadPool(5)
    for credentials in iter_credentials(size=20):
        pool.apply_async(auth, args=credentials, callback=callback)
    pool.close()
    pool.join()

    process.terminate()
    process.join()


================================================
FILE: examples/on-string_bruteforce.py
================================================
import socket
import requests
from os import path
from time import sleep
from multiprocessing import Process
from importlib.machinery import SourceFileLoader

__folder__ = path.dirname(__file__)


def check_pymultitor(address='127.0.0.1', port=8080):
    s = socket.socket()
    try:
        s.connect((address, port))
        return True
    except socket.error:
        return False


def execute_pymultitor():
    pymultitor_path = path.abspath(path.join(__folder__, '..', 'pymultitor.py'))
    pymultitor_module = SourceFileLoader('pymultitor', pymultitor_path).load_module("pymultitor")
    process = Process(target=pymultitor_module.main, kwargs={
        'args': ['-d', '-p', '5', '--on-string', 'Your IP Address Blocked']
    })
    process.start()

    while not check_pymultitor():
        sleep(1)

    return process


def iter_passwords():
    with open(path.join(__folder__, 'john.txt')) as credentials_file:
        for i, credentials in enumerate(credentials_file):
            yield credentials.rstrip('\n').split(':')[-1]


def auth(username, password, session=requests.Session()):
    res = session.post(
        url='http://multitor.realgame.co.il/login',
        data={
            'username': username,
            'password': password,
        },
        proxies={'http': '127.0.0.1:8080'}
    )
    if str.encode('Successfully login!') in res.content:
        return True
    return False


if __name__ == '__main__':
    process = execute_pymultitor()

    username = 'test'
    for password in set(iter_passwords()):
        if auth(username, password):
            print("Username: %s, Password: %s -> Success :)" % (username, password))
            break
        else:
            print("Username: %s, Password: %s -> Fail :(" % (username, password))

    process.terminate()
    process.join()


================================================
FILE: pymultitor.py
================================================
import os
import re
import sys
import json
import atexit
import socket
import logging
import requests
import platform
import itertools
from os import path
from time import sleep
from shutil import rmtree
from mitmproxy import ctx
from tempfile import mkdtemp
from flask import Flask, jsonify
from mitmproxy.http import Response
from collections.abc import Sequence
from mitmproxy.addons import asgiapp
from mitmproxy.tools.main import mitmdump
from multiprocessing.pool import ThreadPool
from stem.control import Controller, Signal
from requests.exceptions import ConnectionError
from argparse import ArgumentParser, ArgumentDefaultsHelpFormatter
from stem.process import launch_tor_with_config, DEFAULT_INIT_TIMEOUT

__version__ = "4.1.0"
__author__ = 'Tomer Zait (realgam3)'

app = Flask("pymultitor")
token = os.getenv("PYMULTITOR_TOKEN", os.urandom(32).hex())


def is_windows():
    return platform.system().lower() == "windows"


def monkey_patch():
    _log_mitmproxy = logging.getLogger("mitmproxy")

    # Patch mitmproxy.addons.termlog.log
    from mitmproxy.addons import termlog

    def _termlog_log(self, e):
        getattr(_log_mitmproxy, e.level)(e.msg)

    setattr(termlog.TermLog, "log", _termlog_log)

    # Patch mitmproxy.addon.dumper.echo & mitmproxy.addon.dumper.echo_error
    from mitmproxy.addons import dumper

    def _dumper_echo(self, text, ident=None, **style):
        if ident:
            text = dumper.indent(ident, text)
        _log_mitmproxy.info(text)

    setattr(dumper.Dumper, "echo", _dumper_echo)

    def _dumper_echo_error(self, text, **style):
        _log_mitmproxy.error(text)

    setattr(dumper.Dumper, "echo_error", _dumper_echo_error)


class Tor(object):
    def __init__(self, cmd="tor", config=None, timeout=DEFAULT_INIT_TIMEOUT, tries=5):
        self.logger = logging.getLogger(__name__)
        self.tor_cmd = cmd
        self.tor_config = config or {}
        self.tor_timeout = timeout
        self.tries = tries
        self.socks_port = self.free_port()
        self.control_port = self.free_port()
        self.data_directory = mkdtemp()
        self.id = self.socks_port
        self.process = None
        self.controller = None
        self._is_running = False
        self.__is_shutdown = False

    def __del__(self):
        self.shutdown()

    def __enter__(self):
        return self.run()

    def __exit__(self, exc_type, exc_val, exc_tb):
        self.shutdown()

    def run(self):
        self.logger.debug(f"[{self.id:05d}] Executing Tor Process")
        for i in range(self.tries):
            try:
                self.process = launch_tor_with_config(
                    config={
                        "ControlPort": str(self.control_port),
                        "SOCKSPort": str(self.socks_port),
                        "DataDirectory": self.data_directory,
                        "AllowSingleHopCircuits": "1",
                        "ExcludeSingleHopRelays": "0",
                        **self.tor_config
                    },
                    tor_cmd=self.tor_cmd,
                    timeout=self.tor_timeout if self.tor_timeout != 0 else None,
                    init_msg_handler=self.print_bootstrapped_line
                )
                break
            except Exception as error:
                self.logger.debug(
                    f"[{self.id:05d}] Tor Process Execution Failed With The Error ({i + 1}/{self.tries}): {repr(error)}"
                )

        self.logger.debug(f"[{self.id:05d}] Creating Tor Controller")
        self.controller = Controller.from_port(port=self.control_port)
        self.controller.authenticate()

        return self

    def shutdown(self):
        if self.__is_shutdown:
            return

        self._is_running = False
        self.__is_shutdown = True
        self.logger.debug(f"[{self.id:05d}] Destroying Tor")
        self.controller.close()
        self.process.terminate()
        self.process.wait()

        # If Not Closed Properly
        if path.exists(self.data_directory):
            rmtree(self.data_directory)

    def newnym_available(self):
        return self.controller.is_newnym_available()

    def newnym_wait(self):
        return self.controller.get_newnym_wait()

    def newnym(self):
        if not self.newnym_available():
            self.logger.debug(f"[{self.id:05d}] Could Not Change Tor Identity (Wait {round(self.newnym_wait())}s)")
            return False

        self.logger.info(f"[{self.id:05d}] Changing Tor Identity")
        self.controller.signal(Signal.NEWNYM)
        return True

    def print_bootstrapped_line(self, line):
        if "Bootstrapped" in line:
            self.logger.debug(f"[{self.id:05d}] Tor Bootstrapped Line: {line}")

            if "100%" in line:
                self._is_running = True
                self.logger.debug(f"[{self.id:05d}] Tor Process Executed Successfully")

    @staticmethod
    def free_port():
        """
        Determines a free port using sockets.
        Taken from selenium python.
        """
        free_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        free_socket.bind(("0.0.0.0", 0))
        free_socket.listen(5)
        port = free_socket.getsockname()[1]
        free_socket.close()
        return port


class MultiTor(object):
    def __init__(self, size=2, cmd="tor", config=None, timeout=DEFAULT_INIT_TIMEOUT, tries=5):
        self.logger = logging.getLogger(__name__)
        self.cmd = cmd
        self.timeout = timeout
        self.tries = tries
        self.size = size
        self.list = []
        self.cycle = None
        self.current = None
        self.config = self.parse_config(config)

    def parse_config(self, config=None):
        config = config or {}

        cfg = {}
        try:
            if isinstance(config, dict):
                cfg = config
            elif path.isfile(config):
                with open(config, encoding="utf-8") as cfg_file:
                    json.load(cfg_file)
            else:
                cfg = json.loads(config)
        except (TypeError, json.JSONDecodeError):
            self.logger.error(f"Could Not Parse Extended JSON Configuration: {repr(config)}")
            return {}
        except Exception as error:
            self.logger.error(f"Tor Configuration Parsing Error: {repr(error)}")
            return {}

        # Remove Port / Data Configurations
        cfg.pop("ControlPort", None)
        cfg.pop("SOCKSPort", None)
        cfg.pop("DataDirectory", None)

        self.logger.debug(f"Tor Extended Configuration: {json.dumps(cfg)}")
        return cfg

    def run(self):
        self.logger.info(f"Executing {self.size} Tor Processes")

        timeout = self.timeout
        if is_windows():
            # Feature Won't Work In Windows
            timeout = DEFAULT_INIT_TIMEOUT

        pool = ThreadPool(processes=self.size)
        self.list = pool.map(
            func=lambda _: Tor(
                cmd=self.cmd,
                config=self.config,
                timeout=timeout,
                tries=self.tries,
            ).run(),
            iterable=range(self.size)
        )

        self.logger.info("All Tor Processes Executed Successfully")
        self.cycle = itertools.cycle(self.list)
        self.current = next(self.cycle)

    @property
    def proxy(self):
        proxy_url = f"socks5://127.0.0.1:{self.current.socks_port:d}"
        return {"http": proxy_url, "https": proxy_url}

    def new_identity(self):
        identity_changed = False
        while not identity_changed:
            identity_changed = self.current.newnym()
            self.current = next(self.cycle)
            if not identity_changed:
                sleep(0.1)

        return self.proxy

    def shutdown(self):
        for tor in self.list:
            tor.shutdown()


class PyMultiTor(object):
    def __init__(self):
        self.logger = logging.getLogger(__name__)
        self.insecure = False
        self.request_timeout = 0

        # Change IP Policy (Configuration)
        self.counter = itertools.count()
        self.on_count = 0
        self.on_string = ""
        self.on_regex = ""
        self.on_rst = False
        self.on_status_code = []
        self.on_timeout = False

        self.multitor = None

    @staticmethod
    def load(loader):
        # MultiTor Configuration
        loader.add_option(
            name="tor_processes",
            typespec=int,
            default=2,
            help="number of tor processes in the cycle",
        )
        loader.add_option(
            name="tor_cmd",
            typespec=str,
            default="tor",
            help="tor cmd (executable path + arguments)",
        )
        loader.add_option(
            name="tor_config",
            typespec=str,
            default="{}",
            help="tor extended json configuration",
        )
        loader.add_option(
            name="tor_timeout",
            typespec=int,
            default=DEFAULT_INIT_TIMEOUT,
            help="timeout in seconds for starting a tor instance; 0 disables timeout",
        )
        loader.add_option(
            name="tor_tries",
            typespec=int,
            default=5,
            help="number tries to execute tor instance before it fails",
        )
        loader.add_option(
            name="request_timeout",
            typespec=int,
            default=0,
            help="timeout in seconds for http requests; 0 disables timeout",
        )

        # When To Change IP Address
        loader.add_option(
            name="on_count",
            typespec=int,
            default=0,
            help="change ip every x requests (resources also counted)",
        )
        loader.add_option(
            name="on_string",
            typespec=str,
            default="",
            help="change ip when string found in the response content",
        )
        loader.add_option(
            name="on_regex",
            typespec=str,
            default="",
            help="change ip when regex found in The response content",
        )
        loader.add_option(
            name="on_rst",
            typespec=bool,
            default=False,
            help="change ip when connection closed with tcp rst",
        )
        loader.add_option(
            name="on_status_code",
            typespec=Sequence[str],
            default=[],
            help="change ip when one of the specified status codes is returned",
        )
        loader.add_option(
            name="on_timeout",
            typespec=bool,
            default=False,
            help="change ip when request times out",
        )

    def configure(self, updates):
        # Configure Logger
        logging.basicConfig(level=logging.DEBUG if ctx.options.termlog_verbosity.lower() == "debug" else logging.INFO,
                            format="%(asctime)s %(levelname)-8s %(message)s",
                            datefmt="%d-%m-%y %H:%M:%S")

        # Disable Loggers
        monkey_patch()
        for logger_name in ["stem", "urllib3.connectionpool", "mitmproxy"]:
            logging.getLogger(logger_name).disabled = True

        # Log CMD Args If Debug Mode Enabled
        cmd_args = json.dumps({update: getattr(ctx.options, update) for update in updates})
        self.logger.debug(f"Running With CMD Args: {cmd_args}")

        self.on_count = ctx.options.on_count
        self.on_string = ctx.options.on_string
        self.on_regex = ctx.options.on_regex
        self.on_rst = ctx.options.on_rst
        self.on_status_code = [int(x) for x in ctx.options.on_status_code]
        self.on_timeout = ctx.options.on_timeout

        self.insecure = ctx.options.ssl_insecure
        self.request_timeout = ctx.options.request_timeout

        self.logger.info(f"PyMultiTor Token: {token}")

        self.multitor = MultiTor(
            size=ctx.options.tor_processes,
            cmd=ctx.options.tor_cmd,
            config=ctx.options.tor_config,
            timeout=ctx.options.tor_timeout,
            tries=ctx.options.tor_tries,
        )
        try:
            self.multitor.run()
        except KeyboardInterrupt:
            self.multitor.shutdown()

        atexit.register(self.multitor.shutdown)

        # Warn If No Change IP Configuration:
        if not any([self.on_count, self.on_string, self.on_regex, self.on_rst, self.on_status_code, self.on_timeout]):
            self.logger.warning("Change IP Configuration Not Set (Acting As Regular Tor Proxy)")

    def create_response(self, request):
        response = requests.request(
            method=request.method,
            url=request.url,
            data=request.content,
            headers=request.headers,
            allow_redirects=False,
            verify=not self.insecure,
            proxies=self.multitor.proxy,
            stream=False,
            timeout=self.request_timeout if self.request_timeout != 0 else None,
        )

        # Content-Length and Transfer-Encoding set. This is expressly forbidden by RFC 7230 sec 3.3.2.
        if response.headers.get("Transfer-Encoding") == "chunked":
            response.headers.pop("Transfer-Encoding")

        return Response.make(
            status_code=response.status_code,
            content=response.content,
            headers=dict(response.headers),
        )

    def request(self, flow):
        auth = flow.request.headers.get("Proxy-Authorization", "").split(" ", 2)
        if flow.request.host in ["pymultitor"] and len(auth) == 2 and auth[1] == token:
            return

        error_message = None
        try:
            flow.response = self.create_response(flow.request)
        except ConnectionError:
            # If TCP Rst Configured
            if self.on_rst:
                self.logger.debug("Got TCP Rst, While TCP Rst Configured")
                self.multitor.new_identity()
                # Set Response
                try:
                    flow.response = self.create_response(flow.request)
                except Exception as error:
                    error_message = f"After TCP Rst Triggered, Got Response Error: {repr(error)}"
            else:
                error_message = "Got TCP Rst, While TCP Rst Not Configured"
        except requests.exceptions.Timeout:
            # If Timeout Configured
            if self.on_timeout:
                self.logger.debug("Request Timeout, While Timeout Configured")
                self.multitor.new_identity()
                # Set Response
                try:
                    flow.response = self.create_response(flow.request)
                except Exception as error:
                    error_message = f"After Timeout Triggered, Got Response Error: {repr(error)}"
            else:
                error_message = "Request Timeout, While Timeout Not Configured"
        except Exception as error:
            error_message = f"Got Response Error: {repr(error)}"

        # When There Is No Response
        if error_message:
            self.logger.error(error_message)
            # Set Error Response
            flow.response = Response.make(
                status_code=500,
                content=error_message,
                headers={
                    "Server": f"pymultitor/{__version__}"
                }
            )
            return

        # If String Found In Response Content
        if self.on_string and self.on_string in flow.response.text:
            self.logger.debug("String Found In Response Content")
            self.multitor.new_identity()
            # Set Response
            flow.response = self.create_response(flow.request)

        # If Regex Found In Response Content
        if self.on_regex and re.search(self.on_regex, flow.response.text, re.IGNORECASE):
            self.logger.debug("Regex Found In Response Content")
            self.multitor.new_identity()
            # Set Response
            flow.response = self.create_response(flow.request)

        # If Counter Raised To The Configured Number
        if self.on_count and not next(self.counter) % self.on_count:
            self.logger.debug("Counter Raised To The Configured Number")
            self.multitor.new_identity()

        # If A Specific Status Code Returned
        if flow.response.status_code in self.on_status_code:
            self.logger.debug("Specific Status Code Returned")
            self.multitor.new_identity()
            # Set Response
            flow.response = self.create_response(flow.request)


def main(args=None):
    if args is None:
        args = sys.argv[1:]

    parser = ArgumentParser(formatter_class=ArgumentDefaultsHelpFormatter)
    parser.add_argument("-v", "--version", action="version", version="%(prog)s {ver}".format(ver=__version__))

    # Proxy Configuration
    parser.add_argument("-lh", "--host",
                        help="proxy listen host.",
                        dest="listen_host",
                        default="127.0.0.1")
    parser.add_argument("-lp", "--port",
                        help="proxy listen port",
                        dest="listen_port",
                        type=int,
                        default=8080)
    parser.add_argument("-s", "--socks",
                        help="use as socks proxy (not http proxy)",
                        action="store_true")
    parser.add_argument("-a", "--auth",
                        help="set proxy authentication (format: 'username:pass')",
                        dest="auth",
                        default="")
    parser.add_argument("-i", "--insecure",
                        help="insecure ssl",
                        action="store_true")
    parser.add_argument("-d", "--debug",
                        help="Debug Log.",
                        action="store_true")

    # MultiTor Configuration
    parser.add_argument("-p", "--tor-processes",
                        help="number of tor processes in the cycle",
                        dest="processes",
                        type=int,
                        default=2)
    parser.add_argument("-c", "--tor-cmd",
                        help="tor cmd (executable path + arguments)",
                        dest="cmd",
                        default="tor")
    parser.add_argument("-e", "--tor-config",
                        help="tor extended json configuration",
                        dest="config",
                        default="{}")
    parser.add_argument("-t", "--tor-timeout",
                        help="timeout in seconds for starting a tor instance; 0 disables timeout",
                        dest="timeout",
                        type=int,
                        default=DEFAULT_INIT_TIMEOUT)
    parser.add_argument("-r", "--tor-tries",
                        help="number tries to start a tor instance before it fails",
                        dest="tries",
                        type=int,
                        default=5)
    parser.add_argument("--request-timeout",
                        help="timeout in seconds for http requests; 0 disables timeout",
                        dest="request_timeout",
                        type=int,
                        default=0)

    # When To Change IP Address
    parser.add_argument("--on-count",
                        help="change ip every x requests (resources also counted)",
                        type=int,
                        default=0)
    parser.add_argument("--on-string",
                        help="change ip when string found in the response content",
                        default="")
    parser.add_argument("--on-regex",
                        help="change ip when regex found in The response content",
                        default="")
    parser.add_argument("--on-rst",
                        help="change ip when connection closed with tcp rst",
                        action="store_true")
    parser.add_argument("--on-status-code",
                        help="change ip when one of the specified status codes is returned",
                        type=int,
                        nargs='*',
                        default=[])
    parser.add_argument("--on-timeout",
                        help="change ip when request times out",
                        action="store_true")

    sys_args = vars(parser.parse_args(args=args))
    mitmdump_args = [
        "--scripts", __file__,
        "--mode", "socks5" if sys_args['socks'] else "regular",
        "--listen-host", sys_args['listen_host'],
        "--listen-port", str(sys_args['listen_port']),
        "--set", f"tor_cmd={sys_args['cmd']}",
        "--set", f"tor_config={sys_args['config']}",
        "--set", f"tor_timeout={sys_args['timeout']}",
        "--set", f"tor_tries={sys_args['tries']}",
        "--set", f"tor_processes={sys_args['processes']}",
        "--set", f"request_timeout={sys_args['request_timeout']}",
        "--set", f"on_string={sys_args['on_string']}",
        "--set", f"on_regex={sys_args['on_regex']}",
        "--set", f"on_count={sys_args['on_count']}",
    ]

    for status_code in sys_args["on_status_code"]:
        mitmdump_args.extend([
            "--set", f"on_status_code={status_code}",
        ])

    if sys_args["auth"]:
        mitmdump_args.extend([
            "--proxyauth", sys_args["auth"],
        ])

    if sys_args["on_rst"]:
        mitmdump_args.extend([
            "--set", "on_rst",
        ])

    if sys_args["on_timeout"]:
        mitmdump_args.extend([
            "--set", "on_timeout",
        ])

    if sys_args["debug"]:
        mitmdump_args.extend([
            "--verbose",
        ])

    if sys_args["insecure"]:
        mitmdump_args.extend([
            "--ssl-insecure",
        ])
    return mitmdump(args=mitmdump_args)


@app.get("/status")
def status() -> Response:
    is_running = False
    if pymultitor.multitor:
        is_running = all([
            tor._is_running
            for tor in pymultitor.multitor.list
        ])

    return jsonify({
        "status": "running" if is_running else "stopped",
    })


@app.post("/identity")
def identity() -> Response:
    if not pymultitor.multitor:
        return jsonify({
            "message": "pymultitor not running",
            "success": False,
        })

    pymultitor.logger.debug("API Requesting New Identity")
    tor = pymultitor.multitor.current
    res = tor.newnym()
    return jsonify({
        "message": "new identity requested",
        "success": res,
    })


pymultitor = PyMultiTor()
addons = [
    asgiapp.WSGIApp(app, "pymultitor", 80),
    pymultitor,
]

if __name__ == "__main__":
    main()


================================================
FILE: requirements.txt
================================================
stem>=1.8.2
mitmproxy>=10.1.6
requests[socks]>=2.31.0

================================================
FILE: setup.py
================================================
#!/usr/bin/env python

import re
from os import path
from setuptools import setup, find_packages

__folder__ = path.dirname(__file__)

with open(path.join(__folder__, "README.md")) as ld_file:
    long_description = ld_file.read()
    ld_file.flush()

with open(path.join(__folder__, "pymultitor.py")) as lib_file:
    r = re.search(r"__version__\s+=\s+(?P<q>[\"'])(?P<ver>\d+(?:\.\d+)*)(?P=q)", lib_file.read())
    version = r.group('ver')

with open(path.join(__folder__, "requirements.txt")) as req_file:
    install_requires = req_file.read()

setup(
    name="PyMultitor",
    version=version,
    description="PyMultitor - Never Stop Even If Your IP Dropped.",
    long_description=long_description,
    long_description_content_type="text/markdown",
    author="Tomer Zait (realgam3)",
    author_email="realgam3@gmail.com",
    packages=find_packages(exclude=["examples", "tests"]),
    py_modules=["pymultitor"],
    entry_points={
        "console_scripts": [
            "pymultitor = pymultitor:main",
        ]
    },
    python_requires=">=3.10",
    install_requires=install_requires,
    license="GPLv3",
    platforms="any",
    url="https://github.com/realgam3/pymultitor",
    zip_safe=False,
    classifiers=[
        "Environment :: Console",
        "Development Status :: 5 - Production/Stable",
        "Intended Audience :: Developers",
        "Intended Audience :: Science/Research",
        "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",
        "Natural Language :: English",
        'Operating System :: OS Independent',
        'Programming Language :: Python :: 3.10',
        'Programming Language :: Python :: 3.11',
        'Programming Language :: Python :: 3.12',
        "Programming Language :: Python :: 3 :: Only",
        "Topic :: Security",
        "Topic :: Internet",
        "Topic :: Internet :: WWW/HTTP",
        "Topic :: Internet :: Proxy Servers",
        "Topic :: Software Development :: Testing",
        "Topic :: Software Development :: Libraries :: Python Modules",
    ],
    project_urls={
        'Source': "https://github.com/realgam3/pymultitor",
    },
)
Download .txt
gitextract_xf2j_25a/

├── .github/
│   └── workflows/
│       └── publish.yml
├── .gitignore
├── Dockerfile
├── LICENSE.md
├── README.md
├── examples/
│   ├── john.txt
│   ├── on-count_whatismyip.py
│   ├── on-regex_credential_stuffing.py
│   └── on-string_bruteforce.py
├── pymultitor.py
├── requirements.txt
└── setup.py
Download .txt
SYMBOL INDEX (41 symbols across 4 files)

FILE: examples/on-count_whatismyip.py
  function check_pymultitor (line 11) | def check_pymultitor(address='127.0.0.1', port=8080):
  function execute_pymultitor (line 20) | def execute_pymultitor():

FILE: examples/on-regex_credential_stuffing.py
  function check_pymultitor (line 12) | def check_pymultitor(address='127.0.0.1', port=8080):
  function execute_pymultitor (line 21) | def execute_pymultitor():
  function iter_credentials (line 35) | def iter_credentials(size=0):
  function auth (line 43) | def auth(username, password, session=requests.Session()):
  function callback (line 56) | def callback(res):

FILE: examples/on-string_bruteforce.py
  function check_pymultitor (line 11) | def check_pymultitor(address='127.0.0.1', port=8080):
  function execute_pymultitor (line 20) | def execute_pymultitor():
  function iter_passwords (line 34) | def iter_passwords():
  function auth (line 40) | def auth(username, password, session=requests.Session()):

FILE: pymultitor.py
  function is_windows (line 34) | def is_windows():
  function monkey_patch (line 38) | def monkey_patch():
  class Tor (line 65) | class Tor(object):
    method __init__ (line 66) | def __init__(self, cmd="tor", config=None, timeout=DEFAULT_INIT_TIMEOU...
    method __del__ (line 81) | def __del__(self):
    method __enter__ (line 84) | def __enter__(self):
    method __exit__ (line 87) | def __exit__(self, exc_type, exc_val, exc_tb):
    method run (line 90) | def run(self):
    method shutdown (line 119) | def shutdown(self):
    method newnym_available (line 134) | def newnym_available(self):
    method newnym_wait (line 137) | def newnym_wait(self):
    method newnym (line 140) | def newnym(self):
    method print_bootstrapped_line (line 149) | def print_bootstrapped_line(self, line):
    method free_port (line 158) | def free_port():
  class MultiTor (line 171) | class MultiTor(object):
    method __init__ (line 172) | def __init__(self, size=2, cmd="tor", config=None, timeout=DEFAULT_INI...
    method parse_config (line 183) | def parse_config(self, config=None):
    method run (line 210) | def run(self):
    method proxy (line 234) | def proxy(self):
    method new_identity (line 238) | def new_identity(self):
    method shutdown (line 248) | def shutdown(self):
  class PyMultiTor (line 253) | class PyMultiTor(object):
    method __init__ (line 254) | def __init__(self):
    method load (line 271) | def load(loader):
    method configure (line 348) | def configure(self, updates):
    method create_response (line 393) | def create_response(self, request):
    method request (line 416) | def request(self, flow):
  function main (line 491) | def main(args=None):
  function status (line 625) | def status() -> Response:
  function identity (line 639) | def identity() -> Response:
Condensed preview — 12 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (126K chars).
[
  {
    "path": ".github/workflows/publish.yml",
    "chars": 1875,
    "preview": "name: Build and Publish\r\n\r\non:\r\n  push:\r\n    branches:\r\n      - '**'\r\n    tags:\r\n      - 'v[0-9]+.[0-9]+'  # Trigger on "
  },
  {
    "path": ".gitignore",
    "chars": 1103,
    "preview": "# Byte-compiled / optimized / DLL files\n__pycache__/\n*.py[cod]\n*$py.class\n\n# C extensions\n*.so\n\n# Distribution / packagi"
  },
  {
    "path": "Dockerfile",
    "chars": 341,
    "preview": "FROM mitmproxy/mitmproxy:12.1\n\n# Create app directory\nWORKDIR /app\n\n# Bundle app source\nCOPY requirements.txt /app/\nRUN "
  },
  {
    "path": "LICENSE.md",
    "chars": 35801,
    "preview": "GNU GENERAL PUBLIC LICENSE\n\n                       Version 3, 29 June 2007\n\n\n\n Copyright (C) 2007 Free Software Foundati"
  },
  {
    "path": "README.md",
    "chars": 6285,
    "preview": "## PyMultiTor\n\n[![PyPI version](https://img.shields.io/pypi/v/pymultitor)](https://pypi.org/project/pymultitor/)\n[![Down"
  },
  {
    "path": "examples/john.txt",
    "chars": 43867,
    "preview": "12345:12345\nabc123:abc123\npassword:password\ncomputer:computer\n123456:123456\ntigger:tigger\n1234:1234\na1b2c3:a1b2c3\nqwerty"
  },
  {
    "path": "examples/on-count_whatismyip.py",
    "chars": 1083,
    "preview": "import socket\nimport requests\nfrom os import path\nfrom time import sleep\nfrom multiprocessing import Process\nfrom import"
  },
  {
    "path": "examples/on-regex_credential_stuffing.py",
    "chars": 2088,
    "preview": "import socket\nimport requests\nfrom os import path\nfrom time import sleep\nfrom multiprocessing import Process\nfrom multip"
  },
  {
    "path": "examples/on-string_bruteforce.py",
    "chars": 1823,
    "preview": "import socket\nimport requests\nfrom os import path\nfrom time import sleep\nfrom multiprocessing import Process\nfrom import"
  },
  {
    "path": "pymultitor.py",
    "chars": 22657,
    "preview": "import os\nimport re\nimport sys\nimport json\nimport atexit\nimport socket\nimport logging\nimport requests\nimport platform\nim"
  },
  {
    "path": "requirements.txt",
    "chars": 53,
    "preview": "stem>=1.8.2\nmitmproxy>=10.1.6\nrequests[socks]>=2.31.0"
  },
  {
    "path": "setup.py",
    "chars": 2142,
    "preview": "#!/usr/bin/env python\n\nimport re\nfrom os import path\nfrom setuptools import setup, find_packages\n\n__folder__ = path.dirn"
  }
]

About this extraction

This page contains the full source code of the realgam3/pymultitor GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 12 files (116.3 KB), approximately 34.8k tokens, and a symbol index with 41 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!