Начинающий
-
Автор темы
- #1
Есть ли возможность разблокировать использование PanoramaScript на серверах Valve? Если да, то как?
Game.PlayersHeroEnts = function(){
var PlayersEnt = []
var PlayersIDs = Game.GetAllPlayerIDs()
for(i in PlayersIDs)
PlayersEnt.push( Players.GetPlayerHeroEntityIndex( PlayersIDs[i] ) )
return PlayersEnt
}
function _test(){
var test_x = Game.GetAllPlayerIDs();
$.Msg(test_x);
var ents = Game.PlayersHeroEnts();
for(var i = 0; i < ents.length; i++)
{
$.Msg(Entities.GetUnitName(ents[i]));
}
$.Schedule(5, _test);
};
$.Schedule(5, _test);
мужик ты невероятно крутделаешь скрипт. чекаешь локалхост видишь что все работает заебок. заходишь в лоббак хостишь в стокгольме каком-нибудь(то есть сервак вальве), видишь что нихуя не работает(скрипты работают но апи возвращает хуйню).
находишь функцию апи по хрефу (GetAllPlayerIDs например). два хрефа(ибо два байндинга), хрефы по типу:
trash...
lea func_GetAllPlayerIDS
trash...
lea xref "GetAllPlayerIDS"
Посмотреть вложение 169694
ставишь бп и трейсишь функцию сначала на локалхосте где все работает(под трейсингом я имею ввиду проверяешь результат каждого прыжка - чекаешь какие прыжки берутся а какие не берутся), а потом в лоббаке вальвов. и видишь такую деталь:
в локалхосте прыжок не берется, а в лоббаке берется. прыгает сразу в конец функции(ну то есть посылает тебя кароче так ничего и не вернув интересного).
ищешь причину прыжка. видишь чек test [dword:[rax+cc]-f], 0xfffffffb. и прыжок jne(ака jnz ака jump not zero, то есть прыгает если не 0). то есть тебе нужно сделать так, чтобы [rax+cc]-f & 0xfffffffb давало 0. такие числа это 0xf и 0x13. чекаешь что в rax. а там C_DOTAGamerules. значит ты берешь получаешь g_pGameRules и вписываешь в dword g_pGameRules+0xcc числа либо 0xf либо 0x13.(бог значет чем это может быть опасно но вроде не крашит :D потести сам)
Посмотреть вложение 169695
Результат(всунул 0xf в g_pGameRules + 0xcc (spatchem), оригинально там было 0x17(bezpatcha)):
Посмотреть вложение 169697
альтернативно ты можешь просто все проверки пропатчить(jne->nop) сделав сигу вычитания f теста на 0xfffffffb и jne.
тестил простейшим скриптом так что не знаю все ли апи так можно пофиксить, но тем не менее сущности вроде работают.
тока что в турбо пабе протестил вроде все норм(вражеских 5 героев имена не пишет потому что они еще не засветились и не создались их сущности)JavaScript:Game.PlayersHeroEnts = function(){ var PlayersEnt = [] var PlayersIDs = Game.GetAllPlayerIDs() for(i in PlayersIDs) PlayersEnt.push( Players.GetPlayerHeroEntityIndex( PlayersIDs[i] ) ) return PlayersEnt } function _test(){ var test_x = Game.GetAllPlayerIDs(); $.Msg(test_x); var ents = Game.PlayersHeroEnts(); for(var i = 0; i < ents.length; i++) { $.Msg(Entities.GetUnitName(ents[i])); } $.Schedule(5, _test); }; $.Schedule(5, _test);
попробуй пропатчить все проверки 8d ?? f1 a9 fb ff ff ff 0f 85(sig = 0; while sig = findSig("mysig", sig) sig.replace(0f85,90.repeat(6))) findSig ищет сигу начиная от sig + 1(ну то есть нашел первую сигу, вторую ищешь начианя от первой сиги + 1) мб так будет работать.Говорил же, лучший <З
Если кому нужно, сига на C_DOTAGamerules: 48 8B 05 ? ? ? ? 48 85 C0 75 ? 0F 57 C0 C3 F3 0F 10 80 ? ? ? ? C3
Только у меня чет на 0xCC не 0x17, а 0x1. Хотя мож потому что лобби, я хз.
И если на 0xF менять, сразу краш. 0x13 вроде работает.
UPD: Чет хз, короче. Если так патчить на стадии пика и в первые несколько секунд после начала игры (PREGAME || GAME_IN_PROGRESS), потом создавать партикль вокруг героя (другое не тестил), то крашит, когда героя двигаешь.
Надо другое думать.
Да странно, вроде если чуть позже патчить -- всё работает прекрасно. Да и хрен с ним, работает -- хорошо.попробуй пропатчить все проверки 8d ?? f1 a9 fb ff ff ff 0f 85(sig = 0; while sig = findSig("mysig", sig) sig.replace(0f85,90.repeat(6))) findSig ищет сигу начиная от sig + 1(ну то есть нашел первую сигу, вторую ищешь начианя от первой сиги + 1) мб так будет работать.
мб у тебя на 0xcc чето другое лежит? мб у тебя архитектура другая(хотя по сиге твоей на геймрулес вижу что х64 :D)? это для х64 дотки оффсет. проверь у себя самостоятельно оффсет. найди джс функцию по хрефу и там чекни какой оффсет.
понятно, что адрес статичный. это же non-const(конст в .rdata летит ака Read-only initialized data ) статик(статики это либо глобальные переменные либо объявленные как static переменные). это в .data летит( Initialized data ). но RVA(например client.dll+370c240 как у тебя) юзать - вариант ненадежный. RVA легко поменяется с некст апдейтом. у меня например даже уже другой RVA на геймрулес(ну видимо апдейты доты разные. мб вчера/седня апдейт вышел и я не обновлял или ты не обновлял хз.). лучше сигу юзать так как сига поменяется только если функция будет изменена и тем самым пересобрана. а если ее менять никто не будет то и компилятор будет использовать уже собранную функцию, и поэтому сига останется та же. RVA же ломается очень просто:Да странно, вроде если чуть позже патчить -- всё работает прекрасно. Да и хрен с ним, работает -- хорошо.
Мне панорама чисто чтобы реверсить удобней было, бпшки ставить, все дела xd
Ну а ваще, адрес статичный, можешь сам глянуть -- может это рили каким-то чудом не оно (а что тогда, лол).
[client.dll+370C240] + 0xCC
Ну я не совсем идиот, понимаю, потому сигу и скинул :^)понятно, что адрес статичный. это же non-const(конст в .rdata летит ака Read-only initialized data ) статик(статики это либо глобальные переменные либо объявленные как static переменные). это в .data летит( Initialized data ). но RVA(например client.dll+370c240 как у тебя) юзать - вариант ненадежный. RVA легко поменяется с некст апдейтом. у меня например даже уже другой RVA на геймрулес(ну видимо апдейты доты разные. мб вчера/седня апдейт вышел и я не обновлял или ты не обновлял хз.). лучше сигу юзать так как сига поменяется только если функция будет изменена и тем самым пересобрана. а если ее менять никто не будет то и компилятор будет использовать уже собранную функцию, и поэтому сига останется та же. RVA же ломается очень просто:
client.dll.update1:
C_SomethingElse* g_OtherVariable{nullptr};//offset SOME_RVA
C_DOTAGameRules* g_pGameRules{nullptr};//offset SOME_RVA + 8
C_AnotherThing* g_pAnotherPtr{nullptr}://offset SOME_RVA + 16
client.dll.update2:
C_SomethingElse* g_OtherVariable{nullptr};//offset SOME_RVA
C_NewClass* g_NewVariable{nullptr};//offset SOME_RVA + 8
C_DOTAGameRules* g_pGameRules{nullptr};//offset SOME_RVA + 16
C_AnotherThing* g_pAnotherPtr{nullptr}://offset SOME_RVA + 24
стоит переменную добавить просто сверху до g_pGameRules и все твой RVA поломался. был 1000 допустим в первом апдейте, стал 1008 в некст.
Проект предоставляет различный материал, относящийся к сфере киберспорта, программирования, ПО для игр, а также позволяет его участникам общаться на многие другие темы. Почта для жалоб: admin@yougame.biz