Solving the problem: Connection attempt. The required "tag" parameter is missing. PHP Additional anti-hacking tools

This short post is about the Limit Login Attempts plugin, which allows you to protect the admin panels of WordPress blogs. A plugin that allows you to limit the number of attempts by blog hackers - hackers trying to enter the admin panel and take over the blog. There are quite a lot of methods and plugins to protect against hacking, and some of them are very serious. But young blog, with low traffic and authority, as a rule, nothing threatens. For the time being. But setting Limit Login Attempts is not even possible for a very “cool” blog, which I consider, but this moment, and your own modest web resource.

You will be surprised, but after I installed this plugin, I was surprised to find that an attacker under the name admin tried to penetrate my blog, and after unsuccessful attempts, he was blocked using the plugin for 24 hours. And only a few hours have passed since its installation!

Below is a screenshot of part of the letter that I received yesterday in my email:

I couldn’t help but remember how I discovered and fixed a “hole” in the blog topic. What if I left everything visible or selected login admin and an attacker would guess the password?

I hope that I have convinced you, dear webmasters, that such a very simple, but lightweight plugin will not interfere with your blog.

Briefly about installing and setting up the Limit Login Attempts plugin

Everything is absolutely simple: just find the plugin by searching in the admin panel for the corresponding name, install and activate.

Then from the Options, selecting the plugin, go to settings. In principle, you don’t need to change anything here, but I recommend checking the box that allows one of the Limit Login Attempts functions to send messages about hacker intrusion attempts to your e-mail. This plugin feature will allow you to receive a quick summary of hacking attempts.

How the Limit Login Attempts plugin works

is based on restricting access to the site’s admin panel when entering a login and password. In other words, it creates a limit on the number of authorization attempts, including cookie support, based on the Internet user’s IP address. Having the site administrator log out of the panel every time, and constantly clear cookies, is an extremely thankless task. In this case, the Limit Login Attempts plugin is simply irreplaceable.

The plugin, among other things, provides the hacker’s IP address and can be used to identify and punish the hacker by all available means.

Additional anti-hacking measures

This article, as I indicated above, is no longer the only one about the security of WordPress sites. In my earlier, but more detailed manual about website security - ““, - I also touched on the topic of plugins designed for a similar function. In particular, about two more plugins that can work in conjunction. These are the Login LockDown + Anti-XSS attack plugins (probably the Limit Login Attempts + Anti-XSS attack combination will work similarly), the work of which Alexey Kozymaev talks about in his video tutorial. I decided to post the video on this page.

As an additional remedy against attacks on the site, I also recommend a plugin, which I have never mentioned in my posts. It's called Block Bad Queries (BBQ); This plugin automatically protects your site from malicious URL requests. Installation is via search in the admin panel, no settings required.

(Visited 43 times, 1 visits today)

I'm getting this error. Required parameter "tag" is missing in android toaster, please help, I can't find my error below. I have the Android user code and the php server code above. I'm using the volley library for httprequests.

StringRequest strReq = new StringRequest(Request.Method.POST, AppConfig.URL_REGISTER, new Response.Listener () ( @Override public void onResponse(String response) ( Log.d(TAG, "Register Response: " + response.toString()); hideDialog(); try ( JSONObject jObj = new JSONObject(response); boolean error = jObj.getBoolean("error"); if (!error) ( // User successfully stored in MySQL // Now store the user in sqlite String uid = jObj.getString("uid"); JSONObject user = jObj.getJSONObject(" user"); String name = user.getString("name"); String email = user.getString("email"); String created_at = user .getString("created_at"); // Inserting row in users table db.addUser (name, email, uid, created_at); // Launch login activity Intent = new Intent(RegisterActivity.this, LoginActivity.class); finish(); else ( // Error occurred in registration. Get the error // message String errorMsg = jObj.getString("error_msg"); Toast.makeText(getApplicationContext(), errorMsg, Toast.LENGTH_LONG).show(); ) ) catch (JSONException e) ( e.printStackTrace(); ) ) ), new Response.ErrorListener() ( @Override public void onErrorResponse(VolleyError error) ( Log.e(TAG, "Registration Error: " + error.getMessage()); Toast.makeText(getApplicationContext(), error.getMessage(), Toast.LENGTH_LONG).show(); hideDialog(); ) )) ( @Override protected Map getParams() ( // Posting params to register url Map params = new HashMap ();

params.put("tag", "register");

params.put("name", name); params.put("email", email); params.put("password", password); req) ( req.setTag(TAG); getRequestQueue().add(req); ) public void cancelPendingRequests(Object tag) ( if (mRequestQueue != null) ( mRequestQueue.cancelAll(tag); ) ) )

this is an android magazine

08-07 14:35:36.552 19120-20088/com.example.panos.chatsmartapp D/Volley﹕ BasicNetwork.logSlowRequests: HTTP response for request=< http://192.168.1.3/android_login_api/ 0x355f917 NORMAL 1>, , , 08-07 14:35:36.662 19120-19120/com.example.panos.chatsmartapp D/RegisterActivity﹕ Register Response: ("error":true,"error_msg":"Required parameter "tag" is missing!" ) 08-07 14:35:36.702 19120-19120/com.example.panos.chatsmartapp D/Toast﹕ checkMirrorLinkEnabled returns: false 08-07 14:35:36.702 19120-19120/com.example.panos.chatsmartapp D/Toast ﹕ showing allowed 08-07 14:35:36.702 19120-19120/com.example.panos.chatsmartapp D/Volley﹕ Request.finish: 4253 ms: http://192.168.1.3/android_login_api/ 0x355f917 NORMAL 1 08-07 14 :35:36.712 19120-19120/com.example.panos.chatsmartapp E/ViewRootImpl﹕ sendUserActionEvent() mView == null

this is php code

$tag, "error" => FALSE);

// check for tag type if ($tag == "login") ( // Request type is check Login $email = $_POST["email"]; $password = $_POST["password"]; // check for user $user = $db->getUserByEmailAndPassword($email, $password); if ($user != false) ( // user found $response["error"] = FALSE; $response["uid"] = $user ["unique_id"]; $response["user"]["name"] = $user["name"]; $response["user"]["email"] = $user["email"]; ["user"]["created_at"] = $user["created_at"]; $response["user"]["updated_at"] = $user["updated_at"]; echo json_encode($response) else (); // user not found // echo json with error = 1 $response["error"] = TRUE; $response["error_msg"] = "Incorrect email or password!"; echo json_encode($response) ) else if; ($tag == "register") ( // Request type is Register new user $name = $_POST["name"]; $email = $_POST["email"]; $password = $_POST["password"] ; // check if user is already existed if ($db->isUserExisted($email)) ( // user is already existed - error response $response["error"] = TRUE;

$response["error_msg"] = "User already existed";

echo json_encode($response);

Everyone has probably already encountered the warning: “You have three attempts left” that appears when logging in with a password. This is exactly the job this plugin does.

After installing and activating it, in the console, in the parameters section, a line with the name of this module will appear.

After following it we will find ourselves on the settings page.

The settings here are simple, and in Russian. The picture shows the default settings. Let's see what can be changed here.

The first field sets the number of additional attempts. I kept 3.

In the second, the duration of the first isolation is set. I think 20-30 minutes is fine.

The next field sets the number of isolations, after which the isolation time will be increased to 24 hours, or more, at your discretion.

I left 1 because who else but an attacker would make a mistake three times, and then, after half an hour, three more times. You have to be a complete sclerotic to do something like this without intent.

Let’s leave the connection to the site as “Direct connection”.

Process login cookies. “Yes” in this line is selected if you perform all work on the site in one browser. For example, I use four browsers, and that’s why I chose “No”.

To report isolation - it’s better to check both boxes, although mail doesn’t seem to be of any use for now, but it won’t hurt. In the future, if you continue to be interested in programming, these addresses can be analyzed.

That's it for the plugin settings Limit login Attempts finished. Now, if you return to the same page after a day or two, you will see the following picture in the statistics section.

This will mean that someone tried hard to get into your admin area using a special script, but they failed. You can “Clear log”.

Plugins for security in this .


Turn


One day I looked into the log /var/log/messages on a server running FreeBSD. The log turned out to be almost completely clogged with the following entries: kernel: Connection attempt to UDP 127.0.0.1:10441 from 127.0.0.1:53 kernel: Connection attempt to UDP 127.0.0.1:10441 from 127.0.0.1:53 kernel: Connection attempt to UDP 127.0 10445 from 127.0.1:53 Kernel: Conneption Attempt to UDP 127.0.1:10445 FROM 127.0.1:53 Kernel: Connection Attempt to UDP 192.0.32.10:6881 from Kernel: Conneption Attempt to UDP 127.0.0.1:10468 from 127.0.0.1:53 kernel: Connection attempt to UDP 127.0.0.1:10468 from 127.0.0.1:53 kernel: Connection attempt to UDP 127.0.0.1:10469 from 127.0.0.1:53 kernel: Connection attempt to UDP 127.0.0.1:10469 from 127.0.0.1:53 kernel: Connection attempt to UDP 127.0.0.1:10470 from 127.0.0.1:53

What would that mean?

Yandex pointed to the topic "Incomprehensible behavior of bind"
My question has already been answered there:
Connection attempt to UDP 127.0.0.1:10445 from 127.0.0.1:53 This line translates as: From socket 127.0.0.1:53 they tried to send a request via UPD to socket 127.0.0.1:10445, but no one is listening on port 10445 of address 127.0.0.1 . The connection failed. Let's see who is hanging on port 53? Privileged port (<1024) значит там должно быть что-то распространённое. # grep -w 53 /etc/services domain 53/tcp #Domain Name Server domain 53/udp #Domain Name Server А, это же порт DNS сервера. Кто на нём висит на самом деле? # sockstat -l | grep -w 53 USER COMMAND PID FD PROTO LOCAL ADDRESS FOREIGN ADDRESS bind named 19021 514 udp4 127.0.0.1:53 *:*

This is the BIND DNS server.

Why does he want to connect to a non-existent socket? The correct answer is given in the same topic: A certain program sends BIND a request to resolve a domain name. BIND takes so long to respond that the requesting program stops waiting for a response. bind finally sends a response, but no one is waiting for it. The kernel logs a failed connection.

What kind of program makes so many long DNS requests?

Why doesn't she wait for an answer?

The program was found quickly # sockstat | grep -w 53 nobody spamilter 9801 11 udp4 127.0.0.1:60037 127.0.0.1:53 nobody spamilter 9801 12 udp4 127.0.0.1:60038 127.0.0.1:53

The Sendmail mail server with anti-spam/anti-virus filters is running on one machine with DNS. spamilter is just an antispam filter.

Email (especially with modern bells and whistles like DKIM) is closely tied to DNS.

Therefore, I was not surprised by such activity.

An example of a long DNS request was quickly found in the sendmail logs - an attempt to resolve an address rcom-ne.com

# dig +trace rcom-ne.com ;<<>>DiG<<>> +trace rcom-ne.com ;; global options: printcmd . 172099 IN NS j.root-servers.net. . 172099 IN NS k.root-servers.net. . 172099 IN NS l.root-servers.net. . 172099 IN NS m.root-servers.net. . 172099 IN NS a.root-servers.net. . 172099 IN NS b.root-servers.net. . 172099 IN NS c.root-servers.net. . 172099 IN NS d.root-servers.net. . 172099 IN NS e.root-servers.net. . 172099 IN NS f.root-servers.net. . 172099 IN NS g.root-servers.net. . 172099 IN NS h.root-servers.net. . 172099 IN NS i.root-servers.net. ;; Received 244 bytes from 127.0.0.1#53(127.0.0.1) in 0 ms com. 172800 IN NS k.gtld-servers.net. com. 172800 IN NS b.gtld-servers.net. com. 172800 IN NS a.gtld-servers.net. com. 172800 IN NS j.gtld-servers.net. com. 172800 IN NS m.gtld-servers.net. com. 172800 IN NS c.gtld-servers.net. com. 172800 IN NS g.gtld-servers.net. com. 172800 IN NS f.gtld-servers.net. com. 172800 IN NS i.gtld-servers.net. com. 172800 IN NS d.gtld-servers.net. com. 172800 IN NS e.gtld-servers.net. com. 172800 IN NS l.gtld-servers.net. com. 172800 IN NS h.gtld-servers.net. ;; Received 501 bytes from 192.58.128.30#53(j.root-servers.net) in 52 ms rcom-ne.com. 172800 IN NS ns1.rcom-ne.com. rcom-ne.com. 172800 IN NS ns2.rcom-ne.com. ;; Received 97 bytes from 192.52.178.30#53(k.gtld-servers.net) in 55 ms ;; connection timed out; no servers could be reached The request fails due to a timeout.

Damn spammers, they will write addresses, and you check them.

So. Nothing bad happens. But you need to clear the log of these messages, otherwise they clog up really important information.

Treating symptoms

A radical way is to disable piercing of unsuccessful connections altogether. Through sysctl:# sysctl -d net.inet.tcp.log_in_vain net.inet.udp.log_in_vain net.inet.tcp.log_in_vain: Log all incoming TCP connections net.inet.udp.log_in_vain: Log all incoming UDP packets # sysctl net.inet. udp.log_in_vain=0 net.inet.udp.log_in_vain: 1 -> 0

But here we are throwing out the baby with the bathwater. I want to know who is breaking into my closed ports.

Trying to attach a filter to syslog is difficult, it increases the likelihood of failure of the logging system, and it’s simply ugly. Maybe you can disable logging for the loopback interface, is it of particular interest?

I didn’t find this on Google, let’s look at the sources.

# fgrep -rIn "Connection attempt to UDP" /usr/src/ /usr/src/sys/netinet/udp_usrreq.c:406: "Connection attempt to UDP %s:%d from %s:%d\n", /usr/src/sys/netinet6/udp6_usrreq.c:341: "Connection attempt to UDP [%s]:%d from [%s]:%d\n", # less +718 /usr/src/sys/ netinet/tcp_input.c switch (log_in_vain) ( case 1: if ((thflags & TH_SYN) == 0) break;

/* FALLTHROUGH */ case 2: log(LOG_INFO, "Connection attempt to TCP %s:%d " "from %s:%d flags:0x%02x\n", dbuf, ntohs(th->th_dport), sbuf , ntohs(th->th_sport), thflags); break;

default: break; )

It looks like there is only one switch and for all interfaces at once -

log_in_vain.

The symptoms cannot be eliminated, let's treat the disease.

Learning resolver

The message occurs when the program does not wait for a response from DNS. It is necessary that either the DNS respond faster, or the program waits longer.

How can I make a program wait longer?

For queries to dns, libc functions are used - res_query, res_search, res_mkquery, res_send... Other functions like gethostbyname are higher level and ultimately use these "primitives". The behavior of the res_query functions is determined by the /etc/resolv.conf file (the name and path of this file are hardcoded in the source code). We have two parameters

Other functions like gethostbyname are higher level and ultimately use these "primitives". timeout

And attempts. - waiting time for a response from the DNS server. attempts

- number of repeated requests to

dns server , if the first request was not answered.

Immediately after waiting for the first request, the second request is sent, and so on. Example resolv.conf

Nameserver 8.8.8.8 nameserver 8.8.4.4 options timeout:7 attempts:1 Default values ​​and limit values ​​can be found in

/usr/include/resolv.h

/* * Global defines and variables for resolver stub.

*/ ...... #define RES_TIMEOUT 5 /* min. seconds between retries */ #define RES_MAXRETRANS 30 /* only for resolv.conf/RES_OPTIONS */ #define RES_MAXRETRY 5 /* only for resolv.conf/RES_OPTIONS */ #define RES_DFLRETRY 2 /* Default #/tries. */ #define RES_MAXTIME 65535 /* Infinity, in milliseconds. */ .....

By default we have a 5 second wait and 2 retries. This is for each server we try to reach. For the example above, the maximum time to wait for a response (if both DNS servers fail) is 2 (servers) x 7 (timeout) x (1+1 (attempts)) = 28 seconds. My config was simpler

# cat /etc/resolv.conf domain myserver nameserver 127.0.0.1 It turned out 1x3x5 = 15. Let's check.<<>>DiG<<>> rcom-ne.com ;; global options: printcmd ;; connection timed out; no servers could be reached real 0m15.009s user 0m0.000s sys 0m0.006s Let's check our hypothesis about the reason for the message in the log.

Let's run it in one console

# (date;time dig rcom-ne.com;date) & Friday, February 11, 2011 16:46:49 (MSK) ;<<>>DiG<<>> rcom-ne.com ;; global options: printcmd ;; connection timed out; no servers could be reached real 0m15.009s user 0m0.000s sys 0m0.006s Friday, February 11, 2011 16:47:04 (MSK) And in another, in parallel, let's see which port is used dig#sockstat | grep dig root dig 71322 20 udp4 *:52170 *:* # grep 52170 /var/log/messages Mar 4 16:47:20 myserver kernel: Connection attempt to UDP 127.0.0.1:52170 from 127.0.0.1:53

dig waits 15 seconds for a response, and the response comes after (16:47:20 - 16:46:49 = 31 ~ 30) 30 seconds.

Now let's increase the response time to 30 seconds or even more.

Time for dig is timeout from resolv.conf

#date; time dig +time=12 rcom-ne.com;date Friday, March 4, 2011 17:07:46 (MSK) ;<<>>DiG<<>> +time=12 rcom-ne.com ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 61974 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;rcom-ne.com. IN A ;; Query time: 5998 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Fri Feb 11 17:08:16 2011 ;; MSG SIZE rcvd: 29 real 0m30.006s user 0m0.005s sys 0m0.000s пятница, 11 февраля 2011 г. 17:08:16 (MSK)

dig got the answer for 30 seconds, although he could have waited as long as 1x3x12=36.

Apparently, 30 seconds is a timeout for BIND itself. Let's remember this.

status: SERVFAIL means that the DNS server was unable to process the request due to problems with the DNS server (RFC 1035, RFC 2929).

“Well, I didn’t do it, I didn’t do it,” the server tells us, although we know that he simply did not wait for a response from the dns servers of the rcom-ne.com domain.

Personal approach

The settings in resolv.conf apply to all programs.

I don’t want to increase the maximum request time from 15 to 30 seconds (2 times) for all programs on the server.

Maybe you can adjust the resolver timeouts for individual programs?

see confTO_RESOLVER_RETRANS and confTO_RESOLVER_RETRY.

But we need to configure spamilter first. But he doesn’t have such settings. Editing resolv.conf also seemed to have no effect on it.

I tried to edit the source code, but I couldn’t achieve any results.

Note: After solving the problem, experimenting with resolv.conf and tcpdump, I found out that resolv.conf certainly influenced spamilter. Only it periodically sent 2 requests at the same time, instead of sending them after timeout seconds. Apparently this is a glitch in spamilter's multi-threaded architecture, although the resolver itself is described in man as thread-safe.

Cherished 30 seconds

I had to think about how to fix the BIND response time. I found a similar question on the Internet, but without an answer.

Frustrated, I looked for the treasured number 30 in the source code and was lucky.

The change history told me: /usr/src/contrib/bind9/CHANGES .................... --- 9.2.3rc1 released --- .... ................. 1122. Resolution timeout reduced from 90 to 30 seconds.

.................... --- 9.2.2 released --- ................... ..

The description looks like what I was looking for.

I downloaded both mentioned versions of BIND, made a diff and looked at it for a long time until I found it.

-/* $Id: resolver.c,v 1.218.2.12.4.4 2003/02/18 03:32:01 marka Exp $ */ +/* $Id: resolver.c,v 1.218.2.18 2003/07/18 04:35:51 marka Exp $ */ @@ -2234.7 +2229.7 @@ /* * Compute an expiration time for the entire fetch.

*/ - isc_interval_set(&interval, 90, 0); /* XXXRTH constant */ + isc_interval_set(&interval, 30, 0); /* XXXRTH constant */ iresult = isc_time_nowplusinterval(&fctx->expires, &interval);

if (iresult != ISC_R_SUCCESS) ( UNEXPECTED_ERROR(__FILE__, __LINE__,

I tried to reduce the parameter of the isc_interval_set function to and hurray - responses from BIND began to arrive in a maximum of 20 seconds.

# ee /usr/src/contrib/bind9/lib/dns/resolver.c # cd /usr/src/lib/bind # make obj && make depend && make && make install # cd /usr/src/usr.sbin/ named # make obj && make depend && make && make install # /etc/rc.d/named restart

But in production I didn’t edit anything, who knows what problems this could cause. It’s not for nothing that the developers set this parameter so strictly.

All over again

So, after spending a lot of time, I was still unable to solve the problem. Finally, I decided to look at what specific requests the spamilter bombards the DNS with, and what kind of addresses does BIND take a long time to resolve? Tcpdump -i lo0 -s 0 -w dns.pcap "udp port 53"

Let's open

dns.pcap in Wireshark and look at unsuccessful requests.

It turned out that in my assumptions I was very far from the truth.

90% of unanswered requests were to domains

list.dsbl.org multihop.dsbl.org unconfirmed.dsbl.org

Standard query A 146.152.225.99.list.dsbl.org

Using DNS queries, the spamilter penetrated the addresses of mail servers through spammer databases. This is DNSBL technology.

I went to dsbl.org and found that it had been defunct for a long time.

After searching through the configs, I found these addresses in the file /var/db/spamilter/db.rdnsbl and commented them out.

On the one hand, I was seriously screwed when, instead of thoroughly investigating the problem, looking at various logs, analyzing traffic, I immediately made assumptions and, based on them, began to look for solutions. As a result, I spent a lot of time and did a lot of unnecessary research. On the other hand, I learned a lot of interesting things about the work of the resolver. And DNS is the first place that needs to be checked when various delays occur in the operation of programs. So, there is still a benefit.

After the disappearance of the avalanche of incomplete DNS connections, the log remained clogged with connections to port 6881.

Kernel: Connection attempt to UDP 192.0.32.10:6881 from 188.85.194.61:24333

The global knowledge base suggested that UDP 6881 is most likely torrent clients trying to establish a DHT connection. A very probable version is that a torrent client was running on the server for a long time, and although it has long been deleted, the memory of it may never die in the hearts of other comrades.

We need to capture packets arriving on port 6881. I use Packet Filter pf(4) as a firewall/NAT. Immediately after the default blocking rule, we will add a rule for blocking and logging incoming upd connections on port 6881. Parameter quick causes the processing of other rules to stop if the packet matches the current one.

# ee /etc/pf.conf block in log quick on em0 proto udp from any to 192.0.32.10 port 6881 # pfctl -oonvf /etc/pf.conf # pfctl -oovf /etc/pf.conf

Within a few minutes we will write the results to a file for Wireshark.

# tcpdump -i pflog0 -s 0 -w 6881.pcap

Let's open the file in Wireshark and take a look. Unfortunately, DHT is not yet supported by the program. Therefore, all you can do is look at the packet for a signature.

d1:ad2:id20:+_,i<\^2e1:q4:ping1:t4:H1:v4:UTb1:y1:qe

Searching for the first bytes of the packet leads to a discussion of the DHT extension for Bittorrent. This means that these are indeed echoes of the long-term operation of the torrent client on the server.

Everything is fine. You just need to clear the log of such entries.

To do this, tell pf to silently drop packets arriving on port 6881 by adding the parameter drop and removing log.


Sometimes ATTEMPT_.HLP and other HLP system errors can be related to problems in the Windows registry. Several programs can use the ATTEMPT_.HLP file, but when those programs are uninstalled or modified, sometimes "orphaned" (incorrect) HLP registry entries are left behind.

Basically, this means that while the actual path of the file may have changed, its incorrect former location is still recorded in the Windows Registry. When Windows tries to look up these incorrect file references (file locations on your PC), ATTEMPT_.HLP errors can occur. Additionally, malware infection may have corrupted registry entries associated with FreeBSD 2.2.1. Thus, these corrupted HLP registry entries need to be fixed to fix the problem at the root.

Manually editing the Windows registry to remove invalid ATTEMPT_.HLP keys is not recommended unless you are PC service professional. Mistakes made when editing the registry can render your PC inoperable and cause irreparable damage to your operating system. In fact, even one comma placed in the wrong place can prevent your computer from booting!

Because of this risk, we highly recommend using a trusted registry cleaner such as WinThruster (Developed by Microsoft Gold Certified Partner) to scan and repair any ATTEMPT_.HLP-related registry problems. Using a registry cleaner, you can automate the process of finding corrupted registry entries, missing file references (such as the one causing the ATTEMPT_.HLP error), and broken links within the registry. Before each scan, a backup copy is automatically created, allowing you to undo any changes with one click and protecting you from possible damage to your computer. The best part is that eliminating registry errors can dramatically improve system speed and performance.


Warning: Unless you are an experienced PC user, we DO NOT recommend manually editing the Windows Registry. Using Registry Editor incorrectly may cause serious problems that may require you to reinstall Windows. We do not guarantee that problems resulting from incorrect use of Registry Editor can be corrected. You use Registry Editor at your own risk.

Before you manually restore the Windows registry, you must create a backup by exporting the portion of the registry associated with ATTEMPT_.HLP (for example, FreeBSD 2.2.1):

  1. Click on the button Begin.
  2. Enter " command" V search bar... DON'T CLICK YET ENTER!
  3. While holding down the keys CTRL-Shift on your keyboard, press ENTER.
  4. A dialog box for access will be displayed.
  5. Click Yes.
  6. The black box opens with a blinking cursor.
  7. Enter " regedit" and press ENTER.
  8. In the Registry Editor, select the ATTEMPT_.HLP-related key (for example, FreeBSD 2.2.1) that you want to back up.
  9. On the menu File select Export.
  10. On the list Save to select the folder where you want to save the FreeBSD 2.2.1 key backup.
  11. In field File name Enter a name for the backup file, for example "FreeBSD 2.2.1 backup".
  12. Make sure the field Export range value selected Selected branch.
  13. Click Save.
  14. The file will be saved with extension .reg.
  15. You now have a backup of your ATTEMPT_.HLP-related registry entry.

The following steps for manually editing the registry will not be described in this article, as they are likely to damage your system. If you would like more information about editing the registry manually, please check out the links below.