11using System ;
2- using System . Collections . Generic ;
32using System . IO ;
4- using System . Linq ;
5- using System . Runtime . Serialization . Json ;
63using System . Text ;
74using System . Threading . Tasks ;
85using System . Web . Script . Serialization ;
96using Remotely . Agent . Installer . Models ;
107using Remotely . Agent . Installer . Win . Utilities ;
11- using Remotely . Shared ;
128
139namespace Remotely . Agent . Installer . Win . Services ;
1410
1511internal class EmbeddedServerDataReader
1612{
1713 private readonly JavaScriptSerializer _serializer = new JavaScriptSerializer ( ) ;
1814
19- public Task < EmbeddedServerData > TryGetEmbeddedData ( string filePath )
15+ public async Task < EmbeddedServerData > TryGetEmbeddedData ( string filePath )
2016 {
2117 try
2218 {
@@ -25,60 +21,35 @@ public Task<EmbeddedServerData> TryGetEmbeddedData(string filePath)
2521 throw new Exception ( $ "File path does not exist: { filePath } ") ;
2622 }
2723
28- using ( var fs = File . Open ( filePath , FileMode . Open , FileAccess . Read , FileShare . Read ) )
29- {
30- var result = SearchBuffer ( fs , AppConstants . EmbeddedImmySignature ) ;
31- if ( result == - 1 )
32- {
33- throw new Exception ( "Signature not found in file buffer." ) ;
34- }
24+ using var fs = File . Open ( filePath , FileMode . Open , FileAccess . Read , FileShare . Read ) ;
25+ using var br = new BinaryReader ( fs ) ;
26+ using var sr = new StreamReader ( fs ) ;
3527
36- Logger . Write ( $ "Found data signature at index { result } .") ;
28+ fs . Seek ( - 4 , SeekOrigin . End ) ;
29+ var dataSize = br . ReadInt32 ( ) ;
30+ fs . Seek ( - dataSize - 4 , SeekOrigin . End ) ;
3731
38- fs . Seek ( result + AppConstants . EmbeddedImmySignature . Length , SeekOrigin . Begin ) ;
39- using ( var reader = new BinaryReader ( fs , Encoding . UTF8 ) )
40- {
41- var serializedData = reader . ReadString ( ) ;
32+ if ( dataSize == 0 )
33+ {
34+ return EmbeddedServerData . Empty ;
35+ }
4236
43- Logger . Write ( $ "Extracted embedded data from EXE: { serializedData } ") ;
37+ var buffer = new byte [ dataSize ] ;
38+ await fs . ReadAsync ( buffer , 0 , dataSize ) ;
39+ var json = Encoding . UTF8 . GetString ( buffer ) ;
4440
45- var embeddedData = _serializer . Deserialize < EmbeddedServerData > ( serializedData ) ;
46- if ( embeddedData != null )
47- {
48- return Task . FromResult ( embeddedData ) ;
49- }
50- }
41+ Logger . Write ( $ "Extracted embedded data from EXE: { json } " ) ;
42+
43+ var embeddedData = _serializer . Deserialize < EmbeddedServerData > ( json ) ;
44+ if ( embeddedData is not null )
45+ {
46+ return embeddedData ;
5147 }
5248 }
5349 catch ( Exception ex )
5450 {
5551 Logger . Write ( ex ) ;
5652 }
57- return Task . FromResult ( EmbeddedServerData . Empty ) ;
58- }
59-
60- private long SearchBuffer ( FileStream fileStream , byte [ ] matchPattern )
61- {
62- var matchSize = matchPattern . Length ;
63- var limit = fileStream . Length - matchSize ;
64-
65- for ( var i = 0 ; i <= limit ; i ++ )
66- {
67- var k = 0 ;
68-
69- for ( ; k < matchSize ; k ++ )
70- {
71- if ( matchPattern [ k ] != fileStream . ReadByte ( ) )
72- {
73- break ;
74- }
75- }
76-
77- if ( k == matchSize )
78- {
79- return fileStream . Position - matchSize ;
80- }
81- }
82- return - 1 ;
53+ return EmbeddedServerData . Empty ;
8354 }
8455}
0 commit comments