主線程呼叫(通過修改執行緒上下文實現)

2022-05-09 09:06:09 字數 2053 閱讀 8224

思路:將主線程掛起後獲取到主線程的eip,然後將eip修改為shellcode的位址恢復執行緒執行,當shellcode執行完成後跳轉到舊eip處繼續執行。

1 typedef void(__stdcall *pfn_call)(const void *pvin, void *pvout);

23 bool callforthread(dword dwthreadid, pfn_call pfncall, const void *pvin, void *pvout)415

16//

獲取執行緒上下文

17 context context = ;

1819

::suspendthread(hthread);

20 context.contextflags =context_all;

21 ::getthreadcontext(hthread, &context);

2223

//申請shellcode空間

24 void *pvshellcode = ::virtualalloc(null, 0x1000

, mem_commit, page_execute_readwrite);

2526

if (pvshellcode ==null)

2734

35//

填充shellcode

36 dword dwexecutefinishflag = 0

;37 byte bshellcode =;

4849 *(dword *)(&bshellcode[2]) =(dword)pvout;

50 *(dword *)(&bshellcode[7]) =(dword)pvin;

51 *(dword *)(&bshellcode[12]) =(dword)pfncall;

52 *(dword *)(&bshellcode[20]) = (dword)&dwexecutefinishflag;

53 *(dword *)(&bshellcode[30]) =context.eip;

54 memcpy_s(pvshellcode, 0x1000, bshellcode, sizeof

(bshellcode));

5556

//修改eip執行

57 context.eip =(dword)pvshellcode;

58 context.contextflags =context_all;

59 ::setthreadcontext(hthread, &context);

60::resumethread(hthread);

61 ::postthreadmessage(dwthreadid, 0, (wparam)0, (lparam)0

);62

63//

等待執行完成標誌置位

64while (dwexecutefinishflag == 0)65

6869

//判斷shellcode**是否全部執行完成

70 dword dwshellcodebeg =(dword)pvshellcode;

71 dword dwshellcodeend = (dword)pvshellcode + sizeof (bshellcode)-1;72

73while (true)/*

while-1

*/74

84else

8588 }/*

end of while-1

*/89

90 ::virtualfree(pvshellcode, 0x1000

, mem_free);

91 pvshellcode =null;

92::closehandle(hthread);

93 hthread =null;

9495

return

true;

96 }

執行緒池非同步呼叫獲取主線程上下文

在實際開發中遇到的問題,用執行緒池另起乙個執行緒執行 時,存在主線程裡的上下文資訊就會丟失,我這報出的錯誤是獲取不到使用者的登陸資訊,所以找了些資料和同事討論,得出了以下解決方案,將上下文資訊傳入新的執行緒,具體 如下 新建乙個擁有當前執行緒上下文的執行緒池 threadpooltaskexecut...

程序上下文與執行緒上下文

6.1.2 執行緒上下文 作業系統管理很多程序的執行。有些程序是來自各種程式 系統和應用程式的單獨程序,而某些程序來自被分解為很多程序的應用或程式。當乙個程序從核心中移出,另乙個程序成為活動的,這些程序之間便發生了上下文切換。作業系統必須記錄重啟程序和啟動新程序使之活動所需要的所有資訊。這些資訊被稱...

Java執行緒上下文 ThreadLocal的那些事

threadlocal 通常被稱作執行緒本地變數或者執行緒本地儲存。其含義是threadlocal為變數在每個執行緒中都建立乙個副本,則每個執行緒可以訪問自身內部的副本變數。概念總是抽象而且晦澀的,我們從兩個例子說起。如下圖,有個多層呼叫的情況,如果我們需要傳遞某個中間結果在這幾層呼叫關係之間,應該...