Psapi.cpp
上传用户:yihongxs01
上传日期:2007-01-05
资源大小:48k
文件大小:14k
源码类别:

系统/网络安全

开发平台:

WINDOWS

  1. #include <windows.h>
  2. DWORD PsGetProcessIdFromModuleName(LPCTSTR szName);
  3. extern "C"{
  4. DWORD __stdcall NtQuerySystemInformation(DWORD,DWORD,DWORD,DWORD);
  5. DWORD __stdcall NtQueryInformationProcess(DWORD,DWORD,DWORD,DWORD,DWORD);
  6. DWORD __stdcall RtlNtStatusToDosError(DWORD);
  7. }
  8. #pragma warning( disable : 4035 )
  9. DWORD __declspec(naked) __stdcall 
  10. EnumProcesses(DWORD* ProcessesId,
  11. DWORD SizeofProcessesIds/*sizeof ProcessesId*/,
  12. DWORD* done)
  13. {
  14. __asm{
  15. ; S u b r o u t i n e
  16. ;EnumProcesses proc ,  pProcessesId: DWORD,
  17. ; sizeofProcessesId :DWORD,
  18. ; pDone: DWORD
  19.                 mov     eax,  fs:0
  20. push ebp
  21. mov ebp, esp
  22. push 0FFFFFFFFh
  23. push 731B3448h
  24. push 731B2E38h
  25. push eax
  26.                 mov      fs:0, esp
  27. sub esp, 14h ; Integer Subtraction
  28. push ebx
  29. push esi
  30. push edi
  31. mov esi, 8000h
  32. xor edi, edi ; Logical Exclusive OR
  33. mov [ebp-18h], esp
  34. loc_731B2B37: ; CODE XREF: EnumProcesses+61.j
  35. push esi
  36. push edi
  37. call dword ptr LocalAlloc ; Indirect Call Near Procedure
  38. mov [ebp-1Ch], eax
  39. cmp eax, edi ; Compare Two Operands
  40. jz loc_731B2C12 ; Jump if Zero (ZF=1)
  41. push edi
  42. push esi
  43. push eax
  44. push 5
  45. call NtQuerySystemInformation ; Indirect Call Near Procedure
  46. cmp eax, 0C0000004h ; Compare Two Operands
  47. jnz short loc_731B2B6D ; Jump if Not Zero (ZF=0)
  48. push dword ptr [ebp-1Ch]
  49. call dword ptr LocalFree ; Indirect Call Near Procedure
  50. add esi, 8000h ; Add
  51. jmp short loc_731B2B37 ; Jump
  52. ;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
  53. loc_731B2B6D: ; CODE XREF: EnumProcesses+50.j
  54. test eax, eax ; Logical Compare
  55. jge short loc_731B2B84 ; Jump if Greater or Equal (SF=OF)
  56. push eax
  57. call RtlNtStatusToDosError ; Indirect Call Near Procedure
  58. push eax
  59. call dword ptr SetLastError ; Indirect Call Near Procedure
  60. jmp loc_731B2C12 ; Jump
  61. ;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
  62. loc_731B2B84: ; CODE XREF: EnumProcesses+65.j
  63. xor esi, esi ; Logical Exclusive OR
  64. mov edx, [ebp+0Ch]
  65. shr edx, 2 ; Shift Logical Right
  66. xor edi, edi ; Logical Exclusive OR
  67. mov ecx, [ebp+8]
  68. loc_731B2B91: ; CODE XREF: EnumProcesses+AB.j
  69. mov eax, [ebp-1Ch]
  70. add eax, esi ; Add
  71. cmp edi, edx ; Compare Two Operands
  72. jnb short loc_731B2BAF ; Jump if Not Below (CF=0)
  73. mov dword ptr [ebp-4], 0
  74. mov ebx, [eax+44h]
  75. mov [ecx+edi*4], ebx
  76. inc edi ; Increment by 1
  77. mov dword ptr [ebp-4], 0FFFFFFFFh
  78. loc_731B2BAF: ; CODE XREF: EnumProcesses+8E.j
  79. mov eax, [eax]
  80. add esi, eax ; Add
  81. test eax, eax ; Logical Compare
  82. jnz short loc_731B2B91 ; Jump if Not Zero (ZF=0)
  83. mov esi, 1
  84. mov [ebp-4], esi
  85. lea ecx, ds:0[edi*4] ; Load Effective Address
  86. mov eax, [ebp+10h]
  87. mov [eax], ecx
  88. mov dword ptr [ebp-4], 0FFFFFFFFh
  89. push dword ptr [ebp-1Ch]
  90. call dword ptr LocalFree ; Indirect Call Near Procedure
  91. mov eax, esi
  92. jmp short loc_731B2C14 ; Jump
  93. loc_731B2C12: ; CODE XREF: EnumProcesses+3A.j
  94. ; EnumProcesses+75.j
  95. xor eax, eax ; Logical Exclusive OR
  96. loc_731B2C14: ; CODE XREF: EnumProcesses+D3.j
  97. mov ecx, [ebp-10h]
  98. pop edi
  99.                 mov      fs:0, ecx
  100. pop esi
  101. pop ebx
  102. mov esp, ebp
  103. pop ebp
  104. retn 0Ch ; Return Near from Procedure
  105. }
  106. //;EnumProcesses endp
  107. }
  108. DWORD __declspec(naked) __stdcall 
  109. EnumProcessModules(HANDLE hProcess,
  110.  HMODULE* hModule /*array*/,
  111.  DWORD SizeofhModule/* sizeof(hModule) */,
  112.  DWORD* done)
  113. {
  114. __asm
  115. {
  116. ; S u b r o u t i n e
  117. mov eax, fs:0
  118. push ebp
  119. mov ebp, esp
  120. push 0FFFFFFFFh
  121. push 731B3178h
  122. push 731B2E38h
  123. push eax
  124. mov fs:0, esp
  125. sub esp, 78h ; Integer Subtraction
  126. lea eax, [ebp-40h] ; Load Effective Address
  127. push ebx
  128. push esi
  129. push edi
  130. mov [ebp-18h], esp
  131. push 0
  132. push 18h
  133. push eax
  134. push 0
  135. push dword ptr [ebp+8]
  136. call NtQueryInformationProcess ; Indirect Call Near Procedure
  137. test eax, eax ; Logical Compare
  138. jge short loc_731B15BF ; Jump if Greater or Equal (SF=OF)
  139. push eax
  140. call RtlNtStatusToDosError ; Indirect Call Near Procedure
  141. push eax
  142. call dword ptr SetLastError ; Indirect Call Near Procedure
  143. jmp loc_731B169E ; Jump
  144. ;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
  145. loc_731B15BF: ; CODE XREF: EnumProcessModules+3B.j
  146. push 0
  147. lea eax, [ebp-28h] ; Load Effective Address
  148. push 4
  149. push eax
  150. mov eax, [ebp-3Ch]
  151. add eax, 0Ch ; Add
  152. push eax
  153. push dword ptr [ebp+8]
  154. call dword ptr ReadProcessMemory ; Indirect Call Near Procedure
  155. test eax, eax ; Logical Compare
  156. jz loc_731B169E ; Jump if Zero (ZF=1)
  157. mov esi, [ebp-28h]
  158. push 0
  159. add esi, 14h ; Add
  160. push 4
  161. lea eax, [ebp-1Ch] ; Load Effective Address
  162. push eax
  163. push esi
  164. push dword ptr [ebp+8]
  165. call dword ptr ReadProcessMemory ; Indirect Call Near Procedure
  166. test eax, eax ; Logical Compare
  167. jz loc_731B169E ; Jump if Zero (ZF=1)
  168. mov eax, [ebp+10h]
  169. xor edi, edi ; Logical Exclusive OR
  170. shr eax, 2 ; Shift Logical Right
  171. cmp esi, [ebp-1Ch] ; Compare Two Operands
  172. mov [ebp-24h], eax
  173. jz short loc_731B1657 ; Jump if Zero (ZF=1)
  174. mov ebx, [ebp+0Ch]
  175. loc_731B1612: ; CODE XREF: EnumProcessModules+E6.j
  176. mov eax, [ebp-1Ch]
  177. push 0
  178. sub eax, 8 ; Integer Subtraction
  179. push 48h
  180. lea ecx, [ebp-88h] ; Load Effective Address
  181. push ecx
  182. push eax
  183. push dword ptr [ebp+8]
  184. call dword ptr ReadProcessMemory ; Indirect Call Near Procedure
  185. test eax, eax ; Logical Compare
  186. jz short loc_731B169E ; Jump if Zero (ZF=1)
  187. cmp edi, [ebp-24h] ; Compare Two Operands
  188. jnb short loc_731B1649 ; Jump if Not Below (CF=0)
  189. mov dword ptr [ebp-4], 0
  190. mov eax, [ebp-70h]
  191. mov [ebx], eax
  192. mov dword ptr [ebp-4], 0FFFFFFFFh
  193. loc_731B1649: ; CODE XREF: EnumProcessModules+C5.j
  194. add ebx, 4 ; Add
  195. inc edi ; Increment by 1
  196. mov eax, [ebp-80h]
  197. mov [ebp-1Ch], eax
  198. cmp esi, eax ; Compare Two Operands
  199. jnz short loc_731B1612 ; Jump if Not Zero (ZF=0)
  200. loc_731B1657: ; CODE XREF: EnumProcessModules+9E.j
  201. mov eax, 1
  202. mov [ebp-4], eax
  203. lea edx, ds:0[edi*4] ; Load Effective Address
  204. mov ecx, [ebp+14h]
  205. mov [ecx], edx
  206. mov dword ptr [ebp-4], 0FFFFFFFFh
  207. jmp short loc_731B16A0 ; Jump
  208. loc_731B169E: ; CODE XREF: EnumProcessModules+4B.j
  209. ; EnumProcessModules+6A.j ...
  210. xor eax, eax ; Logical Exclusive OR
  211. loc_731B16A0: ; CODE XREF: EnumProcessModules+103.j
  212. mov ecx, [ebp-10h]
  213. pop edi
  214. mov fs:0, ecx
  215. pop esi
  216. pop ebx
  217. mov esp, ebp
  218. pop ebp
  219. retn 10h ; Return Near from Procedure
  220. }
  221. //EnumProcessModules endp
  222. }
  223. __declspec(naked) sub_731B14A5()
  224. {
  225. __asm{
  226. ; S u b r o u t i n e
  227. ;sub_731B14A5 proc near ; CODE XREF: GetModuleFileNameExW+11.p
  228. ; GetModuleBaseNameW+11.p ...
  229. push ebp
  230. mov ebp, esp
  231. sub esp, 20h ; Integer Subtraction
  232. push ebx
  233. lea eax, [ebp-20h] ; Load Effective Address
  234. push esi
  235. push edi
  236. push 0
  237. mov esi, [ebp+8]
  238. push 18h
  239. push eax
  240. push 0
  241. push esi
  242. call NtQueryInformationProcess ; Indirect Call Near Procedure
  243. test eax, eax ; Logical Compare
  244. jge short loc_731B14D3 ; Jump if Greater or Equal (SF=OF)
  245. push eax
  246. call RtlNtStatusToDosError ; Indirect Call Near Procedure
  247. push eax
  248. jmp loc_731B1557 ; Jump
  249. ;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
  250. loc_731B14D3: ; CODE XREF: sub_731B14A5+1F.j
  251. cmp dword ptr [ebp+0Ch], 0 ; Compare Two Operands
  252. mov edi, [ebp-1Ch]
  253. jnz short loc_731B14F3 ; Jump if Not Zero (ZF=0)
  254. push 0
  255. lea eax, [ebp+0Ch] ; Load Effective Address
  256. push 4
  257. lea ecx, [edi+8] ; Load Effective Address
  258. push eax
  259. push ecx
  260. push esi
  261. call dword ptr ReadProcessMemory ; Indirect Call Near Procedure
  262. test eax, eax ; Logical Compare
  263. jz short loc_731B155D ; Jump if Zero (ZF=1)
  264. loc_731B14F3: ; CODE XREF: sub_731B14A5+35.j
  265. push 0
  266. lea eax, [ebp-8] ; Load Effective Address
  267. push 4
  268. add edi, 0Ch ; Add
  269. push eax
  270. push edi
  271. push esi
  272. call dword ptr ReadProcessMemory ; Indirect Call Near Procedure
  273. test eax, eax ; Logical Compare
  274. jz short loc_731B155D ; Jump if Zero (ZF=1)
  275. mov edi, [ebp-8]
  276. push 0
  277. add edi, 14h ; Add
  278. push 4
  279. lea eax, [ebp-4] ; Load Effective Address
  280. push eax
  281. push edi
  282. push esi
  283. call dword ptr ReadProcessMemory ; Indirect Call Near Procedure
  284. test eax, eax ; Logical Compare
  285. jz short loc_731B155D ; Jump if Zero (ZF=1)
  286. cmp [ebp-4], edi ; Compare Two Operands
  287. jz short loc_731B1555 ; Jump if Zero (ZF=1)
  288. mov ebx, [ebp+10h]
  289. loc_731B152C: ; CODE XREF: sub_731B14A5+AE.j
  290. mov eax, [ebp-4]
  291. push 0
  292. sub eax, 8 ; Integer Subtraction
  293. push 48h
  294. push ebx
  295. push eax
  296. push esi
  297. call dword ptr ReadProcessMemory ; Indirect Call Near Procedure
  298. test eax, eax ; Logical Compare
  299. jz short loc_731B155D ; Jump if Zero (ZF=1)
  300. mov eax, [ebp+0Ch]
  301. cmp [ebx+18h], eax ; Compare Two Operands
  302. jz short loc_731B1568 ; Jump if Zero (ZF=1)
  303. mov eax, [ebx+8]
  304. mov [ebp-4], eax
  305. cmp eax, edi ; Compare Two Operands
  306. jnz short loc_731B152C ; Jump if Not Zero (ZF=0)
  307. loc_731B1555: ; CODE XREF: sub_731B14A5+82.j
  308. push 6
  309. loc_731B1557: ; CODE XREF: sub_731B14A5+29.j
  310. call dword ptr SetLastError ; Indirect Call Near Procedure
  311. loc_731B155D: ; CODE XREF: sub_731B14A5+4C.j
  312. ; sub_731B14A5+63.j ...
  313. xor eax, eax ; Logical Exclusive OR
  314. loc_731B155F: ; CODE XREF: sub_731B14A5+C8.j
  315. pop edi
  316. pop esi
  317. pop ebx
  318. mov esp, ebp
  319. pop ebp
  320. retn 0Ch ; Return Near from Procedure
  321. loc_731B1568: ; CODE XREF: sub_731B14A5+A4.j
  322. mov eax, 1
  323. jmp short loc_731B155F ; Jump
  324. ;sub_731B14A5 endp
  325.  
  326.  }
  327. }
  328. DWORD __declspec(naked) __stdcall GetModuleBaseNameW(HANDLE hProcess,HMODULE hMod,
  329. WCHAR* szProcessName,
  330. DWORD SizeofszProcessName/* sizeof szProcessName*/ )
  331. {
  332. __asm
  333. {
  334. ; S u b r o u t i n e
  335. push ebp
  336. mov ebp, esp
  337. sub esp, 48h ; Integer Subtraction
  338. push esi
  339. lea eax, [ebp-48h] ; Load Effective Address
  340. push eax
  341. push dword ptr [ebp+0Ch]
  342. push dword ptr [ebp+8]
  343. call sub_731B14A5 ; Call Procedure
  344. test eax, eax ; Logical Compare
  345. jnz short loc_731B1793 ; Jump if Not Zero (ZF=0)
  346. xor eax, eax ; Logical Exclusive OR
  347. jmp short loc_731B17CB ; Jump
  348. loc_731B1793: ; CODE XREF: GetModuleBaseNameW+18.j
  349. movzx esi, word ptr [ebp-1Ah] ; Move with Zero-Extend
  350. mov eax, [ebp+14h]
  351. add eax, eax ; Add
  352. cmp esi, eax ; Compare Two Operands
  353. jbe short loc_731B17A2 ; Jump if Below or Equal (CF=1 | ZF=1)
  354. mov esi, eax
  355. loc_731B17A2: ; CODE XREF: GetModuleBaseNameW+29.j
  356. push 0
  357. push esi
  358. push dword ptr [ebp+10h]
  359. push dword ptr [ebp-18h]
  360. push dword ptr [ebp+8]
  361. call dword ptr ReadProcessMemory ; Indirect Call Near Procedure
  362. test eax, eax ; Logical Compare
  363. jnz short loc_731B17BC ; Jump if Not Zero (ZF=0)
  364. xor eax, eax ; Logical Exclusive OR
  365. jmp short loc_731B17CB ; Jump
  366. loc_731B17BC: ; CODE XREF: GetModuleBaseNameW+41.j
  367. movzx eax, word ptr [ebp-1Ah] ; Move with Zero-Extend
  368. cmp eax, esi ; Compare Two Operands
  369. jnz short loc_731B17C7 ; Jump if Not Zero (ZF=0)
  370. sub esi, 2 ; Integer Subtraction
  371. loc_731B17C7: ; CODE XREF: GetModuleBaseNameW+4D.j
  372. mov eax, esi
  373. shr eax, 1 ; Shift Logical Right
  374. loc_731B17CB: ; CODE XREF: GetModuleBaseNameW+1C.j
  375. ; GetModuleBaseNameW+45.j
  376. pop esi
  377. mov esp, ebp
  378. pop ebp
  379. retn 10h ; Return Near from Procedure
  380. ;GetModuleBaseNameW endp
  381. }
  382. }
  383. DWORD __declspec(naked) __stdcall GetModuleBaseNameA(HANDLE hProcess,HMODULE hMod,
  384. char* szProcessName,
  385. DWORD SizeofszProcessName/* sizeof szProcessName*/ )
  386. {
  387. __asm
  388. {
  389. push ebx
  390. push esi
  391. mov esi, [esp+18h]
  392. push edi
  393. push ebp
  394. lea eax, ds:0[esi*2] ; Load Effective Address
  395. push eax
  396. push 0
  397. call dword ptr LocalAlloc ; Indirect Call Near Procedure
  398. mov edi, eax
  399. test edi, edi ; Logical Compare
  400. jnz short loc_731B17F4 ; Jump if Not Zero (ZF=0)
  401. xor eax, eax ; Logical Exclusive OR
  402. jmp short loc_731B1830 ; Jump
  403. ;哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪哪
  404. loc_731B17F4: ; CODE XREF: GetModuleBaseNameA+1C.j
  405. push esi
  406. push edi
  407. push dword ptr [esp+20h]
  408. push dword ptr [esp+20h]
  409. call GetModuleBaseNameW ; Call Procedure
  410. mov ecx, eax
  411. cmp eax, esi ; Compare Two Operands
  412. mov ebx, eax
  413. jnb short loc_731B180E ; Jump if Not Below (CF=0)
  414. lea ecx, [ebx+1] ; Load Effective Address
  415. loc_731B180E: ; CODE XREF: GetModuleBaseNameA+37.j
  416. xor ebp, ebp ; Logical Exclusive OR
  417. push ebp
  418. push ebp
  419. push esi
  420. push dword ptr [esp+28h]
  421. push ecx
  422. push edi
  423. push ebp
  424. push ebp
  425. call dword ptr WideCharToMultiByte ; Indirect Call Near Procedure
  426. test eax, eax ; Logical Compare
  427. jnz short loc_731B1827 ; Jump if Not Zero (ZF=0)
  428. xor ebx, ebx ; Logical Exclusive OR
  429. loc_731B1827: ; CODE XREF: GetModuleBaseNameA+51.j
  430. push edi
  431. call dword ptr LocalFree ; Indirect Call Near Procedure
  432. mov eax, ebx
  433. loc_731B1830: ; CODE XREF: GetModuleBaseNameA+20.j
  434. pop ebp
  435. pop edi
  436. pop esi
  437. pop ebx
  438. retn 10h ; Return Near from Procedure
  439. ;GetModuleBaseNameA endp
  440. }
  441. }
  442. DWORD PsGetProcessIdFromModuleName(LPCTSTR szName)
  443. {
  444. DWORD ProcessesId[1024],cProcesses,done;
  445. DWORD pid;
  446. HMODULE hMod;
  447. HANDLE hProcess;
  448. char szProcessName[MAX_PATH];
  449. unsigned i;
  450. if(!EnumProcesses(ProcessesId,sizeof(ProcessesId),&done))
  451. {
  452. return (DWORD)-1;
  453. }
  454. cProcesses = done / sizeof(DWORD);
  455. for(i=2;i<cProcesses;i++)
  456. {
  457. strcpy(szProcessName,"unknown");
  458. pid = ProcessesId[i];
  459. hProcess = OpenProcess(PROCESS_QUERY_INFORMATION|
  460. PROCESS_VM_READ,
  461. FALSE,pid);
  462. if(!hProcess) continue;
  463. if(EnumProcessModules(hProcess,&hMod,sizeof(hMod),&done) )
  464. {
  465. GetModuleBaseNameA(hProcess,hMod,szProcessName,sizeof(szProcessName));
  466. }
  467. CloseHandle(hProcess);
  468. if(!strcmp(szProcessName,szName)) return pid;
  469. }
  470. return 0;
  471. }