NetPro: Packet Analysis and Visualization tool

Have you created a useful tool? or Do you want to get help building one? This is the right place!
Forum rules
READ NOW: L2j Forums Rules of Conduct
Post Reply
User avatar
jurchiks
Posts: 6769
Joined: Sat Sep 19, 2009 4:16 pm
Location: Eastern Europe

Re: NetPro: Packet Analysis and Visualization tool

Post by jurchiks »

Had a good laugh about that scripting engine example :D

I see your reasoning (and it's solid), but even so, a wiki and an issue tracker would be much better than this single topic. Besides, the reasons for all the l2jserver forks have been mentioned countless times before; I hope your project is better than that.

The localization should definitely be post-v1, that's for sure. I'm personally all for people learning some English instead of just using whatever they can find in their native language, it's beneficial for everyone after all, especially for those people themselves. You should, of course, first ask around if there's even need for it - if there are only 10 people who want it and each of them speaks a different language, but they all can still use your project as-is, then it's probably not worth it. Just use simple terms and it's going to be ok.

I assume that that "larger project catalog" you mentioned is a commercial product?

In any case, good luck with the project.
If you have problems, FIRST TRY SOLVING THEM YOURSELF, and if you get errors, TRY TO ANALYZE THEM, and ONLY if you can't help it, THEN ask here.
Otherwise you will never learn anything if all you do is copy-paste!
Discussion breeds innovation.
User avatar
UnAfraid
L2j Veteran
L2j Veteran
Posts: 4199
Joined: Mon Jul 23, 2007 4:25 pm
Location: Bulgaria
Contact:

Re: NetPro: Packet Analysis and Visualization tool

Post by UnAfraid »

Why don't u use javafx its really cool looking and easy to work with.

Also packet injection is kinda nice it helps u gather information that u normally would need to spend a lot of time.
For example while getting skill tree u can request data per each skill level and l2off will give it to you.
And u can use RequestLink to get any html that you know by name (Not only html btw :P)
Image
SaveGame
Posts: 121
Joined: Thu Oct 30, 2014 9:54 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by SaveGame »

UnAfraid wrote:Why don't u use javafx its really cool looking and easy to work with.

Also packet injection is kinda nice it helps u gather information that u normally would need to spend a lot of time.
For example while getting skill tree u can request data per each skill level and l2off will give it to you.
And u can use RequestLink to get any html that you know by name (Not only html btw :P)
Well, javafx is a part of the JDK (vs a rather heavy lib) only since J8; while the UI was created back in 2011 at J6. I've already moved from JEditorPane to WebView due to horrendous performance in J7 (in J6 it was perfectly fine). Anyway, I didn't really have time to assess what would it take to move to JFX. But from what I understand, the performance would be definitely better (though due to the lack of animations that's not really an issue).

Well, I have to admit, I somehow didn't think about harvesting skill learn data :P
We have our internal scripts (not bundled with this release) to harvest HTMLs, exchanges (a.k.a. multisells), normal NPC spawns, among other things.

I have been unsuccessful in retrieving anything else than .htms with 22, sadly. Except on unofficial servers, of course.
Image
User avatar
UnAfraid
L2j Veteran
L2j Veteran
Posts: 4199
Joined: Mon Jul 23, 2007 4:25 pm
Location: Bulgaria
Contact:

Re: NetPro: Packet Analysis and Visualization tool

Post by UnAfraid »

I am using l2tower to inject packets and with packet samurai logging the data and analyzing it
Image
michael1414
Posts: 10
Joined: Sun Apr 27, 2014 12:17 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by michael1414 »

SaveGame wrote:For a start, I am mainly asking for what features, based on the public opinion, would add the most value to this application.
I tested Your tool and is very good. Here is my feedback.

About the scripts, could be added some scripts about using packets from opcode > 255. Would be very nice.

About the UI features. Firstly, how dumping packets for opening in future ? In scripts ? Or is there option in cmd or export in UI ?. Second: Could be added PAUSE/RESUME for dumping packets (sometimes I want dump packets only for checking one thing and I not need tons of packets).
Next things that could be usefull is filtering packets by Opcode or name (usefull for checking for example packet with opcode 31 is changing), like tere (I made it in Paint so sorry for quality):
Image

For now for me nothing more is not needed.

Thx.
SaveGame
Posts: 121
Joined: Thu Oct 30, 2014 9:54 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by SaveGame »

michael1414 wrote:About the scripts, could be added some scripts about using packets from opcode > 255. Would be very nice.
This would be much easier if the javadoc was accessible; however, I am busy with ACM ICPC & related contests/training and have been unable to prepare a guide about script writing.

Let's just sum up that there are two primary script types you will want to use:
A) Low-level packet handling, manually selecting blocking or asynchronous handling. (subclasses of net.l2emuproject.proxy.script.Script)
Blocking implies packet modification (either within the buffer, or dropping the packet, or allocating a buffer of a different size and writing own data). Therefore, since you must know everything (possible opcodes and structures in all client versions your script is being created for), you can only register the 1st opcodes you are interested in. Hardly convenient, but you know how it is: every once in a while, some opcodes get shifted or shuffled around. So if you register all possible variants; you will still have to filter them by version, etc.

B) High-level asynchronous* packet handling, making use of Packet Payload [Field] Enumeration (PPE). You do not specify any opcodes to handle packets. You define script aliases for fields already in packet definitions and when you get a packet event in your script, you can obtain a typed pointer list for each aliased field. Of course, if the definition doesn't specify that field within a loop, then this list will only contain one pointer (to the field). There are functions to read any type of integer value (since we have many D/Q or D/H/C or H/C or C/H field type changes between protocol versions) for your convenience.

* this merely means that scripts receive packet events outside the I/O thread(s); they still handle events one at a time and in the same order packets were sent/received.

That's a short overview of how scripts work. Of course, without a guide (and javadoc), this doesn't help much. I'll try to get to it.
michael1414 wrote:Firstly, how dumping packets for opening in future ? In scripts ? Or is there option in cmd or export in UI ?.
In earlier versions, there was a menu option which would enable/disable automatic packet logging when connections are initiated. Currently, all connections are logged to disk. Packet logs can be found in [user.home]/l2emu-unique-netpro/
michael1414 wrote:Second: Could be added PAUSE/RESUME for dumping packets (sometimes I want dump packets only for checking one thing and I not need tons of packets).
That's a good idea.
michael1414 wrote:Next things that could be usefull is filtering packets by Opcode or name (usefull for checking for example packet with opcode 31 is changing)
Filtering by opcode is currently possible via [menu bar] Packets -> Configure -> Select the protocol version of an active connection. You may check/uncheck packets to include/exclude them from view in the packet table.

I have been thinking about implementing filtering in a more convenient way, similarly to how you have suggested. I'll look into it.
Image
michael1414
Posts: 10
Joined: Sun Apr 27, 2014 12:17 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by michael1414 »

SaveGame wrote:you can only register the 1st opcodes you are interested in.
Now I understand why my script not worked with 2 opcodes :) :

Code: Select all

 public final class MultisellFileGenerator extends GameScript{    private static final L2Logger LOG = L2Logger.getLogger(MultisellFileGenerator.class);     private static final int REQUEST_LINK_HTML = 0x22;    private static final int REQUEST_BYPASS_TO_SERVER = 0x23;     private static final int EX_BUY_SELL_LIST = 47358; // FE B8 00    private static final int NPC_HTML_MESSAGE = 0x19;     /** Constructs this script. */    public MultisellFileGenerator()    {        super(new int[] { REQUEST_LINK_HTML }, new int[] { EX_BUY_SELL_LIST, NPC_HTML_MESSAGE });    } 
Thx for informations about scripts. They are very helpfull.
SaveGame
Posts: 121
Joined: Thu Oct 30, 2014 9:54 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by SaveGame »

Here's one that makes use of aliases already defined in included packet definitions:

Code: Select all

package internal.dump; import java.io.IOException;import java.io.Writer;import java.nio.ByteBuffer;import java.nio.ByteOrder;import java.nio.charset.StandardCharsets;import java.nio.file.Files;import java.nio.file.Path;import java.text.DateFormat;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.Date;import java.util.List;import java.util.concurrent.Future; import net.l2emuproject.network.mmocore.MMOBuffer;import net.l2emuproject.proxy.network.game.client.L2GameClient;import net.l2emuproject.proxy.network.game.server.L2GameServer;import net.l2emuproject.proxy.network.meta.L2TypedPacketPayloadField;import net.l2emuproject.proxy.network.meta.RandomAccessMMOBuffer;import net.l2emuproject.proxy.network.packets.IPacketAuthor;import net.l2emuproject.proxy.network.packets.ProxyRepeatedPacket;import net.l2emuproject.proxy.script.ClientPacketSender;import net.l2emuproject.proxy.script.ClientPacketSender.UnknownPacketStructureException;import net.l2emuproject.proxy.script.ScriptFieldAlias;import net.l2emuproject.proxy.script.analytics.PpeAnalyticsScript;import net.l2emuproject.proxy.script.game.InteractiveChatCommands;import net.l2emuproject.proxy.state.entity.context.ICacheServerID;import net.l2emuproject.proxy.ui.interpreter.NetProValueInterpreters;import net.l2emuproject.proxy.ui.interpreter.ValueInterpreter;import net.l2emuproject.proxy.ui.savormix.io.base.IOConstants;import net.l2emuproject.util.concurrent.L2ThreadPool;import net.l2emuproject.util.logging.L2Logger; /** * Dumps retail multisells. Prerequisites: empty inventory (to avoid inventory-based multisells showing one or few items), * last folk NPC is a {@code citizen} and you are within 255 distance of them. *  * @author _dev_ */public class MegaMultisellDump extends PpeAnalyticsScript implements InteractiveChatCommands, IOConstants{    @ScriptFieldAlias    private static final String LIST_ID = "dump_multisell_id";    @ScriptFieldAlias    private static final String LAST_PAGE = "dump_multisell_last";    @ScriptFieldAlias    private static final String SLOT_ID = "dump_multisell_slot";    @ScriptFieldAlias    private static final String SLOT_STACK = "dump_multisell_slot_stackable";    @ScriptFieldAlias    private static final String RECEIVABLE_COUNT = "dump_multisell_prod_cnt";    @ScriptFieldAlias    private static final String CONSUMABLE_COUNT = "dump_multisell_cons_cnt";    @ScriptFieldAlias    private static final String RECEIVEABLE_ITEM = "dump_multisell_prod_item";    @ScriptFieldAlias    private static final String RECEIVEABLE_AMOUNT = "dump_multisell_prod_amount";    @ScriptFieldAlias    private static final String CONSUMABLE_ITEM = "dump_multisell_cons_item";    @ScriptFieldAlias    private static final String CONSUMABLE_AMOUNT = "dump_multisell_cons_amount";        static final Path OUTPUT_ROOT = DATA_MINING_DIRECTORY.resolve("multisell");        private Leech _leech;    private Future<?> _task;        private Multisell _activeMultisell;        @Override    public void handleClientPacket(RandomAccessMMOBuffer<L2TypedPacketPayloadField> buf, ICacheServerID cacheContext) throws RuntimeException    {        if (_task != null && !_task.isDone())            return;                final IPacketAuthor auth = buf.getPacketAuthor();        if (!(auth instanceof L2GameClient))            return; // non-interactive mode                    final String[] cmd = buf.seekSingleField(CHAT_COMMAND).readS().split(" ");        if (!"\\\\dump_multisell".equals(cmd[0]))            return; // just random chat                    final L2GameClient client = (L2GameClient)auth;        try        {            final int from = Integer.parseInt(cmd[1]);            final int to = Integer.parseInt(cmd[2]);                        _leech = new Leech((L2GameServer)client.getServer(), from, to);            _task = L2ThreadPool.submitLongRunning(_leech);        }        catch (RuntimeException e)        {            try            {                ClientPacketSender.sendChatMessage(client, 5, "SYS", "\\\\dump_multisell id_min id_max");            }            catch (UnknownPacketStructureException e1)            {                // ignore            }            return;        }    }        @Override    public void handleServerPacket(RandomAccessMMOBuffer<L2TypedPacketPayloadField> buf, ICacheServerID cacheContext) throws RuntimeException    {        if (_leech == null)            return;                final int id = buf.seekSingleField(LIST_ID).readD();        final boolean last = buf.seekSingleField(LAST_PAGE).readD() != 0;                final List<L2TypedPacketPayloadField> slots = buf.getFieldIndices(SLOT_ID);        if (_activeMultisell == null)            _activeMultisell = new Multisell(id, new ArrayList<MultisellSlot>(slots.size()));                final List<L2TypedPacketPayloadField> stacks = buf.getFieldIndices(SLOT_STACK);        final List<L2TypedPacketPayloadField> recCnts = buf.getFieldIndices(RECEIVABLE_COUNT);        final List<L2TypedPacketPayloadField> conCnts = buf.getFieldIndices(CONSUMABLE_COUNT);                int curRecIdx = -1, curConIdx = -1;        final List<L2TypedPacketPayloadField> recItems = buf.getFieldIndices(RECEIVEABLE_ITEM);        final List<L2TypedPacketPayloadField> recAmounts = buf.getFieldIndices(RECEIVEABLE_AMOUNT);        final List<L2TypedPacketPayloadField> conItems = buf.getFieldIndices(CONSUMABLE_ITEM);        final List<L2TypedPacketPayloadField> conAmounts = buf.getFieldIndices(CONSUMABLE_AMOUNT);                for (int i = 0; i < slots.size(); ++i)        {            final int received = buf.seekField(recCnts.get(i)).readH();            final int consumed = buf.seekField(conCnts.get(i)).readH();                        final MultisellSlot slot = new MultisellSlot(buf.seekField(slots.get(i)).readD(), buf.seekField(stacks.get(i)).readC() != 0, new ArrayList<MultisellItem>(received),                    new ArrayList<MultisellItem>(consumed));            for (int j = 0; j < received; ++j)            {                final int item = buf.seekField(recItems.get(++curRecIdx)).readD();                final long amount = buf.seekField(recAmounts.get(curRecIdx)).readQ();                slot._receivables.add(new MultisellItem(item, amount));            }            for (int j = 0; j < consumed; ++j)            {                final int item = buf.seekField(conItems.get(++curConIdx)).readD();                final long amount = buf.seekField(conAmounts.get(curConIdx)).readQ();                slot._consumables.add(new MultisellItem(item, amount));            }            _activeMultisell._slots.add(slot);        }                if (last)        {            final Multisell m = _activeMultisell;            _activeMultisell = null;            _leech.notifyContent(m);        }    }        @Override    public String getName()    {        return "Mega HTML dump";    }        private static final class Leech implements Runnable    {        private static final L2Logger LOG = L2Logger.getLogger(Leech.class);                private final L2GameServer _server;        private final int _min, _max;        private final ByteBuffer _buffer;        private final MMOBuffer _wrapper;                private Multisell _response;                Leech(L2GameServer server, int min, int max)        {            _server = server;            _min = min;            _max = max + 1;            _wrapper = new MMOBuffer();            _wrapper.setByteBuffer(_buffer = ByteBuffer.allocateDirect(1 << 16).order(ByteOrder.LITTLE_ENDIAN));            _wrapper.writeC(0x23);            _wrapper.append("menu_select?ask=-303&reply=");                        _response = null;        }                @Override        public synchronized void run()        {            LOG.info("Will attempt to dump " + (_max - _min) + " multisells in enforce_checking mode. Thank you for waiting :)");                        final int position = _buffer.position();            for (int i = _min; i < _max; ++i)            {                if (_server.isDced())                    break;                                _buffer.clear().position(position);                _wrapper.writeS(String.valueOf(i));                                _buffer.flip();                final byte[] content = new byte[_buffer.limit()];                _buffer.get(content);                _server.sendPacket(new ProxyRepeatedPacket(content));                                // right here, we wait (enforce_checking)                _response = null;                try                {                    wait(5000);                }                catch (InterruptedException e)                {                    break;                }                                if (_response == null)                {                    LOG.info("No response for multisell: " + i);                    continue;                }                                // run on the same thread to be safe                new MultisellWriter(_server.getProtocol().getVersion(), _response).run();            }                        LOG.info("Multisell dump completed.");        }                synchronized void notifyContent(Multisell content)        {            _response = content;            notify();        }    }        private static final class MultisellWriter implements Runnable    {        private static final L2Logger LOG = L2Logger.getLogger(MultisellWriter.class);                private final int _protocol;        private final Multisell _multisell;                MultisellWriter(int protocol, Multisell multisell)        {            _protocol = protocol;            _multisell = multisell;        }                @Override        public void run()        {            if (_multisell._slots.isEmpty())            {                LOG.info("Received empty multisell: " + _multisell._id);                return;            }                        // formatter is not thread safe            final DateFormat date = new SimpleDateFormat("yyyy-MM-dd");                        final String fdate = date.format(new Date());            final String protocol = String.valueOf(_protocol);            final Path dir = OUTPUT_ROOT.resolve("interactive").resolve(protocol).resolve(fdate);            try            {                Files.createDirectories(dir);            }            catch (IOException e)            {                LOG.error("Failed creating directory: " + dir, e);            }                        final String id = String.valueOf(_multisell._id);            final StringBuilder sb = new StringBuilder(9);            for (int i = id.length(); i < 5; ++i)                sb.append('0');            sb.append(id).append(".xml");                        final Path file = dir.resolve(sb.toString());            if (Files.exists(file))            {                LOG.info("Skipping existing XML: " + sb);                return;            }                        final ValueInterpreter<String> interp = NetProValueInterpreters.getInstance().getStringInterpreterOrDefault("Item");            try (final Writer w = Files.newBufferedWriter(file, StandardCharsets.UTF_8))            {                w.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\r\n<!-- Generated on ").append(fdate);                w.append(", server protocol revision ").append(protocol).append(" -->\r\n<multisell id=\"");                w.append(id).append("\">\r\n\t<options>\r\n\t\t<showAll>true</showAll>\r\n\t</options>\r\n");                                for (final MultisellSlot slot : _multisell._slots)                {                    w.append("\t<!-- ID: ").append(String.valueOf(slot._slotID)).append(" stackable: ");                    w.append(String.valueOf(slot._stackable)).append(" -->\r\n\t<item>\r\n");                    for (final MultisellItem item : slot._receivables)                    {                        final String clientName = interp.convert(item._item, null).trim();                        final String itemId = String.valueOf(item._item);                        if (!clientName.isEmpty() && !clientName.equals(itemId))                        {                            w.append("\t\t<!-- ").append(clientName).append(" -->\r\n");                        }                        w.append("\t\t<production id=\"").append(itemId).append("\" amount=\"");                        w.append(String.valueOf(item._amount)).append("\" />\r\n");                    }                    for (final MultisellItem item : slot._consumables)                    {                        final String clientName = interp.convert(item._item, null).trim();                        final String itemId = String.valueOf(item._item);                        if (!clientName.isEmpty() && !clientName.equals(itemId))                        {                            w.append("\t\t<!-- ").append(clientName).append(" -->\r\n");                        }                        w.append("\t\t<ingredient id=\"").append(itemId).append("\" amount=\"");                        w.append(String.valueOf(item._amount)).append("\" />\r\n");                    }                    w.append("\t</item>\r\n");                }                w.append("</multisell>\r\n");            }            catch (IOException e)            {                LOG.error("Failed writing XML: " + sb, e);            }        }    }        private static final class Multisell    {        final int _id;        final List<MultisellSlot> _slots;                Multisell(int id, List<MultisellSlot> slots)        {            _id = id;            _slots = slots;        }    }        private static final class MultisellSlot    {        final int _slotID;        final boolean _stackable; // allows to input amount instead of forcing '1'        final List<MultisellItem> _receivables, _consumables;                MultisellSlot(int slotID, boolean stackable, List<MultisellItem> receivables, List<MultisellItem> consumables)        {            _slotID = slotID;            _stackable = stackable;            _receivables = receivables;            _consumables = consumables;        }    }        private static final class MultisellItem    {        final int _item;        final long _amount;                MultisellItem(int item, long amount)        {            _item = item;            _amount = amount;        }    }} 
The prereqs are in javadoc. Then you just write '\\dump_multisell 1 300' in the game chat window and wait until multisells are written. Make sure you have examples.game.stealth.PseudoAdminCommandConsumer enabled, otherwise people will see what you are writing :)
Image
michael1414
Posts: 10
Joined: Sun Apr 27, 2014 12:17 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by michael1414 »

SaveGame wrote:Here's one that makes use of aliases already defined in included packet definitions:
...
Thanks for this script.
Indra
Posts: 14
Joined: Wed Apr 18, 2007 9:46 am

Re: NetPro: Packet Analysis and Visualization tool

Post by Indra »

thanks for the script. But anybody have a working script to sniff the buylists.
something like: open buylist -> save buylist in a text file or something else.
SaveGame
Posts: 121
Joined: Thu Oct 30, 2014 9:54 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by SaveGame »

Indra wrote:thanks for the script. But anybody have a working script to sniff the buylists.
something like: open buylist -> save buylist in a text file or something else.
There is no simple way to sniff the buylist, unless you want it to be written with 0 adena prices.
I had a basic script, but I think I deleted it because it was rather useless (though I must admit, as long as prices are not written, it is faster than manual creation). It is much better to sniff individual item "default" prices via private stores.
Image
Indra
Posts: 14
Joined: Wed Apr 18, 2007 9:46 am

Re: NetPro: Packet Analysis and Visualization tool

Post by Indra »

it will be cool if he save the buylists like this:

Code: Select all

	<tradelist npc="XXXX" shop="XXXX" markup="XXXX">
		<item id="45493" name="Fishing Rod Pack (30-day)"/>
		<item id="45495" name="Normal Bait"/>
		<item id="38154" name="Fishing Shot"/>
	</tradelist>
and filename = npc name or something to ident it.
SaveGame
Posts: 121
Joined: Thu Oct 30, 2014 9:54 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by SaveGame »

New release of 0.8-SNAPSHOT. Most (non-script/definition) changes are cosmetical, so there's no version increment.
This release should directly benefit those that voiced their opinions. I am sorry, I still did not have time to prepare any guides :(
FastLogin now supports PIN-less definitions.
FastLogin now supports Security Card authorization.
Added additional packet log filtering by regex, accessible right within the packet table. [michael1414]
Added the ability to pause/resume packet logging (capture) to the packet table. [michael1414]
Added IP aliases to be used within the UI (including free samples :).
Added a bottom information panel.
Changed L&F initialization to respect a manually set L&F system property, as well as to select the native L&F by default (instead of Nimbus). [LoneRanger]
[REDACTED: download the release listed ion the first post]

P.S. to retain the previous release L&F, modify the launcher bat/sh by adding the

Code: Select all

-Dswing.defaultlaf=com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel
JVM option.
Last edited by SaveGame on Sun Jan 11, 2015 9:08 am, edited 1 time in total.
Image
User avatar
CubAfull
Posts: 37
Joined: Wed Feb 03, 2010 9:02 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by CubAfull »

Hi, I want to test your program but I'm facing some problems.

Installed Java version: jre1.8.0_25 x64
Tested in SO: Windows 7 and 8.1

After running the NetPro_win.bat I can see the "Please enter your authorization key here".
After entering the key: "HgWjowlGVfLmto3SZPsvUCx+nXjugWqYJdyh6AJiwPM=" I can see for a second the "grumpy cat" logo but nothing else.

In the log/java I have some files with this information:

Code: Select all

INFO [2015-01-08 01:49:13.063 -0300] L2JFreeConfig: Logging initialized.
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo: ___      ___                ________      .__________.
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo: `MM\     `M'                `MMMMMMMb.    |   3884   |
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo:  MMM\     M           /      MM    `Mb    |__________|
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo:  M\MM\    M   ____   /M      MM     MM ___  __   _____
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo:  M \MM\   M  6MMMMb /MMMMM   MM     MM `MM 6MM  6MMMMMb
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo:  M  \MM\  M 6M'  `Mb MM      MM    .M9  MM69 " 6M'   `Mb
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo:  M   \MM\ M MM    MM MM      MMMMMMM9'  MM'    MM     MM
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo:  M    \MM\M MMMMMMMM MM      MM         MM     MM     MM
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo:  M     \MMM MM       MM      MM         MM     MM     MM
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo:  M      \MM YM    d9 YM.  ,  MM         MM     YM.   ,M9
INFO [2015-01-08 01:49:13.110 -0300] ProxyInfo: _M_      \M  YMMMM9   YMMM9 _MM_       _MM_     YMMMMM9
-----------------------------------------------------------------------------------------------------------------------------------------------------={ Config }
INFO [2015-01-08 01:49:13.173 -0300] L2JFreeConfig$ConfigFileLoader: loading 'config\proxy.properties'
------------------------------------------------------------------------------------------------------------------------------------------------={ Thread Pool }
INFO [2015-01-08 01:49:13.188 -0300] L2ThreadPool: No scheduled thread pool has been manually initialized, so initializing default one.
INFO [2015-01-08 01:49:13.188 -0300] L2ThreadPool: No instant thread pool has been manually initialized, so initializing default one.
INFO [2015-01-08 01:49:13.188 -0300] L2ThreadPool: No long running thread pool has been manually initialized, so initializing default one.
INFO [2015-01-08 01:49:13.188 -0300] L2ThreadPool: L2ThreadPool: Initialized with
INFO [2015-01-08 01:49:13.188 -0300] L2ThreadPool: 	... 4/2147483647 scheduler,
INFO [2015-01-08 01:49:13.188 -0300] L2ThreadPool: 	... 0/2147483647 instant,
INFO [2015-01-08 01:49:13.188 -0300] L2ThreadPool: 	... 0/2147483647 long running thread(s).
----------------------------------------------------------------------------------------------------------------------------------------------------={ Utility }
INFO [2015-01-08 01:49:13.204 -0300] Shutdown: ShutdownHook: Initialized.
INFO [2015-01-08 01:49:13.204 -0300] DeadlockDetector: DeadlockDetector: Initialized.
I Cuba...
SaveGame
Posts: 121
Joined: Thu Oct 30, 2014 9:54 pm

Re: NetPro: Packet Analysis and Visualization tool

Post by SaveGame »

CubAfull wrote:Hi, I want to test your program but I'm facing some problems.

Installed Java version: jre1.8.0_25 x64
Tested in SO: Windows 7 and 8.1

After running the NetPro_win.bat I can see the "Please enter your authorization key here".
After entering the key: "HgWjowlGVfLmto3SZPsvUCx+nXjugWqYJdyh6AJiwPM=" I can see for a second the "grumpy cat" logo but nothing else.
Hello there.

Due to the fact that NetPro allows user-made scripts to be presented in source form, you are required to run NetPro via a JDK executable (javaw/java) OR add the JDK's tools.jar to the classpath if running via a JRE.

Now, you might think "I have set up JAVA_HOME ages ago and added that to PATH before system32, so javaw in use WILL be from the JDK".
However, recent Oracle JDK installers have started prepending 'javapath' entries to PATH. So after every installation, you must now manually move your JAVA_HOME related entry before the javapath entry, so that

Code: Select all

where javaw
would look like this:
Image

In any case, I will do a new release, so that a proper warning is shown to the user in this scenario.

Thank you for the report.
SaveGame
Image
Post Reply