nirai: aes --> xor for byte obfuscation, add toon takeover command, change prefix to stride-beta

This commit is contained in:
Master Jumblespeed 2015-08-23 18:04:26 -04:00
parent bc8840da42
commit 58275c061e
5 changed files with 68 additions and 24 deletions

View file

@ -29,10 +29,15 @@ def niraicall_obfuscate(code):
# Reverse # Reverse
code = code[::-1] code = code[::-1]
# AES # XOR
key = ''.join(chr((i ^ (9 * i + 81)) % ((i + 193) * 11)) for i in xrange(16)) key = ['B', 'A', 'Q', 'J', 'R', 'P', 'Z', 'P', 'A', 'H', 'U', 'T']
iv = ''.join(chr((i ^ (5 * i + 170)) % ((i + 38) * 7)) for i in xrange(16)) output = []
code = aes.encrypt(code, key, iv)
for i in range(len(code)):
xor_num = ord(code[i]) ^ ord(key[i % len(key)])
output.append(chr(xor_num))
code = ''.join(output)
return True, code return True, code

@ -1 +1 @@
Subproject commit 3d29188a91b658f61cd2c3b3b8ada23050d4f230 Subproject commit f1b859ed19c77f14ccdab22f3cd7ce82de2acede

View file

@ -145,21 +145,12 @@ extern "C" PyObject* niraicall_deobfuscate(char* code, Py_ssize_t size)
{ {
std::string codestr(code, size); std::string codestr(code, size);
// AES char key[12] = {'B', 'A', 'Q', 'J', 'R', 'P', 'Z', 'P', 'A', 'H', 'U', 'T'};
unsigned char* aes_decrypted = new unsigned char[size]; std::string output = codestr;
unsigned char key[16];
unsigned char iv[16];
for (int i = 0; i < 16; ++i) for (int i = 0; i < codestr.size(); i++)
key[i] = (i ^ (9 * i + 81)) % ((i + 193) * 11); output[i] = codestr[i] ^ key[i % (sizeof(key) / sizeof(char))];
for (int i = 0; i < 16; ++i)
iv[i] = (i ^ (5 * i + 170)) % ((i + 38) * 7);
int decsize = AES_decrypt((unsigned char*)code, size, key, iv, aes_decrypted);
std::string output((char*)aes_decrypted, decsize);
std::reverse(output.begin(), output.end()); std::reverse(output.begin(), output.end());
delete[] aes_decrypted; return PyString_FromStringAndSize(output.data(), size);
return PyString_FromStringAndSize(output.data(), decsize);
} }

View file

@ -3,6 +3,6 @@
"astron": "6b769e6", "astron": "6b769e6",
"panda3d": "b924139", "panda3d": "b924139",
"libpandadna": "a0047ce", "libpandadna": "a0047ce",
"version-prefix": "tts-beta-", "version-prefix": "stride-beta-",
"server-resources": ["pdna", "txt", "dat", "bam", "ttf"] "server-resources": ["pdna", "txt", "dat", "bam", "ttf"]
} }

View file

@ -3126,6 +3126,24 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo
self.zoneId)) self.zoneId))
return ['success', suitIndex, building.doId] return ['success', suitIndex, building.doId]
def doToonBuildingTakeover(self):
streetId = ZoneUtil.getBranchZone(self.zoneId)
if streetId not in self.air.suitPlanners:
self.notify.warning('Street %d is not known.' % streetId)
return ['badlocation', 'notknownstreet', 0]
sp = self.air.suitPlanners[streetId]
bm = sp.buildingMgr
building = self.findClosestSuitDoor()
if building == None:
return ['badlocation', 'nobuilding', 0]
if building.isToonBlock():
return ['badlocation', 'toonblock', 0]
building.toonTakeOver()
self.notify.warning('toonTakeOverFromStreet %s %d' % (building.block,
self.zoneId))
return ['success', building.doId]
def doCogdoTakeOver(self, suitIndex): def doCogdoTakeOver(self, suitIndex):
if suitIndex >= len(SuitDNA.suitHeadTypes): if suitIndex >= len(SuitDNA.suitHeadTypes):
self.notify.warning('Bad suit index: %s' % suitIndex) self.notify.warning('Bad suit index: %s' % suitIndex)
@ -3298,6 +3316,31 @@ class DistributedToonAI(DistributedPlayerAI.DistributedPlayerAI, DistributedSmoo
return None return None
def findClosestSuitDoor(self):
zoneId = self.zoneId
streetId = ZoneUtil.getBranchZone(zoneId)
sp = self.air.suitPlanners[streetId]
if not sp:
return None
bm = sp.buildingMgr
if not bm:
return None
zones = [zoneId,
zoneId - 1,
zoneId + 1,
zoneId - 2,
zoneId + 2]
for zone in zones:
for i in bm.getSuitBlocks():
building = bm.getBuilding(i)
extZoneId, intZoneId = building.getExteriorAndInteriorZoneId()
if not NPCToons.isZoneProtected(intZoneId):
if hasattr(building, 'elevator'):
if building.elevator.zoneId == zone:
return building
return None
def b_setGardenTrophies(self, trophyList): def b_setGardenTrophies(self, trophyList):
self.setGardenTrophies(trophyList) self.setGardenTrophies(trophyList)
self.d_setGardenTrophies(trophyList) self.d_setGardenTrophies(trophyList)
@ -4925,8 +4968,8 @@ def track(command, track, value=None):
return 'Set the experience of the %s track to: %d!' % (track, value) return 'Set the experience of the %s track to: %d!' % (track, value)
return 'Invalid command.' return 'Invalid command.'
@magicWord(category=CATEGORY_PROGRAMMER, types=[str, str]) @magicWord(category=CATEGORY_ADMINISTRATOR, types=[str, str])
def suit(command, suitName): def suit(command, suitName = 'unset'):
invoker = spellbook.getInvoker() invoker = spellbook.getInvoker()
command = command.lower() command = command.lower()
if suitName not in SuitDNA.suitHeadTypes: if suitName not in SuitDNA.suitHeadTypes:
@ -4942,6 +4985,11 @@ def suit(command, suitName):
if returnCode[0] == 'success': if returnCode[0] == 'success':
return 'Successfully spawned a Cog building with: ' + suitFullName return 'Successfully spawned a Cog building with: ' + suitFullName
return "Couldn't spawn a Cog building with: " + suitFullName return "Couldn't spawn a Cog building with: " + suitFullName
elif command == 'nobuilding':
returnCode = invoker.doToonBuildingTakeover()
if returnCode[0] == 'success':
return 'Toons took over the cog building!'
return "Couldn't allow toons to take over cog building because " + returnCode[1]
else: else:
return 'Invalid command.' return 'Invalid command.'