windows - Get Thread's Start Address for External Process in C# -
i've setup simple c# program. have imported kernel32.dll openprocess, readprocessmemory , writeprocessmemory.
i've acquired external process process class.
how can startaddress thread #0 specific processthread?
process process = process.getprocessesbyname("calculator")[0]; if (process == null) { console.writeline("process not found"); return; } foreach (processthread thread in process.threads) { console.writeline(thread.startaddress); } the result of code above is:
-157479632 -157479632 -157479632 -157479632 0 -157479632 -157479632 -157479632 -157479632 -157479632 -157479632 -157479632 why there 0's , rest same , negative?
in thread object (struct _ethread) exist 2 different start address - startaddress - address thread begin execute after walk throughout dlls via ldrinitializethunk. exist second address - win32startaddress. sense of address - when create thread win32 function create[remothe]thread (or shell) - win32 level set common thread startaddress ntdll.rtlthreadthreadstart (name of function depend windows version, on xp - name) , actual lpstartaddress passed create[remothe]thread parameter. rtlthreadthreadstart call actual lpstartaddress. lpstartaddress , stored in win32startaddress.
because threads created via win32 create[remothe]thread - have same startaddress (for have startaddress need direct call low-level api rtlcreateuserthread. in system process - startaddress actual thread start address in kernel)
when use code
foreach (processthread thread in process.threads) { console.writeline(thread.startaddress); } you got startaddress - , absolute normal in case give same address. in case can got 0 or incorrect value - because in version windows startaddress saved in union member , can overwritten.
for win32startaddress must have opened thread handle thread_query_limited_information or thread_query_information , call zwqueryinformationthread threadquerysetwin32startaddress
pvoid pv; zwqueryinformationthread(hthread, threadquerysetwin32startaddress, &pv, sizeof(pv), 0); and all negative?
because incorrect print thread address - pointer. print signed integer. must print in hex pointer %p format
Comments
Post a Comment