@@ -16,76 +16,75 @@ def __init__(self, reader, decryptor_template, sysinfo):
16
16
self .feedback_offset = None
17
17
self .des_key = None
18
18
self .random_key = None
19
- self .acquire_crypto_material ()
20
19
21
- def acquire_crypto_material (self ):
20
+ async def acquire_crypto_material (self ):
22
21
self .log ('Acquireing crypto stuff...' )
23
- sigpos = self .find_signature ()
24
- self .reader .move (sigpos )
22
+ sigpos = await self .find_signature ()
23
+ await self .reader .move (sigpos )
25
24
#data = self.reader.peek(0x50)
26
25
#self.log('Memory looks like this around the signature\n%s' % hexdump(data, start = sigpos))
27
26
28
27
for x in [self .decryptor_template .feedback_ptr_offset , self .decryptor_template .old_feedback_offset ]:
29
28
self .feedback_offset = x
30
29
31
30
try :
32
- self .feedback = self .get_feedback (sigpos )
31
+ self .feedback = await self .get_feedback (sigpos )
33
32
#self.log('Feedback bytes:\n%s' % hexdump(self.feedback, start = 0))
34
- self .des_key = self .get_key (sigpos )
35
- self .random_key = self .get_random (sigpos )
33
+ self .des_key = await self .get_key (sigpos )
34
+ self .random_key = await self .get_random (sigpos )
36
35
#self.log('randomkey bytes:\n%s' % hexdump(self.random_key, start = 0))
37
36
except :
38
37
import traceback
39
38
traceback .print_exc ()
40
- input ()
39
+ # input()
41
40
else :
42
41
break
43
42
44
43
45
- def get_feedback (self , sigpos ):
44
+ async def get_feedback (self , sigpos ):
46
45
if self .decryptor_template .arch == 'x86' :
47
- new_ptr = self .reader .get_ptr_with_offset (sigpos + self .feedback_offset )
48
- self .reader .move (new_ptr )
49
- return self .reader .read (8 )
46
+ new_ptr = await self .reader .get_ptr_with_offset (sigpos + self .feedback_offset )
47
+ await self .reader .move (new_ptr )
48
+ return await self .reader .read (8 )
50
49
else :
51
- self .reader .move (sigpos + self .feedback_offset )
52
- offset = LONG (self .reader ). value
50
+ await self .reader .move (sigpos + self .feedback_offset )
51
+ offset = await LONG . loadvalue (self .reader )
53
52
newpos = sigpos + self .feedback_offset + 4 + offset
54
- self .reader .move (newpos )
55
- return self .reader .read (8 )
53
+ await self .reader .move (newpos )
54
+ return await self .reader .read (8 )
56
55
57
- def get_key (self , sigpos ):
56
+ async def get_key (self , sigpos ):
58
57
if self .decryptor_template .arch == 'x86' :
59
- new_ptr = self .reader .get_ptr_with_offset (sigpos + self .decryptor_template .desx_key_ptr_offset )
60
- self .reader .move (new_ptr )
61
- des_key_ptr = self .decryptor_template .key_struct_ptr (self .reader )
62
- des_key = des_key_ptr .read (self .reader )
58
+ new_ptr = await self .reader .get_ptr_with_offset (sigpos + self .decryptor_template .desx_key_ptr_offset )
59
+ await self .reader .move (new_ptr )
60
+ des_key_ptr = await self .decryptor_template .key_struct_ptr . load (self .reader )
61
+ des_key = await des_key_ptr .read (self .reader )
63
62
else :
64
- self .reader .move (sigpos + self .decryptor_template .desx_key_ptr_offset )
65
- offset = LONG (self .reader ). value
63
+ await self .reader .move (sigpos + self .decryptor_template .desx_key_ptr_offset )
64
+ offset = await LONG . loadvalue (self .reader )
66
65
newpos = sigpos + self .decryptor_template .desx_key_ptr_offset + 4 + offset
67
- self .reader .move (newpos )
68
- des_key_ptr = self .decryptor_template .key_struct_ptr (self .reader )
69
- des_key = des_key_ptr .read (self .reader )
66
+ await self .reader .move (newpos )
67
+ des_key_ptr = await self .decryptor_template .key_struct_ptr . load (self .reader )
68
+ des_key = await des_key_ptr .read (self .reader )
70
69
71
70
return des_key
72
71
73
- def get_random (self , sigpos ):
72
+ async def get_random (self , sigpos ):
74
73
if self .decryptor_template .arch == 'x86' :
75
- random_key_ptr = self .reader .get_ptr_with_offset (sigpos + self .decryptor_template .randomkey_ptr_offset )
76
- random_key_ptr = self .reader .get_ptr_with_offset (random_key_ptr )
77
- self .reader .move (random_key_ptr )
74
+ random_key_ptr = await self .reader .get_ptr_with_offset (sigpos + self .decryptor_template .randomkey_ptr_offset )
75
+ random_key_ptr = await self .reader .get_ptr_with_offset (random_key_ptr )
76
+ await self .reader .move (random_key_ptr )
78
77
else :
79
- self .reader .move (sigpos + self .decryptor_template .randomkey_ptr_offset )
80
- offset = LONG (self .reader ). value
78
+ await self .reader .move (sigpos + self .decryptor_template .randomkey_ptr_offset )
79
+ offset = await LONG . loadvalue (self .reader )
81
80
newpos = sigpos + self .decryptor_template .desx_key_ptr_offset + 4 + offset
82
- self .reader .move (newpos )
81
+ await self .reader .move (newpos )
83
82
84
- return self .reader .read (256 )
83
+ return await self .reader .read (256 )
85
84
86
- def find_signature (self ):
85
+ async def find_signature (self ):
87
86
self .log ('Looking for main struct signature in memory...' )
88
- fl = self .reader .find_in_module ('lsasrv.dll' , self .decryptor_template .signature )
87
+ fl = await self .reader .find_in_module ('lsasrv.dll' , self .decryptor_template .signature )
89
88
if len (fl ) == 0 :
90
89
self .logger .log ('signature not found! %s' % self .decryptor_template .signature .hex ())
91
90
raise Exception ('LSA signature not found!' )
0 commit comments