Вот наваял мод за полтора часа по типу
Visman пишет:2. Запретить у админов и модераторов использовать эту функцию. Если всех знаешь, то это наиболее приемлимо.
Вкл/выкл управляется из админки Разрешения
1. Выполнить в плагине DB management или в phpMyAdmin заменив #__ префиксом Вашей базы.
INSERT INTO #__config (conf_name, conf_value) VALUES('p_forb_rec', '1')
2. Открываем admin_permissions.php
3. После этого (~ 207 строка)
<tr>
<th scope="row">Разрешить дублирующие e-mail адреса</th>
<td>
<input type="radio" name="form[allow_dupe_email]" value="1"<?php if ($pun_config['p_allow_dupe_email'] == '1') echo ' checked="checked"' ?> /> <strong>Да</strong> <input type="radio" name="form[allow_dupe_email]" value="0"<?php if ($pun_config['p_allow_dupe_email'] == '0') echo ' checked="checked"' ?> /> <strong>Нет</strong>
<span>Будет ли позволено пользователям регистрироваться с e-mail адреса на который уже зарегистрирован другой пользователь. Если разрешиено, то при появлении дубликата предупреждающий e-mail высылается в список рассылки.</span>
</td>
</tr>
Добавляем это
<tr>
<th scope="row">Запретить восстановление паролей админов и модераторов</th>
<td>
<input type="radio" name="form[forb_rec]" value="1"<?php if ($pun_config['p_forb_rec'] == '1') echo ' checked="checked"' ?> /> <strong>Да</strong> <input type="radio" name="form[forb_rec]" value="0"<?php if ($pun_config['p_forb_rec'] == '0') echo ' checked="checked"' ?> /> <strong>Нет</strong>
<span>Ответ ДА закроет возможность подбора автопароля злоумышленникам, но админы и модераторы не смогут восстановить свой пароль.</span>
</td>
</tr>
4. Сохраните файл admin_permissions.php
5. Открываем login.php
6. Заменяем это (~ 138 строка)
$result = $db->query('SELECT id, username FROM '.$db->prefix.'users WHERE email=\''.$db->escape($email).'\'') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
На это
$result = $db->query('SELECT id, username, group_id FROM '.$db->prefix.'users WHERE email=\''.$db->escape($email).'\'') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
7. Заменяем этот цикл (~ 154 строка)
// Loop through users we found
while ($cur_hit = $db->fetch_assoc($result))
{
// Generate a new password and a new password activation code
$new_password = random_pass(8);
$new_password_key = random_pass(8);
$db->query('UPDATE '.$db->prefix.'users SET activate_string=\''.pun_hash($new_password).'\', activate_key=\''.$new_password_key.'\' WHERE id='.$cur_hit['id']) or error('Unable to update activation data', __FILE__, __LINE__, $db->error());
// Do the user specific replacements to the template
$cur_mail_message = str_replace('<username>', $cur_hit['username'], $mail_message);
$cur_mail_message = str_replace('<activation_url>', $pun_config['o_base_url'].'/profile.php?id='.$cur_hit['id'].'&action=change_pass&key='.$new_password_key, $cur_mail_message);
$cur_mail_message = str_replace('<new_password>', $new_password, $cur_mail_message);
pun_mail($email, $mail_subject, $cur_mail_message);
}
message($lang_login['Forget mail'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');
На этот
$errf = '';
// Loop through users we found
while ($cur_hit = $db->fetch_assoc($result))
{
if (!($pun_config['p_forb_rec'] == '1' && ($cur_hit['group_id'] == PUN_ADMIN || $cur_hit['group_id'] == PUN_MOD)))
{
// Generate a new password and a new password activation code
$new_password = random_pass(8);
$new_password_key = random_pass(8);
$db->query('UPDATE '.$db->prefix.'users SET activate_string=\''.pun_hash($new_password).'\', activate_key=\''.$new_password_key.'\' WHERE id='.$cur_hit['id']) or error('Unable to update activation data', __FILE__, __LINE__, $db->error());
// Do the user specific replacements to the template
$cur_mail_message = str_replace('<username>', $cur_hit['username'], $mail_message);
$cur_mail_message = str_replace('<activation_url>', $pun_config['o_base_url'].'/profile.php?id='.$cur_hit['id'].'&action=change_pass&key='.$new_password_key, $cur_mail_message);
$cur_mail_message = str_replace('<new_password>', $new_password, $cur_mail_message);
pun_mail($email, $mail_subject, $cur_mail_message);
}
else $errf.= htmlspecialchars($cur_hit['username']).$lang_common['ProhibitionUser'].'<br />';
}
message($errf.$lang_login['Forget mail'].' <a href="mailto:'.$pun_config['o_admin_email'].'">'.$pun_config['o_admin_email'].'</a>.');
8. Сохраните файл login.php
9. Открываем все файлы \lang\<язык>\common.php
10. Добавляем в массив элемент
'ProhibitionUser' => ' является модератором или администратором. Восстановление пароля запрещено!',
в каждом файле на своем языке.
11. Сохраните все файлы \lang\<язык>\common.php
12. Открываем profile.php
13. Заменем это (~ 59 строка)
$result = $db->query('SELECT activate_string, activate_key FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch new password', __FILE__, __LINE__, $db->error());
list($new_password_hash, $new_password_key) = $db->fetch_row($result);
На это
$result = $db->query('SELECT activate_string, activate_key, group_id, username FROM '.$db->prefix.'users WHERE id='.$id) or error('Unable to fetch new password', __FILE__, __LINE__, $db->error());
list($new_password_hash, $new_password_key, $new_group_id, $new_username) = $db->fetch_row($result);
if ($pun_config['p_forb_rec'] == '1' && ($new_group_id == PUN_ADMIN || $new_group_id == PUN_MOD))
message(htmlspecialchars($new_username).$lang_common['ProhibitionUser']);
14. Сохраните файл profile.php
Проверял на локальном сервере, как будто бы работает 
Над этим вариантом
Visman пишет:3. Дописать модуль для проверки количест безуспешных входов за определенный участок времени, при привышение числа попыток - блокировать ip адрес на страницах восстановления и входа на форум.
подумаю позже, как время появится.
Добавлено спустя 18 минут 3 секунды:
P.S. Забыл сказать, что после всех манипуляций нужно зайти в админку в Резрешения, поставить в появившемся переключателе Да или Нет и сохранить изменения. Обязательно!