home *** CD-ROM | disk | FTP | other *** search
/ Cracking 2 / Cracking II..iso / Tools / ApiHooks 3.0 / ApiHooksDLL.bat < prev    next >
Encoding:
DOS Batch File  |  2000-06-18  |  20.1 KB  |  562 lines

  1. ;@goto translate
  2.  
  3.  
  4. .586P
  5.  
  6. .MODEL             FLAT, STDCALL
  7.  
  8.    OPTION          CASEMAP: NONE
  9.  
  10.  
  11.    INCLUDE         WINDOWS.inc
  12.    UNICODE         = FALSE
  13.    INCLUDE         APIMACRO.mac
  14.    INCLUDE         NtStatus.inc
  15.  
  16.    INCLUDE         AHinc.inc
  17.  
  18.    INCLUDE         ApiHooks.inc
  19.  
  20.    INCLUDE         NtStruc.inc
  21.  
  22.    INCLUDELIB      iKERNEL32.lib
  23.    INCLUDELIB      iUSER32.lib
  24.    INCLUDELIB      iADVAPI32.lib
  25. ;------------------------------------------------------------------------------
  26. .CODE
  27.  
  28.    ASSUME          FS: NOTHING
  29.  
  30.    INCLUDE         ApiWorks.inc
  31.    TEXTA           zSE_DEBUG_NAME,  <SeDebugPrivilege/0>
  32.    INCLUDE         ModWorks.inc
  33.  
  34.    ;place for APIs which were retrieved via GetProcAddress
  35.    ;initialzed with names of APIs for saving image size
  36.  
  37.    ALIGN 4
  38.    VirtualAllocEx  LABEL DWORD
  39.    K32             BYTE  'KERN'
  40.    sK32            EQU   OFFSET K32
  41.    VirtualFreeEx   LABEL DWORD
  42.                    BYTE  'EL32'
  43.    CreateToolhelp32Snapshot  LABEL DWORD
  44.                    BYTE  '.DLL'
  45.    NtQueryInformationProcess  LABEL DWORD
  46.                    BYTE  0
  47.    CT32S           BYTE  'Cre'
  48.    sCT32S          EQU   OFFSET CT32S
  49.    NtQuerySystemInformation   LABEL DWORD
  50.                    BYTE  'ateT'
  51.    RtlCreateUserThread   LABEL DWORD
  52.                    BYTE  'oolh'
  53.    NtQueryInformationThread  LABEL DWORD
  54.                    BYTE  'elp3'
  55.    Thread32First   LABEL DWORD
  56.                    BYTE  '2Sna'
  57.    Thread32Next    LABEL DWORD
  58.                    BYTE  'psho'
  59.    NtOpenThread    LABEL DWORD
  60.                    BYTE  't',0
  61.    T32F            BYTE  'Th'
  62.    sT32F           EQU   OFFSET T32F
  63.    W32Version      LABEL DWORD
  64.                    BYTE  'read'
  65.    CurrentProcess  LABEL DWORD
  66.                    BYTE  '32Fi'
  67.    CurPID          LABEL DWORD
  68.                    BYTE  'rst',0
  69.  
  70.    RemoteAlloc     DWORD RemoteAlloc9x
  71.    RemoteExec      DWORD RemoteExec9x
  72.    RemoteFree      DWORD RemoteFree9x
  73.    OpenAllThreads  DWORD OpenAllThreads9x
  74.  
  75. ;-----------------------------------------
  76.   ;For NT user thread termination is used NtTerminateThread not ExitThread,
  77.   ;because KERNEL32.dll may not be present in the target process, while
  78.   ;NTDLL.dll is present everywhere. For more comfort I could prepend
  79.   ;LdrShutdownThread.
  80.   NTThreadExit:
  81.    PUSHp     EAX,  CurrentThread, EAX    ; 4
  82.    BYTE      68H     ;PUSH DWORD         ;+1
  83.    NtTerminateThread  DWORD ?            ;+4
  84.    RET                                   ;+1
  85.   NTThreadExitSize  EQU ($-NTThreadExit) ; 10 ~ 12 = movsd,movsd,movsd
  86. ;-----------------------------------------
  87.    ;names of NT APIs for GetProcAddress
  88.  
  89.    TEXTA     VAEX, <VirtualAllocEx/0>
  90.    TEXTA     VFEX, <VirtualFreeEx/0>
  91.    TEXTA     NOPT, <NtOpenThread/0>
  92.    TEXTA     NQIP, <NtQueryInformationProcess/0>
  93.    TEXTA     NQSI, <NtQuerySystemInformation/0>
  94.    TEXTA     RCUT, <RtlCreateUserThread/0>
  95.    TEXTA     NTTH, <NtTerminateThread/0>
  96.    TEXTA     NQIT, <NtQueryInformationThread/0>
  97. ;=================================================================================
  98.   DllMain          PROC
  99.    CMP       DWORD PTR [ESP+8], DLL_PROCESS_ATTACH ;only this is important
  100.    JNE       DllMainRet
  101.    iWin32    DisableThreadLibraryCalls, [ESP+4] ;don't bother with DLL_THREAD_*
  102.    PUSHp     ESI, EDI             ;save used registers
  103. ;--------------
  104.    iWin32i   GetModuleHandle, sK32     ;initialize KERNEL32 APIs
  105.    iMOV      ESI, GetProcAddress
  106.    MOV       EDI, EAX
  107.    sWin32    ESI, EDI, sVAEX
  108.    MOV       VirtualAllocEx, EAX
  109.    sWin32    ESI, EDI, sVFEX
  110.    MOV       VirtualFreeEx,  EAX
  111.    sWin32    ESI, EDI, sCT32S
  112.    MOV       CreateToolhelp32Snapshot, EAX
  113.    sWin32    ESI, EDI, sT32F
  114.    MOV       Thread32First,  EAX
  115.    sWin32    ESI, EDI, sT32N
  116.    MOV       Thread32Next,   EAX
  117.  
  118.    iWin32i   GetModuleHandle, sNTDLL    ;initialize NTDLL APIs
  119.    MOV       EDI, EAX
  120.    sWin32    ESI, EDI, sNOPT
  121.    MOV       NtOpenThread, EAX
  122.    sWin32    ESI, EDI, sNQIP
  123.    MOV       NtQueryInformationProcess, EAX
  124.    sWin32    ESI, EDI, sNQSI
  125.    MOV       NtQuerySystemInformation, EAX
  126.    sWin32    ESI, EDI, sRCUT
  127.    MOV       RtlCreateUserThread, EAX
  128.    sWin32    ESI, EDI, sNTTH
  129.    MOV       NtTerminateThread, EAX
  130.    sWin32    ESI, EDI, sNQIT
  131.    MOV       NtQueryInformationThread, EAX
  132. ;--------------------
  133.    ;enable debug privilege for this process if possible
  134.    iWin32    GetCurrentProcess
  135.    PUSH      ECX             ;place for hToken
  136.    MOV       CurrentProcess, EAX
  137.    iWin32    OpenProcessToken, EAX, TOKEN_QUERY OR TOKEN_ADJUST_PRIVILEGES, ESP
  138.    TEST      EAX, EAX
  139.    POP       EDI             ;hToken
  140.    JE        CantOpenToken   ;failed
  141.    ;LookupPrivValue can be excluded if I use hard ntddk value for debug priv.: 14H in LUID
  142.    iWin32i   LookupPrivilegeValue, NULL, szSE_DEBUG_NAME, OFFSET dbLUID
  143.    TEST      EAX, EAX
  144.    JE        CloseToken      ;can't find local (numeric) representation of the privilege
  145.    ;enable the privilege in my token
  146.    iWin32    AdjustTokenPrivileges, EDI, FALSE, OFFSET NewState, 0, NULL, NULL
  147.   CloseToken:
  148.    iWin32    CloseHandle, EDI   ;close hToken
  149.   CantOpenToken:
  150. ;--------------------
  151.    ;initialze APIs for remote codes (ApiWorks and ModWorks)
  152.    iMOV      EAX, VirtualQuery
  153.    MOV       _VirtualQuery, EAX
  154.    iMOV      EAX, GetModuleFileNameA
  155.    MOV       _GetModuleFileNameA, EAX
  156.    iMOV      EAX, LoadLibraryA
  157.    MOV       _LoadLibraryA, EAX
  158.    MOV       _GetProcAddress, ESI  ;in ApiWorks
  159.    MOV       _GetProcAddr, ESI     ;in ModWorks
  160.    iMOV      EAX, GetModuleHandleA
  161.    MOV       _GetModuleHandleA, EAX
  162.    MOV       _DllOperation, EAX
  163.    iMOV      EAX, VirtualProtect
  164.    MOV       _VirtualProtect,  EAX
  165.    iMOV      EAX, lstrcmpiA
  166.    MOV       _lstrcmpiA, EAX
  167.    iMOV      EAX, KERNEL32_ORD_0001
  168.    MOV       _KERNEL32_ORD_0001, EAX
  169.    iMOV      EAX, FreeLibrary
  170.    MOV       _FreeLibrary, EAX
  171. ;--------------------
  172.    iWin32    GetCurrentProcessId
  173.    MOV       CurPID, EAX       ;my PID
  174.    XOR       EAX, FS:TEB.pPEB  ;9x Obsfucator = MyPID ^ TEB.pProcess
  175.    MOV       Obsfucator, EAX
  176. ;--------------------
  177.    iWin32    GetVersion
  178.    MOV       W32Version, EAX
  179.    TEST      EAX, EAX
  180.    JNS       DoNT
  181.  
  182.   DoW9x:                 ;9x stuff
  183.    iMOV      EAX, OpenProcess
  184.    ADD       EAX, 24H
  185.    CMP       DWORD PTR [EAX], 000000B9H   ;is OpenThread routine present?
  186.    JNE       NoOpenThread9x
  187.    MOV       W9xOpenThread, EAX
  188.    JMP       Initialized
  189.  
  190.   DoNT:                  ;NT stuff
  191.    MOV       BYTE PTR W9xJMP0, 75H ;allow NO_UNBIND in ApiWorks: JMP -> JNE
  192.    MOV       RemoteAlloc,   RemoteAllocNT
  193.    MOV       RemoteFree,    RemoteFreeNT
  194.    MOV       OpenAllThreads,OpenAllThreadsNT
  195.    CMP       AL, 5       ;Win2K+ -> don't patch thread info start
  196.    JAE       Initialized
  197.    MOV       ThreadInfoStart,  NT4_SYSTEM_PROCESS_INFORMATION.ThreadInformation + SYSTEM_THREAD_INFORMATION.ClientId.UniqueThread
  198. ;--------------------
  199.   NoOpenThread9x:
  200.   Initialized:
  201.    POPc      ESI, EDI    ;restore used registers
  202. ;--------------------
  203.   DllMainRet:
  204.    XOR       EAX, EAX
  205.    INC       EAX         ;return TRUE
  206.    RET       12
  207.   DllMain          ENDP
  208. ;=================================================================================
  209. ;Exception handler sets EIP to DrWtson, ESP to xFrameESP and EAX to error code
  210.   xHandler         PROC
  211.    MOV       EDX, [ESP+12] ;context
  212.    ADD       EDX, CONTEXT.regEax
  213.    MOV       EAX, [ESP+8]  ;xESP
  214.    MOV       [EDX+CONTEXT.regEip-CONTEXT.regEax], DrWatson
  215.    MOV       [EDX+CONTEXT.regEsp-CONTEXT.regEax], EAX
  216.    oMOV      [EDX+CONTEXT.regEax-CONTEXT.regEax], ErrorException
  217.    XOR       EAX, EAX    ;ExceptionContinueExecution
  218.    RETN
  219.   xHandler         ENDP
  220. ;=================================================================================
  221. ;Checks if process represented by procID is initialzed. In 9x it is always
  222. ;true. In NT it is not true if the process was created suspended and wasn't
  223. ;resumed yet. Remote thread in such a process in Win2K = crash the process.
  224. ;Returns FALSE if process is not initialized other value if is initialized.
  225.  
  226.   IsProcessInitializedOrNotNT PROC procID
  227.    LOCAL     pbi  :PROCESS_BASIC_INFORMATION
  228.  
  229.    MOV       EAX, W32Version
  230.    TEST      EAX, EAX
  231.    JS        Done       ;Win9x -> always initialized
  232.    iWin32    OpenProcess, PROCESS_VM_READ OR PROCESS_QUERY_INFORMATION, FALSE, procID
  233.    TEST      EAX, EAX
  234.    PUSH      TRUE       ;assume initialized
  235.    JE        CantOpenThenInitialized  ;if can't open assume initialized
  236.    LEA       ECX, pbi
  237.    PUSH      EAX        ;save hProc
  238.    sWin32    NtQueryInformationProcess, EAX, ProcessBasicInformation, ECX, SIZEOF pbi, NULL
  239.    TEST      EAX, EAX
  240.    JL        CloseProcess   ;native api returned NTSTATUS
  241.    POP       ECX        ;hProc
  242.    MOV       EAX, pbi.PebBaseAddress
  243.    MOV       EDX, ESP
  244.    ADD       EAX, PEB.pProcParameters   ;address of pointer to target's parameters (of course all pointers are valid in target)
  245.    PUSH      ECX
  246.    iWin32    ReadProcessMemory, ECX, EAX, EDX, 4, NULL ;read the pointer value
  247.   CloseProcess:
  248.    iWin32    CloseHandle  ;close process
  249.   CantOpenThenInitialized:
  250.    POP       EAX  ;if target is not initialized, it has NULL pProcParameters
  251.   Done:
  252.    RET
  253.   IsProcessInitializedOrNotNT ENDP
  254. ;=================================================================================
  255. ;Follow exported APIs stubs. Thre are 2 versions of each one. If NOOPT is
  256. ;defined LINKer procduces standard MS @ library (apihooks.lib). When NOOPT
  257. ;is not defined, created is iLIBrary (iapihooks.lib) and code of stubs is
  258. ;size optimized.
  259.  
  260. PUBLIC   EstablishApiHooksA
  261. IFDEF NOOPT
  262. EstablishApiHooksA PROC        lpszDll, procID
  263.    sWin32    EstablishApiHooks, lpszDll, procID, INFINITE, FALSE,  FALSE
  264.    RET
  265. ELSE
  266. EstablishApiHooksA PROC
  267.    PUSH      FALSE
  268.    PUSH      FALSE
  269.    JMP       EAHT
  270. ENDIF
  271. EstablishApiHooksA ENDP
  272.  
  273. PUBLIC  EstablishApiHooksW
  274. IFDEF NOOPT
  275. EstablishApiHooksW PROC        lpszDll, procID
  276.    sWin32    EstablishApiHooks, lpszDll, procID, INFINITE, TRUE,  FALSE
  277.    RET
  278. ELSE
  279. EstablishApiHooksW PROC
  280.    PUSH      FALSE
  281.    PUSH      TRUE
  282.   EAHT::
  283.    sWin32    EstablishApiHooks, [ESP+20], [ESP+20], INFINITE
  284.    RETN      8
  285. ENDIF
  286. EstablishApiHooksW ENDP
  287. ;=================================================================================
  288. PUBLIC   EstablishApiHooksTimeA
  289. IFDEF NOOPT
  290. EstablishApiHooksTimeA  PROC    lpszDll, procID, ExpTime
  291.    sWin32    EstablishApiHooks, lpszDll, procID, ExpTime,  FALSE, FALSE
  292.    RET
  293. ELSE
  294. EstablishApiHooksTimeA  PROC
  295.    PUSH      FALSE
  296.    PUSH      FALSE
  297.    JMP       EAHTW
  298. ENDIF
  299. EstablishApiHooksTimeA  ENDP
  300.  
  301. PUBLIC   EstablishApiHooksTimeW
  302. IFDEF NOOPT
  303. EstablishApiHooksTimeW  PROC    lpszDll, procID, ExpTime
  304.    sWin32    EstablishApiHooks, lpszDll, procID, ExpTime,  TRUE,  FALSE
  305.    RET
  306. ELSE
  307. EstablishApiHooksTimeW  PROC
  308.    PUSH      FALSE
  309.    PUSH      TRUE
  310.    JMP       EAHTW
  311. ENDIF
  312. EstablishApiHooksTimeW  ENDP
  313. ;=================================================================================
  314. PUBLIC   EstablishApiHooksTimeNTA
  315. IFDEF NOOPT
  316. EstablishApiHooksTimeNTA  PROC  lpszDll, procID, ExpTime
  317.    sWin32    IsProcessInitializedOrNotNT, procID
  318.    sWin32    EstablishApiHooks, lpszDll, procID, ExpTime, FALSE,  EAX
  319.    RET
  320. ELSE
  321. EstablishApiHooksTimeNTA  PROC
  322.    sWin32    IsProcessInitializedOrNotNT, [ESP+8]
  323.    PUSH      EAX
  324.    PUSH      FALSE
  325.    JMP       EAHTW
  326. ENDIF
  327. EstablishApiHooksTimeNTA  ENDP
  328. ;---------------------------------------------
  329. PUBLIC   EstablishApiHooksTimeNTW
  330. IFDEF NOOPT
  331. EstablishApiHooksTimeNTW  PROC  lpszDll, procID, ExpTime
  332.    sWin32    IsProcessInitializedOrNotNT, procID
  333.    sWin32    EstablishApiHooks, lpszDll, procID, ExpTime, TRUE,  EAX
  334.    RET
  335. ELSE
  336. EstablishApiHooksTimeNTW  PROC
  337.    sWin32    IsProcessInitializedOrNotNT, [ESP+8]
  338.    PUSH      EAX
  339.    PUSH      TRUE
  340.   EAHTW::
  341.    sWin32    EstablishApiHooks, [ESP+20], [ESP+20], [ESP+20]
  342.    RETN      12
  343. ENDIF
  344. EstablishApiHooksTimeNTW  ENDP
  345. ;=================================================================================
  346. PUBLIC  RemoteExecuteTime
  347. IFDEF NOOPT
  348. RemoteExecuteTime  PROC      procID, ExpTime, lpBlock, BlockSize, lpCodeEnd
  349.    sWin32    RemoteExecute,  procID, ExpTime, lpBlock, BlockSize, lpCodeEnd, FALSE
  350.    RET
  351. ELSE
  352. RemoteExecuteTime  PROC
  353.    SUB       EAX,  EAX
  354.    JMP       REXTW
  355. ENDIF
  356. RemoteExecuteTime  ENDP
  357. ;---------------------------------------------
  358. PUBLIC  RemoteExecuteTimeNT
  359. IFDEF NOOPT
  360. RemoteExecuteTimeNT  PROC    procID, ExpTime, lpBlock, BlockSize, lpCodeEnd
  361.    sWin32    IsProcessInitializedOrNotNT, procID
  362.    sWin32    RemoteExecute, procID, ExpTime, lpBlock, BlockSize, lpCodeEnd, EAX
  363.    RET
  364. ELSE
  365. RemoteExecuteTimeNT  PROC
  366.    sWin32    IsProcessInitializedOrNotNT, [ESP+4]
  367.   REXTW::
  368.    sWin32    RemoteExecute, [ESP+24], [ESP+24], [ESP+24], [ESP+24], [ESP+24], EAX
  369.    RETN      20
  370. ENDIF
  371. RemoteExecuteTimeNT  ENDP
  372. ;=================================================================================
  373. ;EstablishApiHooks is example of remote code preparation before passing
  374. ;it to RemoteExec. It works with code placed in ApiWorks.inc.
  375.  
  376. EstablishApiHooks  PROC  USES EBX ESI EDI, lpszDll, procID, ExpTime, IsUnicode, ForceRT
  377.    sWin32    RemoteAlloc9x, AlienSize, 0    ;allocate memory (here in this process)
  378.    TEST      EAX, EAX
  379.    MOV       EDI, EAX
  380.    oMOV      EAX, ErrorException
  381.    JE        EAHExit                       ;can't allocate
  382.    PUSH      EDI
  383.    MOV       ESI, AlienScout
  384.    MOV       ECX, AlienSize0/4
  385.    REP       MOVSD                         ;and copy there the block
  386.    POP       EBX                           ;for the next modifications
  387.  
  388.    oMOV      EAX, HOOKS_DYNAMIC
  389.    MOV       ESI, lpszDll
  390.    CMP       [ESI], EAX                    ;check for dynamic hooks
  391.    JNE       @F
  392.    STOSD                                   ;positive -> build dynamic "irp"
  393.    MOV       EAX, ESI                      ;HOOKS_DYNAMIC followed by
  394.    STOSD                                   ;pointer to hooks
  395.    JMP       DynaHooks
  396.   @@:
  397.    CMP       IsUnicode, ECX                ;check for unicode
  398.    JE        CopyDll                       ;ansi? -> copy
  399.    iWin32    WideCharToMultiByte,  ECX,     ECX, ESI, -1, EDI, MAX_PATH,  ECX, ECX
  400.    TEST      EAX, EAX                      ;convert to multibyte
  401.   ErrExc:
  402.    oMOV      EAX, ErrorException
  403.    JE        EAHFreeExit                   ;WCTMB failed
  404.    JMP       DynaHooks
  405.   CopyDll:
  406.    oMOV      ECX, MAX_PATH
  407.   @@:
  408.    LODSB
  409.    STOSB
  410.    TEST      AL,  AL
  411.    JE        DynaHooks
  412.    DEC       ECX
  413.    JE        ErrExc
  414.    JMP       @B
  415.   DynaHooks:
  416.    LEA       EAX, [EBX][@Stop-AlienScout]  ;EAX = EndOf ApiWorks
  417.    sWin32    RemoteExecute, procID, ExpTime, EBX, AlienSize, EAX, ForceRT
  418.   EAHFreeExit:
  419.    PUSH      EAX
  420.    sWin32    RemoteFree9x, EBX      ;free help memory
  421.    POP       EAX
  422.   EAHExit:
  423.    CMP       EAX, ErrorTimeOut      ;evaluate error code
  424.    JBE       @F
  425.    oMOV      EAX, ErrorRemoteExec
  426.   @@:
  427.    RET
  428. EstablishApiHooks  ENDP
  429. ;=================================================================================
  430. ;Tries to run user code in the target process represented by procID.
  431. ;ExpTime is time for operation. Block is specified by lpBlock (start),
  432. ;BlockSize and lpCodeEnd (position of end zone in the block).
  433. ;Bool ForceRT parameter tells that RemoteExec should use remote thread if
  434. ;possible.
  435. ;Returns error code.
  436.  
  437.  RemoteExecute     PROC USES EBX ESI EDI, procID, ExpTime, lpBlock, BlockSize, lpCodeEnd, ForceRT
  438.    SUB       EAX, EAX
  439.    PUSH      xHandler   ;make xframe
  440.    PUSH      FS:(TEB PTR [EAX]).ExceptionList
  441.    MOV       FS:(TEB PTR [EAX]).ExceptionList, ESP
  442.  
  443.    sWin32    RemoteAlloc9x, BlockSize, EAX  ;place for block copy
  444.    TEST      EAX, EAX
  445.    MOV       EDI, EAX
  446.    oMOV      EAX, ErrorRemoteAlloc
  447.    JE        DrWatson                  ;can't allocate memory
  448.    PUSH      EDI
  449.    MOV       ESI, lpBlock
  450.    MOV       ECX, BlockSize
  451.    REP       MOVSB                     ;copy block
  452.    POP       ESI
  453.  
  454.    MOV       EAX, procID               ;compare wanted with my PID
  455.    CMP       EAX, CurPID
  456.    JNE       StrangeProcess
  457.  
  458. ;============CurrentProcess            ;this is this process
  459.    MOV       EAX, lpCodeEnd
  460.    SUB       EAX, lpBlock
  461.    MOV       BYTE PTR [EAX+ESI], 0C3H  ;write RET at the CodeEnd
  462.    sWin32    ESI                       ;and do CALL
  463.    JMP       FreeMe
  464. ;============CurrentProcess
  465.  
  466.  ;evaluate which technique to use:
  467.  
  468.   StrangeProcess:
  469.    MOV       EAX, W32Version
  470.    MOV       ECX, PROCESS_VM_READ OR PROCESS_VM_WRITE OR \
  471.                   PROCESS_VM_OPERATION OR PROCESS_QUERY_INFORMATION
  472.    oLEA      EDX, RemoteExec
  473.    TEST      EAX, EAX
  474.    JS        Initialized       ;Win9x always open thread technique
  475.    CMP       ForceRT, FALSE
  476.    MOV       [EDX], RemoteExec9x   ;open thread
  477.    JE        Initialized
  478.    MOV       [EDX], RemoteExecNT    ;remote thread
  479.    OR        ECX, PROCESS_CREATE_THREAD   ;needed for remote thread technique
  480.  
  481.   Initialized:
  482.    iWin32    OpenProcess, ECX, FALSE, procID
  483.    TEST      EAX, EAX
  484.    MOV       EBX, EAX
  485.    oMOV      EAX, ErrorOpenProcess
  486.    JE        FreeMe                 ;can't open target
  487.  
  488.    sWin32    RemoteAlloc, BlockSize, ABOVE2GB
  489.    TEST      EAX, EAX
  490.    MOV       EDI, EAX
  491.    oMOV      EAX, ErrorRemoteAlloc
  492.    JE        EstablishHooksExit     ;can't allocate memory in the target
  493.    MOV       ECX, lpCodeEnd
  494.    SUB       ECX, lpBlock
  495.    ADD       ECX, ESI
  496.    sWin32    RemoteExec, procID, ExpTime, ESI, BlockSize, ECX
  497.   EstablishHooksExit:
  498.    PUSH      EAX                    ;save error code
  499.    iWin32    CloseHandle,  EBX
  500.    POP       EAX                    ;restore error code
  501.   FreeMe:
  502.    PUSH      EAX                    ;save error code
  503.    sWin32    RemoteFree9x, ESI      ;free copy of block
  504.    POP       EAX                    ;restore error code
  505.   DrWatson::
  506.    POP       FS:TEB.ExceptionList   ;unchain me
  507.    POP       ECX                    ;remove xframe
  508.    RET
  509. RemoteExecute      ENDP
  510. ;=================================================================================
  511. ;Support routines:
  512.  
  513. RemoteAllocNT      PROC ;BlockSize,  AllocMode
  514.    sWin32    VirtualAllocEx, EBX, NULL, [ESP+12], MEM_COMMIT, PAGE_EXECUTE_READWRITE
  515.    RETN      8
  516. RemoteAllocNT      ENDP
  517.  
  518. ;You can pass ABOVE2GB as AllocMode to allocate memory in the shared memory
  519. ;above 2GB in Win9x
  520.  
  521. RemoteAlloc9x      PROC BlockSize, AllocMode
  522.    MOV       EAX, AllocMode
  523.    OR        EAX, MEM_COMMIT
  524.    iWin32    VirtualAlloc,        NULL, BlockSize,       EAX, PAGE_EXECUTE_READWRITE
  525.    RET
  526. RemoteAlloc9x      ENDP
  527. ;-------------------------------------------------------------------------------
  528. ;Support routines:
  529.  
  530. RemoteFreeNT       PROC  ;Block
  531.    sWin32    VirtualFreeEx,  EBX, [ESP+12],  NULL,      MEM_RELEASE
  532.    RETN      4
  533. RemoteFreeNT       ENDP
  534.  
  535. RemoteFree9x       PROC  ;Block
  536.    iWin32    VirtualFree,         [ESP+12],  NULL,      MEM_RELEASE
  537.    RETN      4
  538. RemoteFree9x       ENDP
  539. ;-------------------------------------------------------------------------------
  540.    INCLUDE RemExec.inc
  541.    INCLUDE HookApi.inc
  542.    INCLUDE ModApis.inc
  543. ;=================================================================================
  544.  
  545. END DllMain
  546.  
  547. :translate
  548. @ECHO OFF
  549. ML   /c /coff /nologo /DNOOPT ApiHooksDLL.bat
  550. eLINK ApiHooksDLL /OUT:ApiHooks.dll /IGNORE:4108,4078,4060,4086 /nologo /DLL /STUB:PEstub.exe /SUBSYSTEM:WINDOWS /DEF:ApiHooks.def /MERGE:.idata=.text /MERGE:.rdata=.text /SECTION:.text,EWR /BASE:0x66F00000 /COMMENT:"        http://elicz.cjb.net            http://elicz.tsx.org            "
  551. REN ApiHooks.lib AH.lib
  552. ML   /c /coff /nologo ApiHooksDLL.bat
  553. eLINK ApiHooksDLL /OUT:ApiHooks.dll /IGNORE:4108,4078,4060,4086 /nologo /DLL /STUB:PEstub.exe /SUBSYSTEM:WINDOWS /DEF:ApiHooks.def /MERGE:.idata=.text /MERGE:.rdata=.text /SECTION:.text,EWR /BASE:0x66F00000 /COMMENT:"        http://elicz.cjb.net            http://elicz.tsx.org            "
  554. DEL  ApiHooks.lib >NUL
  555. REN  AH.lib ApiHooks.lib
  556. eLINK -EDIT -NOLOGO ApiHooks.dll -SECTION:.text=" " -SECTION:.reloc=" " -RELEASE
  557. DEL  ApiHooksDLL.obj
  558. eLINK -LIB -nologo -MACHINE:IX86 -DEF:ApiHooks.def -OUT:iApiHooks.lib
  559. DEL  ApiHooks.exp
  560. DEL  iApiHooks.exp
  561. PAUSE
  562. CLS