游戏封包反跟踪(NP)为了不让用户轻易将反跟踪程序去消,其实现的往往是采用某种动态算法,并与游戏服务器相通信。
我们如果想去消游戏封包反跟踪(NP)程序的反跟踪,那么必须对反跟踪代码的行为进行分析,找出算法后,我们就可以仿照它的行为而实施我们的模拟反跟踪。
反跟踪 NP 一旦去消,我们又可以用HOOK原理来实施我们对封包信息的截获工作了。当然纯粹为了跟踪封包,我们其实并不需要去对付反跟踪,因为我们还有很多其他途径来实施封包的跟踪,而在这些途径中有些原理本身就是无法被反跟踪的。
如何查找反跟踪程序,其实十分的简单,我们知道在进行判断之前,被判断的内存数据必须会被读取,因此我们只要给被分析代码所在的内存下一个读断点就行,然后用运行跟踪即可找到反跟踪代码段。
目前遇到一个NP的难题,一旦跳过NP就无法认证
不跳NP时正常连接为:
C -> S 02 58 //发送连接请求
S -> C 02 27 +16位KEY //接收16位随机密匙
C -> S 02 28 +16位根据KEY算出的结果 //发送16位密匙计算结果
S -> C 02 59 01 //服务器确认后返回标记,开始正常登陆
但如果跳过NP后:
C -> S 02 58 //发送连接请求
S -> C 02 27 +16位KEY //接收16位随机密匙
只到了这里客户端就不返回计算结果了,估计是检测不到NP运行所以就不返回结果
我推算有两种情况:
1)加密算法是单独的,不与NP挂钩,那么只需要搞点判断位,或模拟NP运行就行
2)加密算法作为NP一个模块,内嵌在NP,这样的话只能跟踪NP获得加密算法了
==================================================================================================
What is nProtect?
nProtect is a new concept web-based anti-hacking & anti-virus utility tool designed to protect PC terminals from being infected by viruses or hacking tools.
It helps to ensure that all information entered into the PC terminals during web access will not fall into the hands of hackers.
By deploying nProtect on their websites, financial institutions offering e-services, portals and e-commerce sites can increase the security level for the end-users when they perform electronic transactions
How does nProtect work?
nProtect is a server based solution and is automatically activated at the launch of any web page that requires the necessary protection.
nProtect is loaded onto the PC’s memory, so end-users do not need to install any application to enjoy the security protection. Once nProtect is activated, it offers the terminal real-time protection against hacking tools and viruses. Here’s how it works.
1) nProtect auto-launches when the user logs-in
2) The web browser checks and auto-installs the security module in the users?PC (new users/ outdated version)
3) Scans for hacking tools and viruses
4) Inform users about the security status
5) Attempts to remove hacking tools and viruses, if any
6) Resides in the main memory to block hacking tools from intruding until the PC or nProtect is closed.
--------------------------------------------------------------------------------------------------
How to implement the Data Encryption Standard (DES)
A step by step tutorial
Version 1.2
The Data Encryption Standard (DES) algorithm, adopted by the U.S.
government in 1977, is a block cipher that transforms 64-bit data blocks
under a 56-bit secret key, by means of permutation and substitution. It
is officially described in FIPS PUB 46. The DES algorithm is used for
many applications within the government and in the private sector.
This is a tutorial designed to be clear and compact, and to provide a
newcomer to the DES with all the necessary information to implement it
himself, without having to track down printed works or wade through C
source code. I welcome any comments.
Matthew Fischer <[EMAIL="mfischer@heinous.isca.uiowa.edu"]mfischer@heinous.isca.uiowa.edu[/EMAIL]>
Here's how to do it, step by step:
1 Process the key.
1.1 Get a 64-bit key from the user. (Every 8th bit is considered a
parity bit. For a key to have correct parity, each byte should contain
an odd number of "1" bits.)
1.2 Calculate the key schedule.
1.2.1 Perform the following permutation on the 64-bit key. (The parity
bits are discarded, reducing the key to 56 bits. Bit 1 of the permuted
block is bit 57 of the original key, bit 2 is bit 49, and so on with bit
56 being bit 4 of the original key.)
Permuted Choice 1 (PC-1)
57 49 41 33 25 17 9
1 58 50 42 34 26 18
10 2 59 51 43 35 27
19 11 3 60 52 44 36
63 55 47 39 31 23 15
7 62 54 46 38 30 22
14 6 61 53 45 37 29
21 13 5 28 20 12 4
1.2.2 Split the permuted key into two halves. The first 28 bits are
called C[0] and the last 28 bits are called D[0].
1.2.3 Calculate the 16 subkeys. Start with i = 1.
1.2.3.1 Perform one or two circular left shifts on both C[i-1] and
D[i-1] to get C[i] and D[i], respectively. The number of shifts per
iteration are given in the table below.
Iteration # 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Left Shifts 1 1 2 2 2 2 2 2 1 2 2 2 2 2 2 1
1.2.3.2 Permute the concatenation C[i]D[i] as indicated below. This
will yield K[i], which is 48 bits long.
Permuted Choice 2 (PC-2)
14 17 11 24 1 5
3 28 15 6 21 10
23 19 12 4 26 8
16 7 27 20 13 2
41 52 31 37 47 55
30 40 51 45 33 48
44 49 39 56 34 53
46 42 50 36 29 32
1.2.3.3 Loop back to 1.2.3.1 until K[16] has been calculated.
2 Process a 64-bit data block.
2.1 Get a 64-bit data block. If the block is shorter than 64 bits, it
should be padded as appropriate for the application.
2.2 Perform the following permutation on the data block.
Initial Permutation (IP)
58 50 42 34 26 18 10 2
60 52 44 36 28 20 12 4
62 54 46 38 30 22 14 6
64 56 48 40 32 24 16 8
57 49 41 33 25 17 9 1
59 51 43 35 27 19 11 3
61 53 45 37 29 21 13 5
63 55 47 39 31 23 15 7
2.3 Split the block into two halves. The first 32 bits are called L[0],
and the last 32 bits are called R[0].
2.4 Apply the 16 subkeys to the data block. Start with i = 1.
2.4.1 Expand the 32-bit R[i-1] into 48 bits according to the
bit-selection function below.
Expansion (E)
32 1 2 3 4 5
4 5 6 7 8 9
8 9 10 11 12 13
12 13 14 15 16 17
16 17 18 19 20 21
20 21 22 23 24 25
24 25 26 27 28 29
28 29 30 31 32 1
2.4.2 Exclusive-or E(R[i-1]) with K[i].
2.4.3 Break E(R[i-1]) xor K[i] into eight 6-bit blocks. Bits 1-6 are
B[1], bits 7-12 are B[2], and so on with bits 43-48 being B[8].
2.4.4 Substitute the values found in the S-boxes for all B[j]. Start
with j = 1. All values in the S-boxes should be considered 4 bits wide.
2.4.4.1 Take the 1st and 6th bits of B[j] together as a 2-bit value
(call it m) indicating the row in S[j] to look in for the substitution.
2.4.4.2 Take the 2nd through 5th bits of B[j] together as a 4-bit
value (call it n) indicating the column in S[j] to find the substitution.
2.4.4.3 Replace B[j] with S[j][m][n].
Substitution Box 1 (S[1])
14 4 13 1 2 15 11 8 3 10 6 12 5 9 0 7
0 15 7 4 14 2 13 1 10 6 12 11 9 5 3 8
4 1 14 8 13 6 2 11 15 12 9 7 3 10 5 0
15 12 8 2 4 9 1 7 5 11 3 14 10 0 6 13
S[2]
15 1 8 14 6 11 3 4 9 7 2 13 12 0 5 10
3 13 4 7 15 2 8 14 12 0 1 10 6 9 11 5
0 14 7 11 10 4 13 1 5 8 12 6 9 3 2 15
13 8 10 1 3 15 4 2 11 6 7 12 0 5 14 9
S[3]
10 0 9 14 6 3 15 5 1 13 12 7 11 4 2 8
13 7 0 9 3 4 6 10 2 8 5 14 12 11 15 1
13 6 4 9 8 15 3 0 11 1 2 12 5 10 14 7
1 10 13 0 6 9 8 7 4 15 14 3 11 5 2 12
S[4]
7 13 14 3 0 6 9 10 1 2 8 5 11 12 4 15
13 8 11 5 6 15 0 3 4 7 2 12 1 10 14 9
10 6 9 0 12 11 7 13 15 1 3 14 5 2 8 4
3 15 0 6 10 1 13 8 9 4 5 11 12 7 2 14
S[5]
2 12 4 1 7 10 11 6 8 5 3 15 13 0 14 9
14 11 2 12 4 7 13 1 5 0 15 10 3 9 8 6
4 2 1 11 10 13 7 8 15 9 12 5 6 3 0 14
11 8 12 7 1 14 2 13 6 15 0 9 10 4 5 3
S[6]
12 1 10 15 9 2 6 8 0 13 3 4 14 7 5 11
10 15 4 2 7 12 9 5 6 1 13 14 0 11 3 8
9 14 15 5 2 8 12 3 7 0 4 10 1 13 11 6
4 3 2 12 9 5 15 10 11 14 1 7 6 0 8 13
S[7]
4 11 2 14 15 0 8 13 3 12 9 7 5 10 6 1
13 0 11 7 4 9 1 10 14 3 5 12 2 15 8 6
1 4 11 13 12 3 7 14 10 15 6 8 0 5 9 2
6 11 13 8 1 4 10 7 9 5 0 15 14 2 3 12
S[8]
13 2 8 4 6 15 11 1 10 9 3 14 5 0 12 7
1 15 13 8 10 3 7 4 12 5 6 11 0 14 9 2
7 11 4 1 9 12 14 2 0 6 10 13 15 3 5 8
2 1 14 7 4 10 8 13 15 12 9 0 3 5 6 11
2.4.4.4 Loop back to 2.4.4.1 until all 8 blocks have been replaced.
2.4.5 Permute the concatenation of B[1] through B[8] as indicated below.
Permutation P
16 7 20 21
29 12 28 17
1 15 23 26
5 18 31 10
2 8 24 14
32 27 3 9
19 13 30 6
22 11 4 25
2.4.6 Exclusive-or the resulting value with L[i-1]. Thus, all together,
your R[i] = L[i-1] xor P(S[1](B[1])...S[8](B[8])), where B[j] is a 6-bit
block of E(R[i-1]) xor K[i]. (The function for R[i] is written as, R[i] =
L[i-1] xor f(R[i-1], K[i]).)
2.4.7 L[i] = R[i-1].
2.4.8 Loop back to 2.4.1 until K[16] has been applied.
2.5 Perform the following permutation on the block R[16]L[16].
Final Permutation (IP**-1)
40 8 48 16 56 24 64 32
39 7 47 15 55 23 63 31
38 6 46 14 54 22 62 30
37 5 45 13 53 21 61 29
36 4 44 12 52 20 60 28
35 3 43 11 51 19 59 27
34 2 42 10 50 18 58 26
33 1 41 9 49 17 57 25
This has been a description of how to use the DES algorithm to encrypt
one 64-bit block. To decrypt, use the same process, but just use the keys
K[i] in reverse order. That is, instead of applying K[1] for the first
iteration, apply K[16], and then K[15] for the second, on down to K[1].
Summaries:
Key schedule:
C[0]D[0] = PC1(key)
for 1 <= i <= 16
C[i] = LS[i](C[i-1])
D[i] = LS[i](D[i-1])
K[i] = PC2(C[i]D[i])
Encipherment:
L[0]R[0] = IP(plain block)
for 1 <= i <= 16
L[i] = R[i-1]
R[i] = L[i-1] xor f(R[i-1], K[i])
cipher block = FP(R[16]L[16])
Decipherment:
R[16]L[16] = IP(cipher block)
for 1 <= i <= 16
R[i-1] = L[i]
L[i-1] = R[i] xor f(L[i], K[i])
plain block = FP(L[0]R[0])
To encrypt or decrypt more than 64 bits there are four official modes
(defined in FIPS PUB 81). One is to go through the above-described
process for each block in succession. This is called Electronic Codebook
(ECB) mode. A stronger method is to exclusive-or each plaintext block
with the preceding ciphertext block prior to encryption. (The first
block is exclusive-or'ed with a secret 64-bit initialization vector
(IV).) This is called Cipher Block Chaining (CBC) mode. The other two
modes are Output Feedback (OFB) and Cipher Feedback (CFB).
When it comes to padding the data block, there are several options. One
is to simply append zeros. Two suggested by FIPS PUB 81 are, if the data
is binary data, fill up the block with bits that are the opposite of the
last bit of data, or, if the data is ASCII data, fill up the block with
random bytes and put the ASCII character for the number of pad bytes in
the last byte of the block. Another technique is to pad the block with
random bytes and in the last 3 bits store the original number of data bytes.
The DES algorithm can also be used to calculate checksums up to 64 bits
long (see FIPS PUB 113). If the number of data bits to be checksummed is
not a multiple of 64, the last data block should be padded with zeros. If
the data is ASCII data, the first bit of each byte should be set to 0.
The data is then encrypted in CBC mode with IV = 0. The leftmost n bits
(where 16 <= n <= 64, and n is a multiple of 8) of the final ciphertext
block are an n-bit checksum
--------------------------------------------------------------------------------------------------
[GMS] Hacking 101 [Bypassing, addresses, pointers]
Announcements
=============
irc.fukt.us #maplestory
/server -m irc.fukt.us -j #maplestory
Remember that IRC is not the same as the forum. You may not be treated too kindly.
- I will no longer be giving support in this thread. Most questions are now repeats. Before asking a question please try searching the forum or reading through the pages of this thread.
- The correct DBK32 file has now be uploaded.
- Thank Diddle for the alternate download location on MPC.
- I have changed my AIM and MSN settings to disallow people who aren't on my buddy list from contacting me. So please don't add me to your MSN or PM me on the forum either.
Common Problems
===============
If you can only use godmode and nothing else [one register change],
then you need the modified DBK32 file.
If your computer reboots when you start MapleStory with CheatEngine
then try using Abyss webserver and checking over your hosts file / rev 566 server files.
If DupeX ListOffset value doesn't increase
then there is someone on the map, or you don't have the modified DBK32 file.
More to come...
contribute by replying...
The Bypass
==========
What it does. This method of bypassing GameGuard emulates a GameGuard server on your own computer. That means instead of MapleStory looking fofr the GameGuard server on it's own website, it will read and update from your own computer. SunBeam put it best when he wrote in his thread (526K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3#2H3j5$3k6G2M7Y4g2E0i4K6u0W2j5$3!0E0i4K6u0r3M7$3S2G2N6%4c8Z5M7X3g2S2k6q4)9J5k6i4m8Z5M7q4)9K6c8Y4c8Q4x3@1b7I4x3U0V1@1z5e0j5`.):
Quote:
Originally Posted by SunBeamThis method of "defeating" GameGuard came to life in 2001-2002. The first game ever having this protection was and still is - MU Online. The ideea of making a server that would "update" GameGuard with old files was commonly used at that time. People simply updated the tutorial and used it on other games that received GameGuard's "blessing". Which brings us to these days.
GameGuard uses a module that determines speed of transfer and checks if updates for any of its modules are available. If yes, the update begins, the modules are re-initialised, then launched and the game starts.
Formerly, the tutorial stated that in order to achieve server emulation, one needed to know what GameGuard "tells" the server. In simpler terms, where does GameGuard update from and what is the server's structure. Using a simple firewall, one can find the site, but can't determine the server directory from which GameGuard updates. For that I think I've heard something about a program called Ethereal which caught packets upon send. But it seems, GameGuard's packets are also encrypted nowadays.
Getting started installing.
===========================
This tutorial, due to my lack of knowlege, only will explain how to install Apache. I'm sorry for the inconvenience. Moving on, once you have downloaded the Apache installer, run the file and go through the prompts. It is a standard installer file, and will ask you to confirm the license aggreement and (if you selected custom installation) ask you to choose a install location. It will ask you if you would like to install it as a service on port 80, or as an executable on port 8080. You must install it as a service for this to work. Once you get to the server configuration step, it will ask you for the server name, network name, and email address.
a) If you are not on a router, skip to step 1b. If you are, you will need to visit a69K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6i4N6Z5j5i4c8A6M7$3#2&6K9i4m8Q4x3X3g2U0L8$3@1`. and copy your IP address down. Paste it into the server and network (first two) boxes of the Apache installer prompt. Skip to step c.
b) (If you are not on a router,) put 127.0.0.1 into the server name box and localhost into the network name box.
c) You may put any valid email address into the third box. (ex: [EMAIL="admin@uber-l33t.net"]admin@uber-l33t.net[/EMAIL], [EMAIL="mpcuser@hotmail.com"]mpcuser@hotmail.com[/EMAIL], etc.)
Extracting the GameGuard Server files.
======================================
You must pay careful attention to this step.
a) Navigate to My Computer and click Drive C, Program Files, Apache Group, Apache2, then htdocs.
b1) Create a folder named nProtect
b2) Open nProtect folder. Create a folder named GameGuard
b3) Open GameGuard folder. Create a folder named RealServer
c) Open RealServer folder. Open the zip file containing the Revision 566 GameGuard Server files.
d) Extract all files into RealServer.
Overwriting your hosts file.
============================
a) Navigate to My Computer. Click Drive C, Windows, system32, drivers, then etc.
b) Open the zip containing the modified hosts file.
c) Extract the file into the etc folder, overwriting the old file.
d) Right click hosts, click Properties. Make sure Read-Only is ticked. Click OK.
3) Vacuums
==========
Vacuum hacks in theory will take all the monsters on the map and move them to a desired location. Depending on the type of vacuum you use, dpeends on where they are moved to exactly.
With the 'wall' vacuum, you are changing the wall boundries of the map so that the mosnters will spawn to one point, while this works to an extent, if you change channel, you will be sucked to that point as well. Pointers are used for this vacuum.
With 'DupeX' vacuum, depending on the flavor you want, normal or monster, either all the monsters will be vacuumed to your posistion and follow you, or they will stay stationary. A auto-assemble injection code is used for this vacuum followed by a few register changes.
With a client sided 'EAX' vacuum, you and all monsters and NPCs will automatically be sucked to the point you input. Other players will not see you move from where you origionally were. This vacuum uses Hexadecimal converted X and Y coordinated inserted into the EAX register of an address.
With a server sided 'EAX' vacuum, you can specify a Y axis to be sucked to, along with all monsters and NPCs. Once there, you can walk anwhere on the Y axis, including on the air. When you jump, though, you will fall until you hit a surface, and then by sucked back to the Y axis. A noticable different between this and the clientsided version is that the other players will see you i nthe posistion you are really in. To use this vacuum, the same is done for client sided, except it uses different addresses. Optionally, you can use the X axis too, but some like to use a DupeX or Wall with this vacuum, so they can move still.
So now that you have all the information on these wonderful hacks, choose one you'd like to test drive.
MapleStory Global 0.21 Vacuums
a) Wall
=======
Add the following addresses manually to your Cheat Table.
Left Wall: 6C5794 (address) + 4 (offset);
Right Wall: 6C5794 (address) + C (offset);
Top Wall: 6C5794 (address) + 8 (offset);
Bottom Wall: 6C5794 (address) + 10 (offset);
X Coordinate: 6C6130 (address) + 564 (offset);
Y Coordinate: 6C6130 (address) + 568 (offset);
Your X and Y coordinates are the posistion of your character on the map. (OMG you're algebra class paid off?) The left, right, top and bottom walls are the boundries of the map.
To use this vacuum, move to a posistion you would like to suck the mosnters to. Generally, you must be in an area where the mosnters will not get stuck on the platforms when they are sucked. That means no platforms can be above or bellow you. It has to be somewhat of an empty area. Usually the far left and right are good wall vacuum locations.
When you have found an area, look at your X and Y coordinates. Double click your left wall value and change it to your X coordinate. Do the same for your right wall value. For your top and bottom all values, change them to your Y coordinate.
If you do not want to be sucked in with the rest of the monsters, do not change channel. To have all the mosnters spawn in your new vacuum area, you need to go through the map and kill everything. From then on, the monster will spawn within the new designated boundries.
==================================================================================================
Source of security hole:
INCA nProtect Gameguard
Methods of propagation: 095K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3g2F1k6#2)9J5k6h3&6H3M7X3!0@1k6h3y4@1i4K6u0W2j5$3!0E0i4K6u0r3M7r3q4J5N6r3&6W2M7W2)9J5k6h3S2@1L8b7`.`.
Vulnerable Operating Systems:
Windows 2000
Windows XP
Windows 2003
Non-Vulnerable Operating Systems:
Windows 9x
Vulnerability:
nProtect Gameguard is an application bundled with multiplayer games which
hides the game application process, monitors the entire memory range,
terminates applications defined by the game vendor and INCA to be cheats,
blocks certain calls to DirectX functions, and auto-updates itself.
To achieve some of these ends the program uses a kernel driver by the name
of nppt9x.vxd (Windows9x) and npptnt2.sys (Windows NT).
Due to the nature of Windows 9x design, the vulnerability we are about to
discuss has no bearing. A malicious individual could achieve the same ends
on Windows 9x without the need of the npptnt2.vxd driver.
This kernel mode driver allows any process to access it, and it modifies the
I/O permission mask for the calling process to allow unrestricted I/O in
user mode. The design of modern operating systems does not generally allow
for any I/O access from user mode code for system stability and security.
The driver uses undocumented kernel function Ke386SetIoAccessMap and
Ke386IoSetAccessProcess to achieve this; the driver is very similar to the
PortTalk sample available at 71aK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0W2P5h3!0F1k6r3I4G2k6$3W2U0i4K6u0W2L8%4u0Y4i4K6u0r3M7r3!0J5N6s2c8S2L8r3E0Q4x3V1k6H3L8%4u0@1N6r3q4D9K9#2)9J5k6h3S2@1L8b7`.`..
Allowing a process unrestricted I/O access has the following risks:
1. If the process behaves unexpectedly (for example, a stack corruption
returning to arbitrary code), I/O instructions could be issued, leading to
potential problems with the system, bad data, etc.
2. A malicious process could elevate its privilege level on the system by
using direct hardware access to read / write the hard disk, program the DMA
controller, etc., or it could damage the system by resetting CMOS,
formatting the hard drive, etc.
The driver is installed as a system service. Even when Gameguard and the
multiplayer game(s) are closed, the driver continues running. The driver is
accessible under a non-admin account and is activated every boot. It does
not uninstall when the application is removed and in fact will not even
uninstall if selected in Device Manager and told to uninstall. The driver
must be deleted manually, and the registry must be edited to remove the
remaining reference.
It is true that even with this vulnerabilty the user must still be tricked
into running a malicious application that exploits it. However, in South
Korea, where the Gameguard service is widely used, net cafes have become
part of the social fabric. These machines are ripe fruit for damage.
At the more challenging level, one could use this hardware access to turn
the PC into a zombie. One could datamine information (bypassing NTFS
permissions), commit DDoS attacks, or escalate privileges on the system, by
putting the IDE controller into PIO mode, searching the disk for the system
DLLs, and replacing them with code altered to grant admin privilege. The
possibilities at this level of hardware access are nearly endless.
The nProtect Gameguard program is very rare here in North America, despite
the impressive partner list of INCA. It would be premature, however, to
presume that the installed base for this exploit is tiny. Just two of the
games on the INCA partner list - Lineage I and Lineage II - have a total of
four million active subscribers worldwide. This is not including the users
who have cancelled their accounts with a game service that uses Gameguard,
or future buyers who will purchase a game service that uses Gameguard.
Reproduction and Proof of Concept:
See attached NPPTNT2Access.cpp for proof of concept attack.
See 601K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3I4A6L8X3g2S2k6$3f1J5i4K6u0W2j5$3!0E0i4K6u0r3M7r3c8K6i4K6u0r3M7r3c8K6i4K6g2X3N6s2y4Q4y4h3k6U0L8r3W2W2L8Y4c8Q4x3X3g2Z5N6r3#2D9 to download the Lineage
II PTS client, which is bundled with Gameguard. Please make sure to run the
lineageii.exe in order to patch up to the newest version. The driver is not
initially installed until the first login to the game world. In order to
install the driver without having an active subscription, please add the
following registry keys, which are standard for a non-PnP or NT4-style
driver, and reboot.
--------------------------------------------------------------------------------------------------
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NPPTNT2]
"Type"=dword:00000001
"Start"=dword:00000001
"ErrorControl"=dword:00000001
"ImagePath"=hex(2):5c,00,3f,00,3f,00,5c,00,43,00,3a,00,5c,00,57,00,49,00,4e,
00,\
44,00,4f,00,57,00,53,00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,\
00,5c,00,6e,00,70,00,70,00,74,00,4e,00,54,00,32,00,2e,00,73,00,79,00,73,00,\
00,00
"DisplayName"="NPPTNT2"
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NPPTNT2\Security]
"Security"=hex:01,00,14,80,90,00,00,00,9c,00,00,00,14,00,00,00,30,00,00,00,0
2,\
00,1c,00,01,00,00,00,02,80,14,00,ff,01,0f,00,01,01,00,00,00,00,00,01,00,00,\
00,00,02,00,60,00,04,00,00,00,00,00,14,00,fd,01,02,00,01,01,00,00,00,00,00,\
05,12,00,00,00,00,00,18,00,ff,01,0f,00,01,02,00,00,00,00,00,05,20,00,00,00,\
20,02,00,00,00,00,14,00,8d,01,02,00,01,01,00,00,00,00,00,05,0b,00,00,00,00,\
00,18,00,fd,01,02,00,01,02,00,00,00,00,00,05,20,00,00,00,23,02,00,00,01,01,\
00,00,00,00,00,05,12,00,00,00,01,01,00,00,00,00,00,05,12,00,00,00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NPPTNT2\Enum]
"0"="Root\\LEGACY_NPPTNT2\\0000"
"Count"=dword:00000001
"NextInstance"=dword:00000001
Solutions/Fixes:
nProtectRemover.cpp source has been provided to allow the creation of a
self-removal tool.
It is important to note the following:
Under an admin account, Gameguard will automatically replace any deleted
piece of itself upon the launching of the game application. Under a
non-admin account, the game application will not even function without the
driver in place. The user is forced, by fears of being compromised or by
the simple fact that the game will not run, not to play at all. The
alternative is for the user to exercise extreme caution in the applications
he or she chooses to run. Virus scanners will not detect or warn a user in
advance. In light of these issues, the burden upon the user is very high.
References: 5e4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3g2F1k6#2)9J5k6h3&6H3M7X3!0@1k6h3y4@1i4K6u0W2j5$3!0E0i4K6u0r3L8Y4m8J5L8%4c8W2j5%4c8Q4y4h3k6Y4j5h3#2W2k6%4g2S2M7X3c8Q4x3X3g2Z5N6r3@1`. a90K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3g2F1k6#2)9J5k6h3&6H3M7X3!0@1k6h3y4@1i4K6u0W2j5$3!0E0i4K6u0r3K9h3&6V1k6i4S2Q4x3X3g2Z5N6r3#2D9 8a0K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3W2F1j5$3q4Q4x3X3g2U0L8#2)9J5k6h3E0J5i4K6u0r3 cbeK9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8X3g2F1k6#2)9J5k6h3&6H3M7X3!0@1k6h3y4@1i4K6u0W2j5$3!0E0i4K6u0r3M7r3q4J5N6r3&6W2M7W2)9J5k6h3S2@1L8b7`.`. 283K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3#2E0L8$3N6U0K9r3q4J5N6q4)9J5k6h3y4G2L8g2)9J5c8R3`.`. bb4K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3u0W2P5h3!0F1k6r3I4G2k6$3W2U0i4K6u0W2L8%4u0Y4i4K6u0r3M7r3!0J5N6s2c8S2L8r3E0Q4x3V1k6H3L8%4u0@1N6r3q4D9K9#2)9J5k6h3S2@1L8b7`.`. f14K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8Y4N6%4N6#2)9J5k6h3I4A6L8X3g2S2k6$3f1J5i4K6u0W2j5$3!0E0i4K6u0r3M7r3c8K6i4K6u0r3M7r3c8K6i4K6g2X3N6s2y4Q4y4h3k6U0L8r3W2W2L8Y4c8Q4x3X3g2Z5N6r3#2D9
--------------------------------------------------------------------------------------------------
Credit:
The North American Lineage II Community.
-NPPTNT2Access.cpp
#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows
headers
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <winioctl.h>
#include <conio.h>
int main(int argc, char* argv[])
{
bool bCall = true;
// check args - if there is an arg and it is 0, don't call the IO control.
if (argc > 1 && 0 == strcmp(argv[1], "0"))
{
bCall = false;
}
puts("Opening \\\\.\\NPPTNT2\r");
HANDLE hFile = CreateFile("\\\\.\\NPPTNT2", 0, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, 0);
if (hFile != INVALID_HANDLE_VALUE)
{
if (bCall)
{
puts("Calling DeviceIoControl\r");
DWORD dwRet = 0;
// Take this line out and the _inp will give you an AV
DeviceIoControl(hFile, 0x958A2568, 0, 0, 0, 0, &dwRet, 0);
}
puts("About to _inp(0x378)\r");
__try
{
_inp(0x378);
}
__except(1)
{
puts("Failed reading port\r");
return 0;
}
puts("Success reading port\r");
-nProtectRemover.cpp
//nProtectRemover, delete the security threat nProtect from your system.
//Coded by MugiMugi
//I dont take any responsibility if this harm your system, but I higly doubt
it will.
#include <windows.h>
#include <winsvc.h>
#include <winbase.h>
#include <string>
#include <iostream>
bool StopService(LPCTSTR pszInternalName);
bool ServiceRemove(LPCTSTR pszInternalName);
int main(int, char**) {
std::string tmp;
std::cout << "This app will remove nProtect from your system, do you want
to continue type YES with big letters?\n:> ";
std::cin >> tmp;
if (tmp!="YES")
return 0;
std::cout << "Removing nProtect" << std::endl;
//Stoping npptnt2 service
if (!StopService("npptnt2"))
{
std::cout << "Unable to stop device npptnt2" << std::endl;
return 0;
}
//deleting npptnt2 service
if (!ServiceRemove("npptnt2"))
{
std::cout << "Unable to delete device npptnt2" << std::endl;
return 0;
}
//Deleting the registry stuff
RegDeleteKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\NPPTNT
2\\Security");
RegDeleteKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\NPPTNT
2\\Enum");
RegDeleteKey(HKEY_LOCAL_MACHINE,"SYSTEM\\CurrentControlSet\\Services\\NPPTNT
2");
//Deleting npptnt2.sys and nppt9x.vxd
char buffer[MAX_PATH];
GetSystemDirectory(buffer,MAX_PATH);
std::string base(buffer);
std::string filename = base + "\\npptnt2.sys";
DeleteFile(filename.c_str());
filename = base + "\\nppt9x.vxd";
DeleteFile(filename.c_str());
//Bye bye
return 0;
}
// Stop service
bool StopService(LPCTSTR pszInternalName) {
SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_CONNECT);
if (NULL == hSCM)
return false;
SC_HANDLE hService = OpenService(hSCM, pszInternalName, SERVICE_STOP);
if (NULL == hService)
{
CloseServiceHandle(hSCM);
return false;
}
SERVICE_STATUS ss;
bool bSuccess = ControlService(hService, SERVICE_CONTROL_STOP, &ss);
CloseServiceHandle(hService);
CloseServiceHandle(hSCM);
return bSuccess;
}