// Шаблон solve-скрипта для winpwn.
// cp -r ../workspace/template ../workspace/mysolve
// cd ../workspace/mysolve && go run .
package main

import (
	"bytes"
	"encoding/binary"
	"fmt"
	"log"
	"strconv"
	"winpwn"
)

func p64(v uint64) []byte { return winpwn.P64(v) }
func u64(b []byte) uint64  { return binary.LittleEndian.Uint64(b) }

func parseHex(s string) uint64 {
	v, _ := strconv.ParseUint(s, 16, 64)
	return v
}

func parseAddr(line []byte) (uint64, error) {
	idx := bytes.Index(line, []byte("0x"))
	if idx == -1 {
		return 0, fmt.Errorf("no hex addr in %q", line)
	}
	return strconv.ParseUint(string(bytes.TrimSpace(line[idx+2:])), 16, 64)
}

func main() {
	// --- Вариант А: статический бинарь без ASLR ---
	// Открыть PE для анализа (работает для ASLR:No)
	pf, err := winpwn.OpenPE("chal.exe")
	if err != nil {
		log.Fatalf("OpenPE: %v", err)
	}
	winRVA, _ := pf.GetProcAddress("win")
	base, _   := pf.ImageBase()
	winAddr   := base + winRVA
	pf.Close()
	fmt.Printf("[+] win() @ 0x%X\n", winAddr)

	// Запустить таргет
	tube, err := winpwn.Spawn("chal.exe")
	if err != nil {
		log.Fatalf("Spawn: %v", err)
	}

	// --- Вариант Б: символы живого процесса (аналог pwintools p.libs/p.symbols) ---
	// sym := winpwn.NewProcessSymbols(tube.PID())
	// defer sym.Close()
	// k32, _     := sym.Base("kernel32.dll")
	// winexec, _ := sym.Symbol("kernel32.dll", "WinExec")
	// mods, _    := sym.Modules()  // все загруженные DLL
	_ = winAddr

	tube.RecvLine() // баннер готовности

	// Твой эксплойт здесь

	tube.Interactive()
}
