Skip to content

Commit 1e079d0

Browse files
Better handle unsupported FRIDA versions
1 parent 1b908d5 commit 1e079d0

File tree

8 files changed

+101
-85
lines changed

8 files changed

+101
-85
lines changed

package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "frida-cshell",
3-
"version": "1.9.1",
3+
"version": "1.9.2",
44
"description": "Frida's CShell",
55
"scripts": {
66
"prepare": "npm run version && npm run build && npm run package && npm run copy",

src/cmdlets/files/sz.ts

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import { OutputBuffer } from '../../io/zmodem/output.js';
77
import { Sz } from '../../io/zmodem/sz.js';
88
import { Zmodem } from '../../io/zmodem/zmodem.js';
99
import { Files } from '../../misc/files.js';
10-
import { Version } from '../../misc/version.js';
1110
import { Var } from '../../vars/var.js';
1211

1312
export class SzCmdLet extends CmdLetBase {
@@ -94,11 +93,7 @@ cat file - send file
9493
public override isSupported(): boolean {
9594
switch (Process.platform) {
9695
case 'linux':
97-
if (Version.VERSION >= Version.BINARY_MODE_MIN_VERSION) {
98-
return true;
99-
} else {
100-
return false;
101-
}
96+
return true;
10297
case 'windows':
10398
case 'barebone':
10499
case 'darwin':

src/commands/cmdlets.ts

Lines changed: 71 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -74,79 +74,82 @@ import { SzCmdLet } from '../cmdlets/files/sz.js';
7474
import { TlsCmdLet } from '../cmdlets/thread/tls.js';
7575
import { TmpCmdLet } from '../cmdlets/files/tmp.js';
7676
import { DumpFileCmdLet } from '../cmdlets/data/dumpfile.js';
77+
import { Version } from '../misc/version.js';
7778

7879
export class CmdLets {
7980
private static byName: Map<string, CmdLet> = new Map<string, CmdLet>();
8081

8182
static {
82-
this.registerCmdletType(AddCmdLet);
83-
this.registerCmdletType(AndCmdLet);
84-
this.registerCmdletType(SubCmdLet);
85-
this.registerCmdletType(AssemblyCmdLet);
86-
this.registerCmdletType(BlockTraceBpCmdLet);
87-
this.registerCmdletType(BtCmdLet);
88-
this.registerCmdletType(CallTraceBpCmdLet);
89-
this.registerCmdletType(CatCmdLet);
90-
this.registerCmdletType(CopyCmdLet);
91-
this.registerCmdletType(CorpseCmdLet);
92-
this.registerCmdletType(CoverageBpCmdLet);
93-
this.registerCmdletType(DivCmdLet);
94-
this.registerCmdletType(DumpCmdLet);
95-
this.registerCmdletType(DumpFileCmdLet);
96-
this.registerCmdletType(DumpStringCmdLet);
97-
this.registerCmdletType(EchoCmdLet);
98-
this.registerCmdletType(EndianCmdLet);
99-
this.registerCmdletType(EqCmdLet);
100-
this.registerCmdletType(ErrnoCmdLet);
101-
this.registerCmdletType(ExitCmdLet);
102-
this.registerCmdletType(FalseCmdLet);
103-
this.registerCmdletType(FdCmdLet);
104-
this.registerCmdletType(GreaterThanCmdLet);
105-
this.registerCmdletType(GreaterThanEqualsCmdLet);
106-
this.registerCmdletType(GrepCmdLet);
107-
this.registerCmdletType(FunctionEntryBpCmdLet);
108-
this.registerCmdletType(FunctionExitBpCmdLet);
109-
this.registerCmdletType(HelpCmdLet);
110-
this.registerCmdletType(HistoryCmdLet);
111-
this.registerCmdletType(HotCmdLet);
112-
this.registerCmdletType(InsnBpCmdLet);
113-
this.registerCmdletType(JsCmdLet);
114-
this.registerCmdletType(LdCmdLet);
115-
this.registerCmdletType(LessThanCmdLet);
116-
this.registerCmdletType(LessThanEqualsCmdLet);
117-
this.registerCmdletType(LogCmdLet);
118-
this.registerCmdletType(OrCmdLet);
119-
this.registerCmdletType(ReadCmdLet);
120-
this.registerCmdletType(MacroCmdLet);
121-
this.registerCmdletType(ModCmdLet);
122-
this.registerCmdletType(MulCmdLet);
123-
this.registerCmdletType(NeCmdLet);
124-
this.registerCmdletType(NotCmdLet);
125-
this.registerCmdletType(PrintCmdLet);
126-
this.registerCmdletType(ReadBpCmdLet);
127-
this.registerCmdletType(RegCmdLet);
128-
this.registerCmdletType(ReplaceCmdLet);
129-
this.registerCmdletType(ShCmdLet);
130-
this.registerCmdletType(ShlCmdLet);
131-
this.registerCmdletType(ShrCmdLet);
132-
this.registerCmdletType(SrcCmdLet);
133-
this.registerCmdletType(SymCmdLet);
134-
this.registerCmdletType(SzCmdLet);
135-
this.registerCmdletType(ThreadCmdLet);
136-
this.registerCmdletType(TlsCmdLet);
137-
this.registerCmdletType(TmpCmdLet);
138-
this.registerCmdletType(TraceBlockCmdLet);
139-
this.registerCmdletType(TraceCallCmdLet);
140-
this.registerCmdletType(TraceCoverageCmdLet);
141-
this.registerCmdletType(TraceUniqueBlockCmdLet);
142-
this.registerCmdletType(TrueCmdLet);
143-
this.registerCmdletType(UniqueBlockTraceBpCmdLet);
144-
this.registerCmdletType(VarCmdLet);
145-
this.registerCmdletType(DebugCmdLet);
146-
this.registerCmdletType(VmCmdLet);
147-
this.registerCmdletType(WriteCmdLet);
148-
this.registerCmdletType(WriteBpCmdLet);
149-
this.registerCmdletType(XorCmdLet);
83+
if (Version.isSupported()) {
84+
this.registerCmdletType(AddCmdLet);
85+
this.registerCmdletType(AndCmdLet);
86+
this.registerCmdletType(SubCmdLet);
87+
this.registerCmdletType(AssemblyCmdLet);
88+
this.registerCmdletType(BlockTraceBpCmdLet);
89+
this.registerCmdletType(BtCmdLet);
90+
this.registerCmdletType(CallTraceBpCmdLet);
91+
this.registerCmdletType(CatCmdLet);
92+
this.registerCmdletType(CopyCmdLet);
93+
this.registerCmdletType(CorpseCmdLet);
94+
this.registerCmdletType(CoverageBpCmdLet);
95+
this.registerCmdletType(DivCmdLet);
96+
this.registerCmdletType(DumpCmdLet);
97+
this.registerCmdletType(DumpFileCmdLet);
98+
this.registerCmdletType(DumpStringCmdLet);
99+
this.registerCmdletType(EchoCmdLet);
100+
this.registerCmdletType(EndianCmdLet);
101+
this.registerCmdletType(EqCmdLet);
102+
this.registerCmdletType(ErrnoCmdLet);
103+
this.registerCmdletType(ExitCmdLet);
104+
this.registerCmdletType(FalseCmdLet);
105+
this.registerCmdletType(FdCmdLet);
106+
this.registerCmdletType(GreaterThanCmdLet);
107+
this.registerCmdletType(GreaterThanEqualsCmdLet);
108+
this.registerCmdletType(GrepCmdLet);
109+
this.registerCmdletType(FunctionEntryBpCmdLet);
110+
this.registerCmdletType(FunctionExitBpCmdLet);
111+
this.registerCmdletType(HelpCmdLet);
112+
this.registerCmdletType(HistoryCmdLet);
113+
this.registerCmdletType(HotCmdLet);
114+
this.registerCmdletType(InsnBpCmdLet);
115+
this.registerCmdletType(JsCmdLet);
116+
this.registerCmdletType(LdCmdLet);
117+
this.registerCmdletType(LessThanCmdLet);
118+
this.registerCmdletType(LessThanEqualsCmdLet);
119+
this.registerCmdletType(LogCmdLet);
120+
this.registerCmdletType(OrCmdLet);
121+
this.registerCmdletType(ReadCmdLet);
122+
this.registerCmdletType(MacroCmdLet);
123+
this.registerCmdletType(ModCmdLet);
124+
this.registerCmdletType(MulCmdLet);
125+
this.registerCmdletType(NeCmdLet);
126+
this.registerCmdletType(NotCmdLet);
127+
this.registerCmdletType(PrintCmdLet);
128+
this.registerCmdletType(ReadBpCmdLet);
129+
this.registerCmdletType(RegCmdLet);
130+
this.registerCmdletType(ReplaceCmdLet);
131+
this.registerCmdletType(ShCmdLet);
132+
this.registerCmdletType(ShlCmdLet);
133+
this.registerCmdletType(ShrCmdLet);
134+
this.registerCmdletType(SrcCmdLet);
135+
this.registerCmdletType(SymCmdLet);
136+
this.registerCmdletType(SzCmdLet);
137+
this.registerCmdletType(ThreadCmdLet);
138+
this.registerCmdletType(TlsCmdLet);
139+
this.registerCmdletType(TmpCmdLet);
140+
this.registerCmdletType(TraceBlockCmdLet);
141+
this.registerCmdletType(TraceCallCmdLet);
142+
this.registerCmdletType(TraceCoverageCmdLet);
143+
this.registerCmdletType(TraceUniqueBlockCmdLet);
144+
this.registerCmdletType(TrueCmdLet);
145+
this.registerCmdletType(UniqueBlockTraceBpCmdLet);
146+
this.registerCmdletType(VarCmdLet);
147+
this.registerCmdletType(DebugCmdLet);
148+
this.registerCmdletType(VmCmdLet);
149+
this.registerCmdletType(WriteCmdLet);
150+
this.registerCmdletType(WriteBpCmdLet);
151+
this.registerCmdletType(XorCmdLet);
152+
}
150153
}
151154

152155
private static registerCmdletType<T extends CmdLetBase>(

src/entrypoint.ts

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { SrcCmdLet } from './cmdlets/files/src.js';
1313
import { Exception } from './misc/exception.js';
1414
import { Version } from './misc/version.js';
1515
import { Format } from './misc/format.js';
16+
import { APP_VERSION } from './version.js';
1617

1718
export const HOME_DIR: string = Process.getHomeDir();
1819
export const DEFAULT_SRC_PATH: string = HOME_DIR.endsWith('/')
@@ -29,6 +30,14 @@ rpc.exports = {
2930
Output.setDebugging(params.debug);
3031
Output.debug(`params: ${JSON.stringify(params)}`);
3132
}
33+
if (!Version.isSupported()) {
34+
Output.writeln(
35+
Output.red(
36+
`Unsupported Frida version: ${Version.VERSION}, frida-cshell ${APP_VERSION}, requires at least ${Version.MIN_SUPPORTED_VERSION}`,
37+
),
38+
);
39+
return;
40+
}
3241
Output.debug(`init - stage: ${stage}`);
3342
Output.banner();
3443
Process.setExceptionHandler(Exception.exceptionHandler);
@@ -43,6 +52,10 @@ rpc.exports = {
4352
* by the user including the newline.
4453
*/
4554
async onFridaStdin(data: string, bytes: ArrayBuffer | null) {
55+
if (!Version.isSupported()) {
56+
return;
57+
}
58+
4659
if (bytes === null) {
4760
await Input.read(Format.toByteArray(data));
4861
} else {
@@ -54,10 +67,6 @@ rpc.exports = {
5467
* console mode to RAW
5568
*/
5669
getFridaTerminalMode() {
57-
if (Version.VERSION >= Version.BINARY_MODE_MIN_VERSION) {
58-
return 'binary';
59-
} else {
60-
return 'raw';
61-
}
70+
return 'binary';
6271
},
6372
};

src/io/output.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { DEFAULT_SRC_PATH } from '../entrypoint.js';
44
import { Format } from '../misc/format.js';
55
import { APP_VERSION, GIT_COMMIT_HASH } from '../version.js';
66
import { Endian } from '../misc/endian.js';
7+
import { Version } from '../misc/version.js';
78

89
export class Output {
910
private static readonly shell: string[] = [
@@ -40,7 +41,7 @@ export class Output {
4041
const metadata: [string, string][] = Object.entries({
4142
cshell: APP_VERSION,
4243
commit: GIT_COMMIT_HASH,
43-
frida: Frida.version,
44+
frida: Version.VERSION.toString(),
4445
runtime: Script.runtime,
4546
arch: Process.arch,
4647
endian: Endian.get(),

src/misc/version.ts

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ export class Version {
33
private readonly minor: number;
44
private readonly patch: number;
55

6-
public static readonly BINARY_MODE_MIN_VERSION = new Version('1.7.6');
6+
public static readonly MIN_SUPPORTED_VERSION = new Version('17.0.0');
77
public static readonly VERSION = new Version(Frida.version);
88

99
public constructor(version: string) {
@@ -13,6 +13,10 @@ export class Version {
1313
this.patch = Number(patch);
1414
}
1515

16+
public static isSupported(): boolean {
17+
return this.VERSION.compareTo(this.MIN_SUPPORTED_VERSION) >= 0;
18+
}
19+
1620
public compareTo(other: Version): number {
1721
if (this.major !== other.major) {
1822
return this.major > other.major ? 1 : -1;
@@ -22,4 +26,8 @@ export class Version {
2226
return this.patch > other.patch ? 1 : -1;
2327
}
2428
}
29+
30+
public toString(): string {
31+
return `v${this.major}.${this.minor}.${this.patch}`;
32+
}
2533
}

version.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ try {
1616
const outputPath = path.resolve('.', 'src', 'version.ts');
1717
const content = `
1818
export const GIT_COMMIT_HASH = '${commitHash}';
19-
export const APP_VERSION = '${version}';
19+
export const APP_VERSION = 'v${version}';
2020
`;
2121

2222
fs.writeFileSync(outputPath, content, { encoding: 'utf8' });

0 commit comments

Comments
 (0)