Jump to content
Korean Random
StranikS_Scan

PjOrion - редактирование, компиляция, декомпиляция, обфускация модов (Версия: 1.3.5 Дата: 11.08.2019)

Пользуетесь ли вы Орионом?  

314 members have voted

You do not have permission to vote in this poll, or see the poll results. Please sign in or register to vote in this poll.

Recommended Posts

Ничего не понял... (

 

Ребят, ну объясните нормально, в личку напишите, если тут не можете.

Учить весь Питон ради поменять себе пару параметров не айс. А Макс просит нереальные деньги за замену двух строк и компиляцию, до 2к цена доходит...

Edited by Huitaarva
  • Upvote 1
  • Downvote 1

Share this post


Link to post

Short link
Share on other sites

Нагородил-то ))))

 

Там достаточно принт в нужном месте поставить и код сам расшифруется ))))

Неа  принт не катит , что то ещё нужно 

  • Upvote 1
  • Downvote 2

Share this post


Link to post

Short link
Share on other sites

В репозитарий Decompile_WOT залил также zip-архивы cо скриптами клиента - тыц. Скачать, кто не знает, очень просто. Жмякаете на название архива, затем на ссылку "...view the full file." и архив скачивается.

Share this post


Link to post

Short link
Share on other sites

При запуске реплея выскакивает вот такая чтука:

 

Traceback (most recent call last):
***   File "", line 4, in bootstrap
***   File "c:\p27\hooks.py", line 204, in import_module_hook
***   File "", line 26, in <module>
*** ImportError: cannot import name Requester


Не плохо бы ещё ExpressScript уметь запускать в клиенте.

Share this post


Link to post

Short link
Share on other sites

При запуске реплея выскакивает вот такая чтука:

 

Traceback (most recent call last):

***   File "", line 4, in bootstrap

***   File "c:\p27\hooks.py", line 204, in import_module_hook

***   File "", line 26, in <module>

*** ImportError: cannot import name Requester

Чаво?

 

Не плохо бы ещё ExpressScript уметь запускать в клиенте.

Чаво? Чаво?

Share this post


Link to post

Short link
Share on other sites

Оффтоп:

Захотел тут посмотреть, что и в каких ситуациях вызывается из clientchat - модифицировал его, закинул назад. Не грузит клиент.

Немодифицированный, но перекомпиленный файл тоже не кушает.

Что я делаю не так и как мне добиться поставленной цели?

Share this post


Link to post

Short link
Share on other sites

Оффтоп:

Захотел тут посмотреть, что и в каких ситуациях вызывается из clientchat - модифицировал его, закинул назад. Не грузит клиент.

Немодифицированный, но перекомпиленный файл тоже не кушает.

Что я делаю не так и как мне добиться поставленной цели?

 

Вообще такое надо делать аналитически, а не перекомпиливая исходники, так как декомпиляторы могут портить код. Бери скачай архив с исходниками открывай в Notepad++ всю корневую папку за раз и поиском по всем файлам смотри что где вызывается. Такой метод лучше.

  • Upvote 2

Share this post


Link to post

Short link
Share on other sites
Может с приложенным файлом получится?

return'ы и assert так влияют? Почему? P.S. помогло, да, только в чем именно затык был?

 

Такой метод лучше.

А если исходная цепочка вызовов идет из флэша, как такое отловить? Декомпилить еще и флэш?

Edited by DotNetFramework

Share this post


Link to post

Short link
Share on other sites

return'ы и assert так влияют? Почему?

 

Ретурны тут не причем, проблема тут скорее всего:

 

raise isinstance(self, BigWorld.Entity) or AssertionError

Share this post


Link to post

Short link
Share on other sites
Вообще такое надо делать аналитически

хреновый из меня реверсер :(

 

Архив уже давно есть, отдельное спасибо за гитхаб.

 

UPD.

Чтобы программно создать приватный канал нужно вызвать createPrivate(friendID: обычный_id_юзера, friendName: имя_юзера), это понятно.

А вот сделать туда broadcast(channelId, 'Бла-бла-бла') - споткнулся на том, откуда брать channelId?

Edited by DotNetFramework

Share this post


Link to post

Short link
Share on other sites

А вот сделать туда broadcast(channelId, 'Бла-бла-бла') - споткнулся на том, откуда брать channelId?

Подробно опиши какие модули используешь, что и как вызываешь.

 

Upd. Нашел твою команду... ИД чата напрямую запросом не возвращается, значит его надо запрашивать (искать по критерию)...

 

Upd2.

def new_ChatCommandsController_sendChatCommand(self, command):
	#this method is called without calling original method, this method sends a message! No double message!
	from messenger import MessengerEntry
	from messenger.proto.bw.find_criteria import BWPrbChannelFindCriteria, BWBattleTeamChannelFindCriteria
	from constants import PREBATTLE_TYPE
	controls = MessengerEntry.g_instance.gui.channelsCtrl
	criteria = BWPrbChannelFindCriteria(PREBATTLE_TYPE.SQUAD) if _config_['modActivated'] else BWBattleTeamChannelFindCriteria()
	controller = controls.getControllerByCriteria(criteria)
	if controller is not None:
		controller.sendCommand(command)
	return
Этот кусок кода из разработки "Взводные команды"

 

Файлы для изучения:

scripts/client/messenger/m_constants.py

scripts/client/messenger/proto/bw/find_criteria.py

scripts/common/chat_shared.py

scripts/client/ChatManager.py

scripts/client/messenger/gui/Scaleform/channels/bw/factories.py

 

Upd3.

Еще до кучи туда же

scripts/client/messenger/gui/Scaleform/view/SimpleChannelWindow.py

scripts/client/messenger/gui/Scaleform/view/LobbyChannelWindow.py

scripts/client/messenger/gui/Scaleform/data/ChannelsCarouselHandler.py

 

Тут инфа по участникам чата есть..

scripts/client/messenger/gui/Scaleform/channels/_layout.py

Сюда она наследуется...

scripts/client/messenger/gui/Scaleform/channels/bw_chat2/lobby_controllers.py

а там...

class UnitChannelController...

интуиция подсказывает, что

scripts/common/constants.py -> PREBATTLE_TYPE.UNIT

И из вариантов PREBATTLE_TYPE больше ничего не подходит...

Данные по составлению критерия брать здесь

scripts/client/messenger/proto/bw/find_criteria.py

scripts/client/messenger/proto/bw_chat2/find_criteria.py

Не забыть, что PROTO_TYPE.BW_CHAT2 или PROTO_TYPE.BW

Типа чат версии 2 как я понял...

Тут класс, объект которого возвращается MessengerEntry.g_instance.gui.channelsCtrl

scripts/client/messenger/gui/Scaleform/channels/__init__.py

В принципе, достаточно получить контроллер чата по схеме выше (скрипт), и вызвать команду типа sendMessage

У контроллера должна быть подобная команда.

Копай дальше сам)

Edited by GPCracker
  • Upvote 1

Share this post


Link to post

Short link
Share on other sites

@GPCracker, спасибо.

UPD. И почему бы WG не сделать что-то типа "CreateChannel", возвращающий id диалога... Навертели жесть.

Edited by DotNetFramework

Share this post


Link to post

Short link
Share on other sites

UPD. И почему бы WG не сделать что-то типа "CreateChannel", возвращающий id диалога... Навертели жесть.

Потому что код создания диалога не создает его по всей видимости, а только запрашивает у сервера создание диалога. В случае успешной операции список клиентских чатов обновляется. Если я правильно понял километры картошкинского индусского кода. Там едет явное обращение к base, а эта часть написана на C, скорее всего все операции связи с сервером написаны на сях.

 

З.Ы. , удается находить нужный чат?

Edited by GPCracker

Share this post


Link to post

Short link
Share on other sites

ZorroJan, я так понимаю, дружище, ты программист-юморист? )))))))))))) Такие перлы выдаешь, что прям хоть заламинировать и на доску )))

 

Кодировка Маршалом работает, но вот не совсем корректно. Орион ставит строку выполнения в скобки, выходит типа:

exec (zlib.decompress(base64.b64decode('eNokm8duxNqxRefvK+7MBmiY==')))

а должно быть:

exec zlib.decompress(base64.b64decode('eNokm8duxNqxRefvK+7MBmiY=='))

и в логе танков потом читаем вот что: <string>: inconsistent use of tabs and spaces in indentation

При запуске реплея выскакивает вот такая чтука:

Traceback (most recent call last): ***  

File "", line 4, in bootstrap ***  

File "c:\p27\hooks.py", line 204, in import_module_hook ***  

File "", line 26, in *** ImportError: cannot import name Requester

Не плохо бы ещё ExpressScript уметь запускать в клиенте.


 

Потому что код создания диалога не создает его по всей видимости, а только запрашивает у сервера создание диалога. В случае успешной операции список клиентских чатов обновляется. Если я правильно понял километры картошкинского индусского кода. Там едет явное обращение к base, а эта часть написана на C, скорее всего все операции связи с сервером написаны на сях.

 

З.Ы. , удается находить нужный чат?

 

А чего это все вдруг в эти чаты кинулись? Вчера ProstoNoob тоже про чаты всё писал. Эпидемия какая-то....

Edited by StranikS_Scan

Share this post


Link to post

Short link
Share on other sites

Столкнулся с необходимостью установить хук на classmethod. Думаю начинающим мододелам будет полезно. Некоторым бывалым возможно тоже.

"Установка хуков на методы различного типа"

class cla:
	@classmethod
	def mc(sc):
		print sc
		return 'ret'
	
	@staticmethod
	def ms():
		print 'stat'
		return 'ret'
	
	def mp(self):
		print self
		return 'ret'

#we have class, and we need to set hooks on it's three different type methods
#we create a instance of this class and see what we have got at the end
obj = cla()

#since object created, we starting to set hooks
#ooooh, we have forgot to define hook functions...
def new_cla_mc(sc):
	print 'hook'
	return old_cla_mc(sc)

def new_cla_ms():
	print 'hook'
	return old_cla_ms()

def new_cla_mp(self):
	print 'hook'
	return old_cla_mp(self)

#here all hooks is called before originals, if you need to call origin first use
#def hk(*args, **kwargs):
#	result = orig(*args, **kwargs)
#	<todo>
#	return result

#Attention! If you are not 100% sure that function returns nothing (None) you SHOULD specify a return, otherwise hook MAY NOT WORK properly
#Even if function returns None, specified return will work properly, when not specified may not.
#In this examples return stays unchanged and pass through hook, ie, changed method will return the same as unchanged. 
#Don't forget, that you can change return as you wish, it's useful sometimes!

#Important!
#We can not define methods directly, outside of class we can only operate with functions.
#So, we should get a method from class, transform it into function
#then create our wrapper function, transform wrapper in a correct bounding form and bound it to class.

#Looking forward, when you assign class property value and value is function type, python bounds it to class
#If you just assign a function, it becomes a instance-bounding method
#If you transform it to a class method, it becomes a class-bounded method
#If you transform it to a static method, it becomes a static method

#Returning to hooks set...
#The last is the simplest
old_cla_mp = cla.mp
#we have got an instance-bounding method, when it was got from class, it is unbound and can be used as function
#but this construction will work too
old_cla_mp = cla.mp.__func__
#now we need to implant our wrapper
cla.mp = new_cla_mp
#Simple!

#Lets handle with static method
#Now getting an origin
old_cla_ms = cla.ms
#static method is a function already, epic!
#Now implanting an wrapper
cla.ms = staticmethod(new_cla_ms)
#A bit harder...

#Lets handle with last class method
#Gettting an origin
old_cla_mc = cla.mc.__func__
#Here transform is STRICTLY required, because you have got an BOUNDED method, but you need unbounded or function
#Implanting an wrapper
cla.mc = classmethod(new_cla_mc)
#Just nothing to do!

#Let's see what we have got
print obj.mc()
print '---'
print obj.ms()
print '---'
print obj.mp()
print '---'

'''
Results here:

hook
__main__.cla
ret
---
hook
stat
ret
---
hook
<__main__.cla instance at 0x028A0170>
ret
---

Exactly, what we need!
'''

Кому понравилось, ставьте лайк, будет много лайков, разберу property.)

  • Upvote 6

Share this post


Link to post

Short link
Share on other sites

 

 

понравилось

Понравилось, но сразу вопрос! А как выяснить последовательность цепочки вызовов функций, не роняя последнюю для создания ошибки?

Share this post


Link to post

Short link
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...