ПолезностиИсключительно для полезных тем из других разделов. Темы тут не создаются!
Темы сюда перемещаются из других разделов, и на их старых местах остаются постоянные перенаправления.
Maxno, список экспортируемых функций у дампа и у оригинальной длл одинаковый
UNetworkHandler::AddNetworkQueue - название функции как оно выглядит до компиляции внутри исходников
?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z - название функции как оно выглядит в экспорте длл, открываешь длл любым РЕ вьювером и смотришь экспорт...
__________________
Я здесь практически не появляюсь!, Skype - ikskor
чтобы перевести ?AddNetworkQueue@UNetworkHandler@@UAEHPAUNetworkPa cket@@@Z в более читабельный вид(прим. UNetworkHandler::AddNetworkQueue) ,можно воспользоваться undname.exe
поставляемой в комплексе с VS.
Продолжая тему про AddNetworkQueue, хочу поделится своими наработками, может кому-нибуть будут полезными ...
Что бы добавить свой пакет в массив, нужно выделить память, но просто выделить мало, нужно выделить где-то внутри ла2. Для выделения памяти я юзал ф-ию "L2MemoryAlloc", ее можно легко найти, она находится рядом с AddNetworkQueue. Выглядит она следующим образом:
В качестве параметров используются строки "NetCmd", "NetPacket" и размер. Строки указывают для чего резервируется память и выделяется в соответствующем месте. Вообще выделение памяти здесь звучит довольно не корректно, т.к выделения памяти по сути происходит не всегда и зависит от аргументов. Стоит еще отметить то, что вызывать нужно поразному для конкретного аргумента(cmd), не знаю с чем это связано, но при вызове ф-ии в регистрах должно быть то, что должно быть, иначе будет ошибка. Для выделения памяти под сам пакет и под структуру NetworkPacket, которую в дальнейшем мы будем добавлять, я юзал такие ф-ии:
Вообще это копипаст из клиента и адресс 01E6D6A4 будет действителен только для конкретных хроник - ИТ, найти в другом клиенте не должно вызвать проблем.
В первом случае мы выделяем память, куда положим свой пакет без его длинны, ID и если есть то и SubID. Во втором под структуру NetworkPacket. Заполняем и вызываем примерно таким образом:
murc, думаю клиенту при вызве этих функций важно лишь содержимое ecx, ибо по соглашению thiscall там должен быть указатель на объект которому принадлежит метод, а остальные регистры по идее не обязаны содержать то что содержат)
__________________
Я здесь практически не появляюсь!, Skype - ikskor
Товарищи, вы получив какие то данные из процесса l2 оперируете ими прямо в рамках внедренной dll или какимто макаром шлете основной программе (через sendmessage или по сети)? Ведь на внедряемый код наложено очень много ограничений. Вот цитата из статье с WASMа:
"Компилятор Delphi обычно генерирует в процедурах короткие переходы (JMP SHORT), но при большом размере процедуры могут появиться переходы по абсолютным адресам, поэтому внедряемый код желательно писать используя короткие процедуры, используя как можно меньше условий и циклов."
Как можно быть уверенным что что все переходы делфи сделала "короткими".
Так же как отлаживать внедренную dll? Как хотябы ее выгрузить из памяти процесса что бы я ее мог перекомпилировать и внедритль наново?
Yegor, эта цитата относится только к тем длл которые были внедрены в чужой процесс своим кривым загрузчиком. Если загружать длл через LoadLibrary или нормальным загрузчиком таких проблем нет.
Отлаживать - так же как и клиент =)
Чтобы выгрузить - пиши код который выгрузит %)
Если загружать длл через LoadLibrary или нормальным загрузчиком таких проблем нет.
кстати, не встречал нормального PE загрузчика в исходниках или хотяб в obj файле чтоб в свою прогу можно было норм внедрить? я чтот не смог найти чтоб работало и на XP и на висте с 7кой(
__________________
Я здесь практически не появляюсь!, Skype - ikskor
GoldFinch, непойму все таки как отлаживать мою dll. Сейчас пишу тв Delphi. Точнее как запустить отладку нашгел, но каждый раз после перекомпиляции dll получается прийдется перезагружать l2?