创建线程时候多参数传递方法及参数改变问题--扫雷辅助(三)
生活随笔
收集整理的這篇文章主要介紹了
创建线程时候多参数传递方法及参数改变问题--扫雷辅助(三)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
創建線程時候參數傳遞方法及參數改變問題
多參數傳遞
這個是MSDN 給出的函數原型
HANDLE WINAPI CreateRemoteThread(_In_ HANDLE hProcess,_In_ LPSECURITY_ATTRIBUTES lpThreadAttributes,_In_ SIZE_T dwStackSize,_In_ LPTHREAD_START_ROUTINE lpStartAddress,_In_ LPVOID lpParameter,_In_ DWORD dwCreationFlags,_Out_ LPDWORD lpThreadId );lpParameter 我們用于傳遞參數的形參
由于其類型是 LPVOID 感覺MS 命名 就是 (VOID *)類型, 所以對參數進行取址, 在線程中進行轉換就好
如果涉及到多參數傳遞 , 就需要傳遞一個結構體了
struct ThrdPara {HWND hWnd;HWND hWnd2;HANDLE hPipe; };ThrdPara thrdPara; thrdPara.hPipe = m_hPipe; thrdPara.hWnd = ::AfxGetMainWnd()->m_hWnd;CreateRemoteThread(hRemoteProcess, NULL, 0, pfnStartAddr, &thrdPara, 0, NULL))//然后在線程函數里面, 重新轉換為ThrdPara類型即可參數改變問題
遇到了一個難搞的問題, 還是折騰了半天
就以上述代碼為例, 在運行過程中,
發現在主線程中的值, 和在子線程的值,完全不一樣,基本是子線程是隨機的
傳入的值,和子線程得到的不等(還以為發現了啥天大的bug
最后終于找到了問題躲在
func() {CreateThread...//sleepreturn... }這里是代碼結構導致的 , 因為此處,創建完成線程之后, 函數直接返回
讓后,問題就來了 , 傳入的是局部變量, 返回之后, 進過棧平衡,
那這樣我們傳入的地址,早都不知道是啥了;
所以去掉sleep的注釋即可
總結
以上是生活随笔為你收集整理的创建线程时候多参数传递方法及参数改变问题--扫雷辅助(三)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CALL注入--扫雷辅助(二)
- 下一篇: Win Api 有名管道通信--扫雷辅助