@@ -141,12 +141,23 @@ def tryHint(idx):
141141
142142 return None
143143
144- def getChar (idx , charTbl = asciiTbl ):
144+ def getChar (idx , charTbl = asciiTbl , sequentialOrder = True ):
145145 result = tryHint (idx )
146146
147147 if result :
148148 return result
149149
150+ if not sequentialOrder :
151+ originalTbl = list (charTbl )
152+
153+ if len (charTbl ) == 1 :
154+ forgedPayload = safeStringFormat (payload .replace ('%3E' , '%3D' ), (expressionUnescaped , idx , charTbl [0 ]))
155+ result = Request .queryPage (urlencode (forgedPayload ))
156+ if result :
157+ return chr (charTbl [0 ]) if charTbl [0 ] < 128 else unichr (charTbl [0 ])
158+ else :
159+ return None
160+
150161 maxChar = maxValue = charTbl [- 1 ]
151162 minValue = charTbl [0 ]
152163
@@ -189,15 +200,14 @@ def getChar(idx, charTbl=asciiTbl):
189200 if maxValue == 1 :
190201 return None
191202 elif minValue == maxChar :
192- charTbl = xrange ( maxChar + 1 , (maxChar + 1 ) << 8 )
203+ charTbl = xrange (maxChar + 1 , (maxChar + 1 ) << 8 )
193204 maxChar = maxValue = charTbl [- 1 ]
194205 minValue = charTbl [0 ]
195- else :
206+ elif sequentialOrder :
196207 retVal = minValue + 1
197- if retVal < 128 :
198- return chr (retVal )
199- else :
200- return unichr (retVal )
208+ return chr (retVal ) if retVal < 128 else unichr (retVal )
209+ else :
210+ retVal = originalTbl [originalTbl .index (minValue ) + 1 ]
201211
202212 def etaProgressUpdate (charTime , index ):
203213 if len (progressTime ) <= ( (length * 3 ) / 100 ):
@@ -361,7 +371,7 @@ def downloadThread():
361371
362372 if conf .useCommonPrediction :
363373 predictedCharset , otherCharset = getGoodSamaritanCharsets (kb .partRun , finalValue , asciiTbl )
364- val = getChar (index , predictedCharset ) if predictedCharset else None
374+ val = getChar (index , predictedCharset , False ) if predictedCharset else None
365375 if not val :
366376 val = getChar (index , otherCharset )
367377 else :
0 commit comments