主頁 > 移動端開發 > 如WMI所見,WOW64程式如何覆寫其命令列引數?

如WMI所見,WOW64程式如何覆寫其命令列引數?

2022-06-20 21:40:34 移動端開發

我正在嘗試撰寫一個程式,該程式可以在讀取其命令列引數后對其進行屏蔽。我知道這存盤在 PEB 中,所以我嘗試使用“如何使用匯編程式(x64 作業系統)獲取行程環境塊(PEB)地址?”的答案。由 Sirmabus獲取并在那里修改它。這是一個執行此操作的最小程式:

#include <wchar.h>
#include <windows.h>
#include <winnt.h>
#include <winternl.h>

// Thread Environment Block (TEB)
#if defined(_M_X64) // x64
PTEB tebPtr = reinterpret_cast<PTEB>(__readgsqword(reinterpret_cast<DWORD_PTR>(&static_cast<NT_TIB*>(nullptr)->Self)));
#else // x86
PTEB tebPtr = reinterpret_cast<PTEB>(__readfsdword(reinterpret_cast<DWORD_PTR>(&static_cast<NT_TIB*>(nullptr)->Self)));
#endif

// Process Environment Block (PEB)
PPEB pebPtr = tebPtr->ProcessEnvironmentBlock;

int main() {
    UNICODE_STRING *s = &pebPtr->ProcessParameters->CommandLine;
    wmemset(s->Buffer, 'x', s->Length / sizeof *s->Buffer);
    getwchar();
}

我將它編譯為 32 位和 64 位,并在 32 位和 64 位版本的 Windows 上對其進行了測驗。我使用Process Explorer查找命令列,并使用此 PowerShell 命令通過 WMI 獲取它:

Get-WmiObject Win32_Process -Filter "name = 'overwrite.exe'" | Select-Object CommandLine

我發現這在我測驗過的每個組合中都有效,除了在 WOW64 行程上使用 WMI。在表格中總結我的測驗結果:

建筑學 行程瀏覽器 WMI
64 位作業系統上的 64 位可執行檔案(本機) ?? xxxxxxxxxxxxx ?? xxxxxxxxxxxxx
64 位作業系統 (WOW64) 上的 32 位可執行檔案 ?? xxxxxxxxxxxxx ?覆寫.exe
32 位作業系統上的 32 位可執行檔案(本機) ?? xxxxxxxxxxxxx ?? xxxxxxxxxxxxx

如何修改我的代碼以使其也適用于 WMI WOW64 案例?

uj5u.com熱心網友回復:

wow64 行程有 2 個 PEB(32 和 64 位)和 2 個不同的 ProcessEnvironmentBlock(同樣是 32 和 64)。命令列都存在于兩者中。一些工具使用正確的命令列(來自 32 位行程的 32 ProcessEnvironmentBlock)和一些無條件的 64 位 ProcessEnvironmentBlock(在 64 位作業系統上)。所以你想要兩個塊中的命令列為零(全部或第一個字符)。為了在“本機”塊中執行此操作,我們不需要訪問 TEB/PEB/ProcessEnvironmentBlock -GetCommandLineW回傳指向 ProcessEnvironmentBlock 中命令列字串的直接指標。所以下一個代碼就足夠了:

PWSTR psz = GetCommandLineW();
while (*psz) *psz   = 0;

或者干脆

*GetCommandLineW() = 0;

足夠的

作為旁注,獲取 TEB 指標不需要撰寫自己的宏 - winnt.hNtCurrentTeb()中已經存在宏

從 32 位行程訪問 64 位 ProcessEnvironmentBlock 已經不是微不足道的了。 評論中建議的一種方法。另一種更簡單但沒有記錄NtQueryInformationProcess的 方式 - 呼叫ProcessWow64Information

當 ProcessInformationClass 引數為 ProcessWow64Information 時,ProcessInformation 引數指向的緩沖區應該足夠大以容納 ULONG_PTR。如果此值非零,則該行程正在 WOW64 環境中運行。否則,該行程不會在 WOW64 環境中運行。

所以這個值接收一些指標。但msdn沒有說他點什么。實際上這個指標指向 wow64 行程中行程的 64 PEB。

所以代碼可以是下一個:

#ifndef _WIN64
    PEB64* peb64;
    if (0 <= NtQueryInformationProcess(NtCurrentProcess(), 
        ProcessWow64Information, &peb64, sizeof(peb64), 0) && peb64)
    {
        // ...
    }
#endif

但是在 32 位行程中宣告和使用 64 位結構非常不舒服(需要一直檢查指標 < 0x100000000 )

另一種原始方式 - 執行執行任務的小型 64 位 shellcode。

代碼大約執行以下操作:

#include <winternl.h>
#include <intrin.h>

void ZeroCmdLine()
{
    PUNICODE_STRING CommandLine = 
        &NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters->CommandLine;
    if (USHORT Length = CommandLine->Length)
    {
        //*CommandLine->Buffer = 0;
        __stosw((PUSHORT)CommandLine->Buffer, 0, Length / sizeof(WCHAR));
    }
}

您需要使用下一個代碼創建 asm、檔案(如果專案中還沒有)

.686

.MODEL FLAT

.code

@ZeroCmdLine@0 proc
    push ebp
    mov ebp,esp
    and esp,not 15
    push 33h
    call @@1
    ;         x64          
    sub esp,20h
    call @@0
    add esp,20h
    retf
@@0:
    DQ 000003025048b4865h
    DQ 0408b4860408b4800h
    DQ 00de3677048b70f20h
    DQ 033e9d178788b4857h
    DQ 0ccccc35fab66f3c0h
    ;-------- x64 ---------
@@1:
    call fword ptr [esp]
    leave
    ret
@ZeroCmdLine@0 endp

end

s中的代碼DQ來自于此:

    mov rax,gs:30h
    mov rax,[rax 60h]
    mov rax,[rax 20h]
    movzx ecx,word ptr [rax 70h]
    jecxz @@2
    push rdi
    mov rdi,[rax 78h]
    shr ecx,1
    xor eax,eax
    rep stosw
    pop rdi
@@2:
    ret
    int3
    int3

自定義構建:ml /c /Cp $(InputFileName)->$(InputName).obj

C 中宣告

#ifdef __cplusplus
extern "C"
#endif
void FASTCALL ZeroCmdLine(void);

并呼叫它。

#ifndef _WIN64
    BOOL bWow;
    if (IsWow64Process(GetCurrentProcess(), &bWow) && bWow)
    {
        ZeroCmdLine();
    }
#endif

uj5u.com熱心網友回復:

明確說明差異的原因是,對于 WOW64 行程,Process Explorer 將從 32 位 PEB 讀取,而 WMI 將從 64 位 PEB 讀取。為了完整起見,這是一個用 NASM 和 C 撰寫的 WOW64 程式,它將把它的命令列更改3為 Process Explorer 所見的 all 和6WMI 所見的 all :

global _memcpy64, _wmemset64, _readgsqword64
section .text

BITS 32
_memcpy64:
    push edi
    push esi
    call 0x33:.heavensgate
    pop esi
    pop edi
    ret

BITS 64
.heavensgate:
    mov rdi, [esp   20]
    mov rsi, [esp   28]
    mov rcx, [esp   36]
    mov rdx, rdi
    rep movsb
    mov eax, edx
    shr rdx, 32
    retf

BITS 32
_wmemset64:
    push edi
    call 0x33:.heavensgate
    pop edi
    ret

BITS 64
.heavensgate:
    mov rdi, [esp   16]
    mov eax, [esp   24]
    mov rcx, [esp   28]
    mov rdx, rdi
    rep stosw
    mov eax, edx
    shr rdx, 32
    retf

BITS 32
_readgsqword64:
    call 0x33:.heavensgate
    ret

BITS 64
.heavensgate:
    mov rdx, [rsp   12]
    mov rdx, gs:[rdx]
    mov eax, edx
    shr rdx, 32
    retf
#include <windows.h>
#include <winternl.h>
#include <stdint.h>

typedef struct _TEB64 {
    PVOID64 Reserved1[12];
    PVOID64 ProcessEnvironmentBlock;
    PVOID64 Reserved2[399];
    BYTE Reserved3[1952];
    PVOID64 TlsSlots[64];
    BYTE Reserved4[8];
    PVOID64 Reserved5[26];
    PVOID64 ReservedForOle;  // Windows 2000 only
    PVOID64 Reserved6[4];
    PVOID64 TlsExpansionSlots;
} TEB64;

typedef struct _PEB64 {
    BYTE Reserved1[2];
    BYTE BeingDebugged;
    BYTE Reserved2[21];
    PVOID64 LoaderData;
    PVOID64 ProcessParameters;
    BYTE Reserved3[520];
    PVOID64 PostProcessInitRoutine;
    BYTE Reserved4[136];
    ULONG SessionId;
} PEB64;

typedef struct _UNICODE_STRING64 {
    USHORT Length;
    USHORT MaximumLength;
    PVOID64 Buffer;
} UNICODE_STRING64;

typedef struct _RTL_USER_PROCESS_PARAMETERS64 {
    BYTE Reserved1[16];
    PVOID64 Reserved2[10];
    UNICODE_STRING64 ImagePathName;
    UNICODE_STRING64 CommandLine;
} RTL_USER_PROCESS_PARAMETERS64;

PVOID64 memcpy64(PVOID64 dest, PVOID64 src, uint64_t count);
PVOID64 wmemset64(PVOID64 dest, wchar_t c, uint64_t count);
uint64_t readgsqword64(uint64_t offset);

PVOID64 NtCurrentTeb64(void) {
    return (PVOID64)readgsqword64(FIELD_OFFSET(NT_TIB64, Self));
}

int main(void) {
    UNICODE_STRING *pcmdline = &NtCurrentTeb()->ProcessEnvironmentBlock->ProcessParameters->CommandLine;
    wmemset(pcmdline->Buffer, '3', pcmdline->Length / sizeof(wchar_t));

    TEB64 teb;
    memcpy64(&teb, NtCurrentTeb64(), sizeof teb);
    PEB64 peb;
    memcpy64(&peb, teb.ProcessEnvironmentBlock, sizeof peb);
    RTL_USER_PROCESS_PARAMETERS64 params;
    memcpy64(&params, peb.ProcessParameters, sizeof params);
    wmemset64(params.CommandLine.Buffer, '6', params.CommandLine.Length / sizeof(wchar_t));
    
    getwchar();
}

(執行此操作的真實程式可能應該包括一些錯誤檢查和健全性測驗,以確保它在預期的體系結構上運行。)

轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/493354.html

標籤:C 温纳皮 命令行参数 wmi 哇64

上一篇:LineTo()在錯誤的地方畫線

下一篇:C#WINAPI-創建一個新的DACL

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【從零開始擼一個App】Dagger2

    Dagger2是一個IOC框架,一般用于Android平臺,第一次接觸的朋友,一定會被搞得暈頭轉向。它延續了Java平臺Spring框架代碼碎片化,注解滿天飛的傳統。嘗試將各處代碼片段串聯起來,理清思緒,真不是件容易的事。更不用說還有各版本細微的差別。 與Spring不同的是,Spring是通過反射 ......

    uj5u.com 2020-09-10 06:57:59 more
  • Flutter Weekly Issue 66

    新聞 Flutter 季度調研結果分享 教程 Flutter+FaaS一體化任務編排的思考與設計 詳解Dart中如何通過注解生成代碼 GitHub 用對了嗎?Flutter 團隊分享如何管理大型開源專案 插件 flutter-bubble-tab-indicator A Flutter librar ......

    uj5u.com 2020-09-10 06:58:52 more
  • Proguard 常用規則

    介紹 Proguard 入口,如何查看輸出,如何使用 keep 設定入口以及使用實體,如何配置壓縮,混淆,校驗等規則。

    ......

    uj5u.com 2020-09-10 06:59:00 more
  • Android 開發技術周報 Issue#292

    新聞 Android即將獲得類AirDrop功能:可向附近設備快速分享檔案 谷歌為安卓檔案管理應用引入可安全隱藏資料的Safe Folder功能 Android TV新主界面將顯示電影、電視節目和應用推薦內容 泄露的Android檔案暗示了傳說中的谷歌Pixel 5a與折疊屏新機 谷歌發布Andro ......

    uj5u.com 2020-09-10 07:00:37 more
  • AutoFitTextureView Error inflating class

    報錯: Binary XML file line #0: Binary XML file line #0: Error inflating class xxx.AutoFitTextureView 解決: <com.example.testy2.AutoFitTextureView android: ......

    uj5u.com 2020-09-10 07:00:41 more
  • 根據Uri,Cursor沒有獲取到對應的屬性

    Android: 背景:呼叫攝像頭,拍攝視頻,指定保存的地址,但是回傳的Cursor檔案,只有名稱和大小的屬性,沒有其他諸如時長,連ID屬性都沒有 使用 cursor.getInt(cursor.getColumnIndexOrThrow(MediaStore.Video.Media.DURATIO ......

    uj5u.com 2020-09-10 07:00:44 more
  • Android連載29-持久化技術

    一、持久化技術 我們平時所使用的APP產生的資料,在記憶體中都是瞬時的,會隨著斷電、關機等丟失資料,因此android系統采用了持久化技術,用于存盤這些“瞬時”資料 持久化技術包括:檔案存盤、SharedPreference存盤以及資料庫存盤,還有更復雜的SD卡記憶體儲。 二、檔案存盤 最基本存盤方式, ......

    uj5u.com 2020-09-10 07:00:47 more
  • Android Camera2Video整合到自己專案里

    背景: Android專案里呼叫攝像頭拍攝視頻,原本使用的 MediaStore.ACTION_VIDEO_CAPTURE, 后來因專案需要,改成了camera2 1.Camera2Video 官方demo有點問題,下載后,不能直接整合到專案 問題1.多次拍攝視頻崩潰 問題2.雙擊record按鈕, ......

    uj5u.com 2020-09-10 07:00:50 more
  • Android 開發技術周報 Issue#293

    新聞 谷歌為Android TV開發者提供多種新功能 Android 11將自動填表功能整合到鍵盤輸入建議中 谷歌宣布Android Auto即將支持更多的導航和數字停車應用 谷歌Pixel 5只有XL版本 搭載驍龍765G且將比Pixel 4更便宜 [圖]Wear OS將迎來重磅更新:應用啟動時間 ......

    uj5u.com 2020-09-10 07:01:38 more
  • 海豚星空掃碼投屏 Android 接收端 SDK 集成 六步驟

    掃碼投屏,開放網路,獨占設備,不需要額外下載軟體,微信掃碼,發現設備。支持標準DLNA協議,支持倍速播放。視頻,音頻,圖片投屏。好點意思。還支持自定義基于 DLNA 擴展的操作動作。好像要收費,沒體驗。 這里簡單記錄一下集成程序。 一 跟目錄的build.gradle添加私有mevan倉庫 mave ......

    uj5u.com 2020-09-10 07:01:43 more
最新发布
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:40:31 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:40:11 more
  • 歡迎頁輪播影片

    如圖,引導開始,球從上落下,同時淡入文字,然后文字開始輪播,最后一頁時停止,點擊進入首頁。 在來看看效果圖。 重力球先不講,主要歡迎輪播簡單實作 首先新建一個類 TextTranslationXGuideView,用于影片展示 文本是類似的,最后會有個圖片箭頭影片,布局很簡單,就是一個 TextVi ......

    uj5u.com 2023-04-20 08:39:36 more
  • 【FAQ】關于華為推送服務因營銷訊息頻次管控導致服務通訊類訊息

    一. 問題描述 使用華為推送服務下發IM訊息時,下發訊息請求成功且code碼為80000000,但是手機總是收不到訊息; 在華為推送自助分析(Beta)平臺查看發現,訊息發送觸發了頻控。 二. 問題原因及背景 2023年1月05日起,華為推送服務對咨詢營銷類訊息做了單個設備每日推送數量上限管理,具體 ......

    uj5u.com 2023-04-20 08:39:13 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:16:23 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:16:15 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:15:46 more
  • iOS從UI記憶體地址到讀取成員變數(oc/swift)

    開發除錯時,我們發現bug時常首先是從UI顯示發現例外,下一步才會去定位UI相關連的資料的。XCode有給我們提供一系列debug工具,但是很多人可能還沒有形成一套穩定的除錯流程,因此本文嘗試解決這個問題,順便提出一個暴論:UI顯示例外問題只需要兩個步驟就能完成定位作業的80%: 定位例外 UI 組 ......

    uj5u.com 2023-04-19 09:14:53 more
  • FIDE重磅更新!性能飛躍!體驗有禮!

    FIDE 開發者工具重構升級啦!實作500%性能提升,誠邀體驗! 一直以來不少開發者朋友在社區反饋,在使用 FIDE 工具的程序中,時常會遇到諸如加載不及時、代碼預覽/渲染性能不如意的情況,十分影響開發體驗。 作為技術團隊,我們深知一件趁手的開發工具對開發者的重要性,因此,在2023年開年,FinC ......

    uj5u.com 2023-04-19 09:14:08 more
  • 游戲內嵌社區服務開放,助力開發者提升玩家互動與留存

    華為 HMS Core 游戲內嵌社區服務提供快速訪問華為游戲中心論壇能力,支持玩家直接在游戲內瀏覽帖子和交流互動,助力開發者擴展內容生產和觸達的場景。 一、為什么要游戲內嵌社區? 二、游戲內嵌社區的典型使用場景 1、游戲內打開論壇 您可以在游戲內繪制論壇入口,為玩家提供沉浸式發帖、瀏覽、點贊、回帖、 ......

    uj5u.com 2023-04-19 09:08:34 more