import type { MemShellResult } from "@/types/memshell"; import { DownloadIcon } from "lucide-react"; import { useTranslation } from "react-i18next"; import { toast } from "sonner"; import DecompiledCodeViewer from "@/components/decompiled-code-viewer"; import { QuickUsage } from "@/components/memshell/quick-usage"; import { Button } from "@/components/ui/button"; import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs"; import { useDecompiledSources } from "@/lib/decompile/use-decompiled-sources"; import { downloadBytes } from "@/lib/utils"; import { BasicInfo } from "./results/basic-info"; import { ResultComponent } from "./results/result-component"; export default function ShellResult({ packResult, packMethod, generateResult, }: Readonly<{ packResult: string | undefined; packMethod: string; generateResult?: MemShellResult; }>) { const { t } = useTranslation(["common", "memshell"]); const { sources, isDecompiling, error } = useDecompiledSources(generateResult); if (!generateResult) { return ; } const shellClassName = generateResult.shellClassName; const shellBytesBase64 = generateResult.shellBytesBase64Str; const injectorClassName = generateResult.injectorClassName; const injectorBytesBase64 = generateResult.injectorBytesBase64Str; const height = 800; const sourcePlaceholder = isDecompiling ? `// ${t("common:decompiling")}` : error ? `// ${t("common:decompileFailed", { error })}` : ""; return ( {t("common:generateResult")} {t("memshell:shellClass")} {t("memshell:injectorClass")} {shellClassName}} button={ } height={height} lines={sources.shell?.lines ?? null} placeholder={sourcePlaceholder} /> {injectorClassName}} button={ } height={height} lines={sources.injector?.lines ?? null} placeholder={sourcePlaceholder} /> ); }