feat: support tomcat agent shell (resolved #12)

This commit is contained in:
ReaJason
2025-01-03 00:25:56 +08:00
parent 8e741b6647
commit 2da2e180cb
84 changed files with 1058 additions and 285 deletions
+82 -26
View File
@@ -4,17 +4,64 @@ import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert.tsx";
import { Button } from "@/components/ui/button.tsx";
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card.tsx";
import { Label } from "@/components/ui/label.tsx";
import { Separator } from "@/components/ui/separator.tsx";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs.tsx";
import { downloadJavaClass } from "@/lib/utils.ts";
import { downloadBytes } from "@/lib/utils.ts";
import { GenerateResult } from "@/types/shell.ts";
import { TicketsIcon, TriangleAlertIcon } from "lucide-react";
function AgentResult({ packResult, generateResult }: { packResult: string; generateResult?: GenerateResult }) {
return (
<section>
<ol className="list-decimal list-inside space-y-4">
<li className="flex items-center justify-between">
<span> MemShellAgent.jar</span>
<Button
size="sm"
variant="outline"
className="w-28"
type="button"
onClick={() =>
downloadBytes(
packResult,
undefined,
`${generateResult?.shellConfig.server}${generateResult?.shellConfig.shellTool}MemShellAgent`,
)
}
>
Jar
</Button>
</li>
<li className="flex items-center justify-between">
<span> Jattach Jar </span>
<Button
size="sm"
variant="outline"
className="w-28"
type="button"
onClick={() => window.open("https://github.com/jattach/jattach/releases")}
>
Jattach
</Button>
</li>
<Separator />
<h2 className="text-2xl font-bold mb-4">使</h2>
<li> MemShellAgent.jar jattach 使</li>
<li> jvm pid 使 jps ps</li>
<li>/path/to/jattach pid load instrument false /path/to/agent.jar</li>
<li></li>
</ol>
</section>
);
}
export function ShellResult({
packResult,
packMethod,
generateResult,
}: { packResult: string; packMethod: string; generateResult?: GenerateResult }) {
const showCode = packMethod === "JSP";
const isAgent = packMethod.startsWith("Agent");
return (
<Card className="h-full">
<CardHeader className="pb-2">
@@ -31,7 +78,7 @@ export function ShellResult({
<TabsTrigger value="injector"></TabsTrigger>
</TabsList>
<TabsContent value="packResult" className="mt-4">
{generateResult && (
{generateResult && !isAgent && (
<div className="gap-4 my-2">
<CopyableField
label="注入器类名"
@@ -45,12 +92,15 @@ export function ShellResult({
/>
</div>
)}
<CodeViewer
code={packResult}
wrapLongLines={!showCode}
showLineNumbers={showCode}
language={showCode ? "java" : "text"}
/>
{!isAgent && (
<CodeViewer
code={packResult}
wrapLongLines={!showCode}
showLineNumbers={showCode}
language={showCode ? "java" : "text"}
/>
)}
{isAgent && <AgentResult packResult={packResult} generateResult={generateResult} />}
</TabsContent>
<TabsContent value="shell" className="mt-4">
<Alert>
@@ -71,14 +121,17 @@ export function ShellResult({
</div>
</div>
)}
<Button
size="sm"
className="h-8 gap-1"
type="button"
onClick={() => downloadJavaClass(generateResult?.shellBytesBase64Str, generateResult?.shellClassName)}
>
Class
</Button>
{generateResult && (
<Button
size="sm"
variant="outline"
className="w-28"
type="button"
onClick={() => downloadBytes(generateResult?.shellBytesBase64Str, generateResult?.shellClassName)}
>
Class
</Button>
)}
</div>
<CodeViewer
showLineNumbers={false}
@@ -106,16 +159,19 @@ export function ShellResult({
</div>
</div>
)}
<Button
size="sm"
className="h-8 gap-1"
type="button"
onClick={() =>
downloadJavaClass(generateResult?.injectorBytesBase64Str, generateResult?.injectorClassName)
}
>
Class
</Button>
{generateResult && (
<Button
size="sm"
className="w-28"
variant="outline"
type="button"
onClick={() =>
downloadBytes(generateResult?.injectorBytesBase64Str, generateResult?.injectorClassName)
}
>
Class
</Button>
)}
</div>
<CodeViewer
showLineNumbers={false}