home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Tools / ApiHooks 3.0 / FINDPROC.INC < prev    next >
Encoding:
Text File  |  2000-06-19  |  12.6 KB  |  354 lines

  1. ;-------------------------------------------------------------------------------
  2. ;Tries to return PID of process specified by ProcName.
  3. ;Returns PIDERROR if there was error in memory allocation or snapshot
  4. ;creation or process was not found.
  5. ;ProcName can be: "process.exe","PathTo\process.exe" or special names
  6. ;like: "System" or (NT5+) "[System Process]".
  7. ;ProcName must be ANSI string.
  8. ;In NT5+ (Win2K+) is used NtQuery only if ProcName was "PathTo\process.exe"
  9. ;otherwise is used Toolhelp32 (supports NT5+ special names.
  10.  
  11.   FindProcessNT5   PROC USES EBX ESI EDI, ProcName
  12.    LOCAL     NamePos                  :DWORD
  13.    LOCAL     ModEntry0                :PEB_MODULE_ENTRY0
  14.    LOCAL     CandName                 :DWORD
  15.    LOCAL     MMbase                   :DWORD
  16.    LOCAL     StartStop                :DWORD
  17.    LOCAL     pbi                      :PROCESS_BASIC_INFORMATION
  18.    LOCAL     process                  :PROCESSENTRY32
  19.    LOCAL     PIDarray[MAX_PIDs]       :DWORD
  20.    LOCAL     ModName[MAX_PATH]        :WCHAR
  21.    LOCAL     ModName2[MAX_PATH]       :WCHAR
  22.  
  23. ;-----------------------------------------------
  24. ; Do primitive MultiByteToWideChar:
  25. ; ProcName -> ModName
  26.    MOV       EAX, ProcName
  27.    MOV       NamePos, EAX
  28.    LEA       EDI, ModName
  29.    MOV       ESI, ProcName
  30.    XOR       EAX, EAX
  31.    MOV       CandName, EDI
  32.   NChar:
  33.    LODSB
  34.    STOSW
  35.    CMP       AL, "\"
  36.    JNE       @F
  37.    MOV       CandName, EDI      ;dest base name: process.exe
  38.    MOV       NamePos, ESI       ;src base name
  39.   @@:
  40.    TEST      AL,  AL
  41.    JNE       NChar
  42. ;-----------------------------------------------
  43.    MOV       EAX, W32Version
  44.    TEST      EAX, EAX
  45.    JS        DoW9X
  46.    CMP       AL, 4         ;NT4- has NtQuery only
  47.    JBE       DoNT4
  48.    MOV       ECX, NamePos
  49.    CMP       ECX, ProcName ;if there was NOT PathTo then NamePos == ProcName
  50.    JE        DoW9X         ;and then use Toolhelp32
  51. ;-----------------------------------------------
  52.   DoNT4:
  53. ;Do usual things: allocate memory, call ntquery, ...
  54.    oMOV      EBX, START_SIZE_FOR_NTQUERY
  55.  
  56.   @@:
  57.    iWin32    VirtualAlloc, NULL, EBX, MEM_COMMIT, PAGE_EXECUTE_READWRITE
  58.    TEST      EAX, EAX
  59.    JE        FNT4NoMem
  60.    MOV       ESI, EAX
  61.    sWin32    NtQuerySystemInformation, SystemProcessInformation, ESI, EBX, NULL
  62.    CMP       EAX, STATUS_INFO_LENGTH_MISMATCH
  63.    JNE       @F
  64.    iWin32    VirtualFree, ESI,  NULL,  MEM_RELEASE
  65.    ADD       EBX, DELTA_SIZE_FOR_NTQUERY
  66.    JMP       @B
  67.   @@:
  68.    SUB       EDI, EDI            ;PID counter = 0
  69.    TEST      EAX, EAX
  70.    JL        FNT4BadNTQSI        ;native api returned NTSTATUS
  71. ;-----------------------------------------------
  72.   FindBaseNames:
  73.    MOV       EBX, ESI
  74.    ASSUME    EBX: PTR SYSTEM_PROCESS_INFORMATION
  75.    JMP       @F
  76.   NextProc:
  77.    CMP       [EBX].SizeOfBlock, 0     ;if ==0 info ends
  78.    JE        ProcInfoEnd
  79.    ADD       EBX, [EBX].SizeOfBlock   ;to the next block
  80.   @@:
  81.    MOV       EDX, [EBX].ProcessName.Buffer
  82.    MOVZX     ECX, [EBX].ProcessName.Length_
  83.    TEST      EDX, EDX                 ;NULL pointer (Idle process)
  84.    JE        NextProc
  85.    AND       WCHAR PTR [EDX+ECX], 0   ;for sure put zero at the end of unicode string
  86.    iWin32    lstrcmpiW, EDX, CandName ;compare base names
  87.    TEST      EAX, EAX
  88.    JNE       NextProc
  89.    CMP       EDI,  MAX_PIDs           ;maximum candidates
  90.    JAE       ProcInfoEnd
  91.    oMOV      PIDarray[EDI*4], [EBX].ProcessId
  92.    INC       EDI                      ;++ PID counter
  93.    JMP       NextProc
  94.    ASSUME    EBX: NOTHING
  95. ;-----------------------------------------------
  96.   ProcInfoEnd:
  97.   FNT4BadNTQSI:
  98.   ;free buffer for ntquery
  99.    iWin32    VirtualFree, ESI,  NULL,  MEM_RELEASE
  100.    TEST      EDI, EDI                 ;edi == 0 if alloc error or no candidate
  101.    JE        FNT4NoProc
  102.  
  103.    MOV       ECX, CandName
  104.    LEA       EDX, ModName
  105.    MOV       EAX, PIDarray[EDI*4-4]   ;PID of the last candidate (the last == the youngest)
  106.    CMP       ECX, EDX                 ;if ProcessName was without PathTo
  107.    JE        ProcessFound             ;we're done
  108. ;-----------------------------------------------
  109.  ;ProcessName was "PathTo\process.exe"
  110.  ;Complex technique must be used.
  111.  ;Take candidate from last to 1st and if module names are equal return PID.
  112.  
  113.   FindModuleFileName:
  114.    iMOV      EBX, ReadProcessMemory
  115.   NextCnd1:
  116.    DEC       EDI
  117.    JL        FMFNdone    ;no more candidates
  118.   ;open candidate
  119.    iWin32    OpenProcess, PROCESS_QUERY_INFORMATION OR PROCESS_VM_READ,\
  120.                           FALSE,\
  121.                           PIDarray [EDI*4]
  122.    TEST      EAX, EAX
  123.    JE        NextCnd1    ;can't open go next
  124. ;-----------------------------------------------
  125.    PUSH      PIDERROR    ;prepare return code
  126.    MOV       ESI, EAX    ;hProcess
  127.    LEA       ECX, pbi    ;buffer for NtQuery
  128.    sWin32    NtQueryInformationProcess, ESI, ProcessBasicInformation, ECX, SIZEOF pbi, NULL
  129.    TEST      EAX, EAX
  130.    JL        FNT4CloseProc ;native api returned NTSTATUS
  131. ;-----------------------------------------------
  132.    MOV       EAX, pbi.PebBaseAddress
  133.    PUSH      ECX                       ;place for image base
  134.    PUSH      ECX                       ;place for pProcParameters
  135.    MOV       EDX, ESP
  136.    ADD       EAX, PEB.MainImageBase    ;EAX now points to the image base of main module in candidate process
  137.    sWin32    EBX, ESI, EAX, EDX, 4+4, NULL    ;read both image base and pProcParameters
  138.    TEST      EAX, EAX
  139.    POP       EAX                       ;image base
  140.    POP       ECX                       ;pProcParameters
  141.    JE        FNT4CloseProc             ;ReadMemory failed
  142.    JECXZ     FNT4CloseProc             ;pProcParameters == NULL -> process is not initialized
  143.    ADD       ECX, PROCESS_PARAMETERS.pFirstModEntry0
  144.    MOV       MMbase, EAX      ;main module base
  145.    LEA       EDX, StartStop
  146.    sWin32    EBX, ESI, ECX, EDX, 4, NULL   ;read  pFirstModEntry0 to StartStop
  147.    TEST      EAX, EAX
  148.    JE        FNT4CloseProc
  149. ;-----------------------------------------------
  150.  ;walk thru ModEntry0 chain and compare ImageBase with MainModuleImageBase
  151.  ;== search for main module
  152.  ;ModEntries are in round queue (last points to 1st)
  153.  
  154.    MOV       EAX, StartStop
  155.    JMP       @F
  156.   NextMod:
  157.    CMP       EAX, StartStop
  158.    JE        FNT4CloseProc
  159.   @@:
  160.    LEA       EDX, ModEntry0
  161.    sWin32    EBX, ESI, EAX, EDX, SIZEOF ModEntry0, NULL
  162.    TEST      EAX, EAX
  163.    JE        FNT4CloseProc       ;can't read ModuleEntry0
  164.    MOV       ECX, MMbase
  165.    MOV       EAX, ModEntry0.pNextModEntry0
  166.    CMP       ECX, ModEntry0.ImageBase  ;compare bases
  167.    JNE       NextMod
  168. ;-----------------------------------------------
  169. ;main module entry was read into ModEntry0
  170.   NameFirst1:
  171.    LEA       EDX, ModName2   ;here read full candidate name
  172.    MOVZX     ECX, ModEntry0.ModuleFileName.Length_   ;how much bytes
  173.    PUSH      EDX
  174.    PUSH      ECX
  175.    sWin32    EBX, ESI, ModEntry0.ModuleFileName.Buffer, EDX, ECX, NULL
  176.    TEST      EAX, EAX
  177.    POP       ECX             ;length
  178.    POP       EDX             ;full name
  179.    JE        FNT4CloseProc   ;can't read
  180.    LEA       EAX, ModName
  181.    AND       WCHAR PTR [EDX+ECX], 0   ;for sure 0 at the end of buffer
  182.    iWin32    lstrcmpiW, EDX, EAX   ;compare full names
  183.    TEST      EAX, EAX
  184.    JNE       FNT4CloseProc   ;no match -> try next process
  185.    POP       ECX             ;remove prepared return code
  186.    PUSH      PIDarray[EDI*4] ;put new return code: PID of candidate
  187.   FNT4CloseProc:
  188.    iWin32    CloseHandle, ESI ;close used process
  189.    POP       EAX
  190.    CMP       EAX, PIDERROR
  191.    JNE       ProcessFound     ;success -> return PID
  192.   NextCnd:
  193.    JMP       NextCnd1         ;try next process
  194.   FNT4NoProc:
  195.   FNT4NoMem:
  196.   FMFNdone:
  197.    oMOV      EAX, PIDERROR    ;some error or can't find matching process
  198.   ProcessFound:
  199.    JMP       Fin0
  200. ;-----------------------------------------------
  201. ;9x and NT5+ (if there was not PathTo) part:
  202. ;do standard Toolhelp32 things and work with ANSI strings
  203.  
  204.   DoW9X:
  205.    oMOV      EDI, PIDERROR    ;prepare return code
  206.    LEA       ESI, process
  207.    ASSUME    ESI: PTR PROCESSENTRY32
  208.    sWin32    CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
  209.    MOV       EBX, EAX
  210.    CMP       EAX, EDI ; -1 == PIDERROR
  211.    JE        Fin0
  212.  
  213.    MOV       [ESI].dwSize, PROCESSENTRY32   ; a must
  214.    sWin32    Process32First, EBX, ESI
  215.   CheckProc:
  216.    TEST      EAX, EAX
  217.    JE        Fin
  218.    LEA       EAX, [ESI].szExeFile   ;always Ansi (but NT5+ has Process32FirstW/NextW)
  219.  
  220.    MOV       ECX, NamePos
  221.    MOV       EDX, EAX
  222.    CMP       ECX, ProcName
  223.    JE        @F                 ;if ProcName doesn't contain PathTo\ ....
  224.    MOV       ECX, ProcName
  225.    JMP       CompareWithPath    ;else do this
  226.  
  227.   @@:
  228.    CMP       ACHAR PTR [EAX], 0  ;string ends?
  229.    JE        @F
  230.    CMP       ACHAR PTR [EAX], "\"
  231.    JE        @Fond
  232.    INC       EAX
  233.    JMP       @B
  234.  @Fond:
  235.    INC       EAX
  236.    MOV       EDX, EAX           ;... base name in szExeFile must be found
  237.    JMP       @B
  238.   @@:
  239.  
  240.  CompareWithPath:
  241.    iWin32    lstrcmpiA, EDX, ECX
  242.    TEST      EAX, EAX
  243.    JNE       @F
  244.    MOV       EDI, [ESI].th32ProcessID  ;if names are equal then EDI = PID
  245.   @@:
  246.    sWin32    Process32Next, EBX, ESI
  247.    JMP       CheckProc                ;find last process with matching name
  248.    ASSUME    ESI: NOTHING
  249.   Fin:
  250.    iWin32    CloseHandle, EBX      ;destroy snapshot
  251.    MOV       EAX, EDI
  252.   Fin0:
  253.    RET
  254.  FindProcessNT5   ENDP
  255. ;-------------------------------------------------------------------------------
  256. ;Builds list of current process identifiers. User must supply buffer (pPIDs)
  257. ;and its size (SizeInPIDs) in dwords.
  258. ;Returns PIDERROR if there was error in memory allocation or snapshot
  259. ;creation. Otherwise returns number of current PIDs. If the returned value
  260. ;is greater than SizeInPIDs, caller has to provide larger buffer.
  261. ;In NT5+ (Win2K+) is used NtQuery instead of Toolhelp32 because of speed.
  262.  
  263.  BuildPIDList PROC USES EBX ESI EDI, pPIDs, SizeInPIDs
  264.    LOCAL     process  :PROCESSENTRY32
  265.  
  266.   ;1st determine OS:  if Win9x -> Toolhelp32, if NT -> NtQuery
  267.    MOV       EDI, pPIDs   ;STOSD will be used
  268.    MOV       EAX, W32Version
  269.    TEST      EAX, EAX
  270.    JS        DoW9Xp
  271.  
  272. ;-----------------------------------------------
  273. ;NT part:
  274.    oMOV      EBX, START_SIZE_FOR_NTQUERY
  275.   @@:
  276.    iWin32    VirtualAlloc, NULL, EBX, MEM_COMMIT, PAGE_EXECUTE_READWRITE
  277.    MOV       ESI, EAX
  278.    DEC       EAX  ;NULL -> PIDERROR ;because in user mode NT is any memo < 80000000H
  279.    JL        Fin
  280.    sWin32    NtQuerySystemInformation, SystemProcessInformation, ESI, EBX, NULL
  281.    CMP       EAX, STATUS_INFO_LENGTH_MISMATCH  ;too little memory?
  282.    JNE       @F
  283.    iWin32    VirtualFree, ESI,  NULL,  MEM_RELEASE  ;yes free and alloc more
  284.    ADD       EBX, DELTA_SIZE_FOR_NTQUERY
  285.    JMP       @B
  286.   @@:
  287.    TEST      EAX, EAX
  288.    JL        QueryOrAllocFailed  ;native api returned NTSTATUS
  289. ;-----------------------------------------------
  290.    MOV       EBX, ESI
  291.    ASSUME    EBX: PTR SYSTEM_PROCESS_INFORMATION
  292.    SUB       ECX, ECX        ;PID counter = 0
  293.    JMP       @F
  294.   NextProc:
  295.    CMP       [EBX].SizeOfBlock, 0   ;size ==0 -> info ends
  296.    JE        NTPIDsDone
  297.    ADD       EBX, [EBX].SizeOfBlock
  298.   @@:
  299.    CMP       ECX, SizeInPIDs
  300.    JGE       @F                     ;must not exceed size of the buffer
  301.    MOV       EAX, [EBX].ProcessId
  302.    STOSD
  303.   @@:
  304.    INC       ECX                    ; ++PID counter
  305.    JMP       NextProc
  306.    ASSUME    EBX: NOTHING
  307.  
  308.   QueryOrAllocFailed:
  309.    oMOV      ECX, PIDERROR
  310.  
  311.   NTPIDsDone:
  312.    PUSH      ECX
  313.    iWin32    VirtualFree, ESI,  NULL,  MEM_RELEASE  ;free memory for ntquery
  314.    POP       EAX
  315.    JMP       Fin
  316. ;-----------------------------------------------
  317. ;9x part:
  318.   DoW9Xp:
  319.   ;create process snapshot:
  320.    LEA       ESI, process
  321.    ASSUME    ESI: PTR PROCESSENTRY32
  322.    sWin32    CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS, 0
  323.    MOV       EBX, EAX
  324.    CMP       EAX, -1      ;-1 == PIDERROR
  325.    JE        Fin
  326.  
  327.   ;do process32first and then repeat process32next until it returns NULL:
  328.    oMOV      [ESI].dwSize, PROCESSENTRY32
  329.    sWin32    Process32First, EBX, ESI
  330.    SUB       ECX, ECX
  331.   CheckProc:
  332.    TEST      EAX, EAX
  333.    JE        FreeSnapshot
  334.    CMP       ECX, SizeInPIDs
  335.    JGE       @F
  336.    MOV       EAX, [ESI].th32ProcessID
  337.    STOSD
  338.   @@:
  339.    INC       ECX
  340.    PUSH      ECX
  341.    sWin32    Process32Next, EBX, ESI
  342.    POP       ECX
  343.    JMP       CheckProc
  344.    ASSUME    ESI: NOTHING
  345.  
  346.   FreeSnapshot:
  347.    PUSH      ECX
  348.    iWin32    CloseHandle, EBX   ;close snapshot
  349.    POP       EAX
  350.  
  351.   Fin:
  352.    RET
  353.  BuildPIDList ENDP
  354. ;-------------------------------------------------------------------------------