|
|
![Ответить в эту тему](style_images/uokit/t_reply.gif) ![Открыть новую тему](style_images/uokit/t_new.gif) |
Uoext. Расширяя Возможности Клиента, We do what EA can't. |
|
|
StaticZ |
15.4.2011, 20:47
|
![](https://forum.uokit.com/uploads/av-11948.gif)
![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif)
Разработчик проекта "Квинтэссенция"
Сообщений: 2.155
Регистрация: 15.6.2009 Группа: Пользователи Наличность: 0 Из: РФ, Москва
Пользователь №: 11.948
![](style_images/uokit/spacer.gif)
|
Еще один шажок на пути к революции остался позади... Спасибо за упорство и труды, главное не бросай начатое! (IMG: style_emoticons/default/wink.gif) За державу правда обидно, такая нелюбовь к русскому, что даже готов с словариком мучится переводить на буржуйский? Чето я уже немного отстал от этой темы, летом буду наверствовать... попробую чтонибудь путное через UOExt намутить и опробовать в полевых условиях... Кстати уже есть подвиги с рануошным модулем и енкриптом и вообще кто-то этим занимается? а то могу помочь как время появиться )
--------------------
RP сервер UO: Quintessence, а также ПО: EssenceUCS, EssenceUDK, CentrEd+, Fiddler+ и др.Game isn't a dream, it is the reality, reality which is coming while we dream...
|
|
|
|
Warstone |
15.4.2011, 23:31
|
![](https://forum.uokit.com/uploads/av-10905.gif?cache=rpg)
![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif)
Группа: Модераторы Наличность: 0
Пользователь №: 10.905
Возраст: 25
![](style_images/uokit/spacer.gif)
|
Цитата(StaticZ @ 15.4.2011, 21:47) ![*](style_images/uokit/post_snapback.gif) Еще один шажок на пути к революции остался позади... Спасибо за упорство и труды, главное не бросай начатое! (IMG: style_emoticons/default/wink.gif) За державу правда обидно, такая нелюбовь к русскому, что даже готов с словариком мучится переводить на буржуйский? Чето я уже немного отстал от этой темы, летом буду наверствовать... попробую чтонибудь путное через UOExt намутить и опробовать в полевых условиях... Кстати уже есть подвиги с рануошным модулем и енкриптом и вообще кто-то этим занимается? а то могу помочь как время появиться ) Ну... С Английским у меня проблем нету (или я о них не знаю), а модуль GPL, значить может быть и RunUO'шники с RunUO.com подтянуццо. РанУОшный модуль в зачаточном состоянии и пока на холде, так как не до него. Энкрипт работает. Автодетект клиента (шифрованный или не шифрованный) и хардкодед конфиг сервера (может быть как шифрованный так и не шифрованный). То есть можно не шифрованным клиентом подключаться к шифрованному серверу и после прохождения прокси протокол будет шифроваться. Всем этим занимаюсь я. Больше нету никого. Цитата(wap @ 15.4.2011, 23:07) ![*](style_images/uokit/post_snapback.gif) Я вообще по-русски в программно-технических постах Warstone с трудом что-то понимаю, а тут еще на английском. (IMG: style_emoticons/default/smile.gif) Спецом для тебя код с камментами одного куска из UOLoader'а: Код Function InjectDll(Process: dword; ModulePath, InitProcedureName: PAnsiChar): Boolean; const InjectThreadSize = 568; var Memory:pointer; Code, ICode: dword; BytesWritten: dword; ThreadId: dword; hThread: dword; hKernel32: dword; pInject: Pointer; begin // Here is codegenerate for CreateRemoteThread procedure // Main idea is: // hLibrary := LoadLibraryA('<ProtocolExtender.dll>'); // @pProcedure := GetProcAddress(hLibrary, 'CoreInitialize'); // pProcedure(); // stdcall, no params. // ExitThread(0); // Asm code: // PUSH <PointerToDllName> ; 68 GG GG GG GG // CALL <PointerToLoadLibraryA> ; 15 FF HH HH HH HH; EAX = hLibrary // PUSH <PointerToCoreInitialize>; 68 II II II II // PUSH EAX ; 50 // CALL <PointerToGetProcAddress>; 15 FF JJ JJ JJ JJ; EAX = @pProcedure // CALL EAX ; D0 FF // PUSH 0 ; 00 6A // CALL <PointerToExitThread> ; 15 FF KK KK KK KK // // Addr 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F // 0000: 68 GG GG GG GG 15 FF HH HH HH HH 68 II II II II // 0010: 50 15 FF JJ JJ JJ JJ FF D0 6A 00 15 FF KK KK KK // 0020: KK // Code ends here. Data begins here. // 0020: hh hh hh hh jj jj jj jj kk kk kk kk // 002D - 0132 : DllName: Array [0..MAX_PATH] of Byte; Addr of GG GG GG GG // 0133 - 0237 : DllInitProc: Array [0..MAX_PATH] of Byte; Addr of II II II II // // Needed memory: 568 bytes.
Result := False; Memory := VirtualAllocEx(Process, nil, InjectThreadSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE); if Memory = nil then Exit;
Code := dword(Memory);
pInject := GetMemory(InjectThreadSize); ICode := DWord(pInject); hKernel32 := GetModuleHandle('kernel32.dll');
PByte(pInject)^ := $68; // PUSH OpCode PDWord(ICode + $01)^ := Code + $2D; // PUSH Argument PWord(ICode + $05)^ := $15FF; // Call OpCode (LoadLibraryA) PDWord(ICode + $07)^ := Code + $21; // Call Argument PByte(ICode + $0B)^ := $68; // PUSH OpCode PDWord(ICode + $0C)^ := Code + $0133; // PUSH Argument PByte(ICode + $10)^ := $50; // PUSH EAX OpCode PWord(ICode + $11)^ := $15FF; // Call OpCode (GetProcAddr) PDWord(ICode + $13)^ := Code + $25; // Call Argument PWord(ICode + $17)^ := $D0FF; // CALL EAX OpCode PWord(ICode + $19)^ := $006A; // PUSH 0 OpCode PWord(ICode + $1B)^ := $15FF; // Call OpCode (ExitThread) PDWord(ICode + $1D)^ := Code + $29; // Call Argument // Code generation ends. Procedure pointers begin. PDWord(ICode + $21)^ := DWord(GetProcAddress(hKernel32, 'LoadLibraryA')); PDWord(ICode + $25)^ := DWord(GetProcAddress(hKernel32, 'GetProcAddress')); PDWord(ICode + $29)^ := DWord(GetProcAddress(hKernel32, 'ExitThread')); // Procedure pointers end. String constants begin. lstrcpyA(PAnsiChar(ICode + $2D), ModulePath); lstrcpyA(PAnsiChar(ICode + $0133), InitProcedureName);
//записать машинный код по зарезервированному адресу WriteProcessMemory(Process, Memory, pInject, InjectThreadSize, BytesWritten); FreeMemory(pInject); //выполнить машинный код hThread := CreateRemoteThread(Process, nil, 0, Memory, nil, 0, ThreadId);
if hThread = 0 then Exit; WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); Result := True; end; Если коротко, то тут идет кодогенерация и патчинг оффсетов для машинных кодов на лету. Идея честно потырена с wasm. Сделаны фиксы так как тот код в некоторых случаях может вызывать дедлоки и вообще себя нехорошо вести.
--------------------
Do. Or do not. There is no Try! © Master Joda, Dagobah, Star Wars: Episode V.
|
|
|
|
Warstone |
18.4.2011, 10:21
|
![](https://forum.uokit.com/uploads/av-10905.gif?cache=rpg)
![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif)
Группа: Модераторы Наличность: 0
Пользователь №: 10.905
Возраст: 25
![](style_images/uokit/spacer.gif)
|
Если не можешь - это хорошо... Но вообще надо поставить TortoiseSVN и там сделать checkout для http://uo-ext.googlecode.com/svn/trunk/ с пользователем uo-ext-read-only Если-же ты счастливый обладатель православного linux например Ubuntu, то: sudo apt-get install svn mkdir ~/uo-ext cd ~/uo-ext svn checkout http://uo-ext.googlecode.com/svn/trunk/ uo-ext-read-only
--------------------
Do. Or do not. There is no Try! © Master Joda, Dagobah, Star Wars: Episode V.
|
|
|
|
Warstone |
19.4.2011, 23:36
|
![](https://forum.uokit.com/uploads/av-10905.gif?cache=rpg)
![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif)
Группа: Модераторы Наличность: 0
Пользователь №: 10.905
Возраст: 25
![](style_images/uokit/spacer.gif)
|
Ну ессно не можешь... Это ядро. В идеале, когда запустил в релиз версии ты должен играть в нормальную УО без изменений. Все "фишки" делаются через плагины. Причем я, скорее всего, перепишу плагины так, что-бы результатом было 2 dll после компиляции... Что-то типа UOExt.client.dll и UOExt.server.dll. 2-я опциональная. Клиентская будет загружаться с сервера при входе на него ядром (UOExt.dll), инициализироваться и после этого будет запускаться сам клиент. Серверная будет использоваться в RunUO/Sphere/<YourEmulatorNameHere> и с ней пока все туманно.
На повестке дня:
- Надо-ли делать поддержку fpc/lazarus? Так как там довольно много надо переделывать. - Предложения, пожелания, плюшки?
На данный момент работаю над динамической статикой... Есть подвижки, но до релиза еще не скоро и, честно говоря, пока не знаю - буду-ли ее выкладывать в свободный доступ.
Да, еще один маилстоун: Для интеграции в ваши лоадеры/стартеры и т.д. Надо мне будет предусмотреть коммуникацию. Кстати, собственные лоадеры есть у кого? Ну которые проверяют дистриб допустим и патчат его по мере необходимости?
--------------------
Do. Or do not. There is no Try! © Master Joda, Dagobah, Star Wars: Episode V.
|
|
|
|
StaticZ |
22.4.2011, 0:47
|
![](https://forum.uokit.com/uploads/av-11948.gif)
![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif) ![*](style_images/uokit/pip.gif)
Разработчик проекта "Квинтэссенция"
Сообщений: 2.155
Регистрация: 15.6.2009 Группа: Пользователи Наличность: 0 Из: РФ, Москва
Пользователь №: 11.948
![](style_images/uokit/spacer.gif)
|
Цитата(Warstone @ 22.4.2011, 0:57) ![*](style_images/uokit/post_snapback.gif) Плагин динамической статики умеет отслеживать позицию клиента. Правда пока не опирается на подтверждение сервера (там по реджекту надо откатывать позицию, а пока не откатывается).
Вопрос: UpdateRange что, по умолчанию не отсылается ни клиентом ни сервером и всегда равен 18?
Нет, он вообще не отсылается это параметр ранки отвечающий за то на каком расстоянии от итема/мабайла шлутся клиентам пакеты о нем... для разных итемов мобайлов может быть свой UpdateRange. У меня например для мультисов завышен раза в 3-4 чтобы на радаре рисовались
--------------------
RP сервер UO: Quintessence, а также ПО: EssenceUCS, EssenceUDK, CentrEd+, Fiddler+ и др.Game isn't a dream, it is the reality, reality which is coming while we dream...
|
|
|
|
|
![Ответить в эту тему](style_images/uokit/t_reply.gif) ![Открыть новую тему](style_images/uokit/t_new.gif) |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|