亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? apispyld.c

?? Windows 95 系統程式設計大奧秘書籍源碼
?? C
字號:
//==================================
// APISPYLD - Matt Pietrek 1995
// FILE: APISPYLD.C
//==================================
#include <windows.h>
#include <stddef.h>
#pragma hdrstop
#include "apispyld.h"

//======================== Global Variables =================================
char SzINISection[] = "Options";
char SzINICmdLineKey[] = "CommandLine";
char SzINIFile[] = "APISPY32.INI";
char SzCmdLine[MAX_PATH];

BOOL FFirstBreakpointHit = FALSE, FSecondBreakpointHit = FALSE;

PROCESS_INFORMATION ProcessInformation;
CREATE_PROCESS_DEBUG_INFO ProcessDebugInfo;

CONTEXT OriginalThreadContext, FakeLoadLibraryContext;
PVOID PInjectionPage;

#define PAGE_SIZE 4096
BYTE OriginalCodePage[PAGE_SIZE];
BYTE NewCodePage[PAGE_SIZE];

//======================== Code =============================================

//
// Function prototypes
//
BOOL  CALLBACK APISPY32DlgProc(HWND, UINT, WPARAM, LPARAM);
void  Handle_WM_COMMAND(HWND hWndDlg, WPARAM wParam, LPARAM lParam);
void  Handle_WM_INITDIALOG(HWND hWndDlg, WPARAM wParam, LPARAM lParam);
BOOL  GetProgramName(HWND hWndOwner, PSTR szFile, unsigned nFileBuffSize);
BOOL  LoadProcessForSpying(PSTR SzCmdLine);
void  DebugLoop(void);
DWORD HandleDebugEvent( DEBUG_EVENT * event );
void  HandleException(LPDEBUG_EVENT lpEvent, PDWORD continueStatus);
void  EmptyMsgQueueOfUselessMessages(void);
BOOL  InjectSpyDll(void);
BOOL  ReplaceOriginalPagesAndContext(void);
PVOID FindUsablePage(HANDLE hProcess, PVOID PProcessBase);
BOOL  GetSpyDllName(PSTR buffer, UINT cBytes);


int APIENTRY WinMain( HANDLE hInstance, HANDLE hPrevInstance,
                        LPSTR lpszCmdLine, int nCmdShow )
{
    // This dialog returns 0 if the user pressed cancel
    while ( 0 != DialogBox(hInstance, "APISPY32_LOAD_DLG", 0,
                            (DLGPROC)APISPY32DlgProc) )
    {
        if ( LoadProcessForSpying(SzCmdLine) )
        {
            DebugLoop();
            break;
        }

        MessageBox(0, "Unable to start program", 0, MB_OK);
    }
    
    return 0;
}

BOOL CALLBACK APISPY32DlgProc(HWND hWndDlg, UINT msg,
                              WPARAM wParam, LPARAM lParam)
{
    switch ( msg )
    {
        case WM_COMMAND:
            Handle_WM_COMMAND(hWndDlg, wParam, lParam);
            return TRUE;
        case WM_INITDIALOG:
            Handle_WM_INITDIALOG(hWndDlg, wParam, lParam);
            return TRUE;
        case WM_CLOSE:
            EndDialog(hWndDlg, 0);
            return FALSE;
    }
    
    return FALSE;
}

void Handle_WM_COMMAND(HWND hWndDlg, WPARAM wParam, LPARAM lParam)
{
    if ( wParam == IDC_RUN )
    {
        if ( GetWindowText( GetDlgItem(hWndDlg, IDC_CMDLINE),
                            SzCmdLine, sizeof(SzCmdLine)) )
        {
            WritePrivateProfileString(SzINISection, SzINICmdLineKey,
                                        SzCmdLine, SzINIFile);
            EndDialog(hWndDlg, 1);  // Return TRUE
        }
        else
        {
            MessageBox( hWndDlg, "No program selected", 0, MB_OK);
        }
    }
    else if ( wParam == IDC_FILE )
    {
        if ( GetProgramName(hWndDlg, SzCmdLine, sizeof(SzCmdLine)) )
            SetWindowText( GetDlgItem(hWndDlg, IDC_CMDLINE), SzCmdLine );
    }
    else if ( wParam == IDCANCEL )
    {
        EndDialog(hWndDlg, 0);
    }
}

void Handle_WM_INITDIALOG(HWND hWndDlg, WPARAM wParam, LPARAM lParam)
{
    GetPrivateProfileString(SzINISection, SzINICmdLineKey, "", SzCmdLine,
                            sizeof(SzCmdLine), SzINIFile);
    SetWindowText( GetDlgItem(hWndDlg, IDC_CMDLINE), SzCmdLine );
}

static char szFilter1[] = "Programs (*.EXE)\0*.EXE\0";

BOOL GetProgramName(HWND hWndOwner, PSTR szFile, unsigned nFileBuffSize)
{
    OPENFILENAME ofn;

    szFile[0] = 0;

    memset(&ofn, 0, sizeof(OPENFILENAME));
    
    ofn.lStructSize = sizeof(OPENFILENAME);
    ofn.hwndOwner = hWndOwner;
    ofn.lpstrFilter = szFilter1;
    ofn.nFilterIndex = 1;
    ofn.lpstrFile= szFile;
    ofn.nMaxFile = nFileBuffSize;
    ofn.lpstrFileTitle = 0;
    ofn.nMaxFileTitle = 0;
    ofn.lpstrInitialDir = 0;
    ofn.Flags = OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
    
    return GetOpenFileName(&ofn);
}

BOOL LoadProcessForSpying(PSTR SzCmdLine)
{
    STARTUPINFO startupInfo;
    
    memset(&startupInfo, 0, sizeof(startupInfo));
    startupInfo.cb = sizeof(startupInfo);
        
    return CreateProcess(
                0,                          // lpszImageName
                SzCmdLine,                  // lpszCommandLine
                0,                          // lpsaProcess
                0,                          // lpsaThread
                FALSE,                      // fInheritHandles
                DEBUG_ONLY_THIS_PROCESS,    // fdwCreate
                0,                          // lpvEnvironment
                0,                          // lpszCurDir
                &startupInfo,               // lpsiStartupInfo
                &ProcessInformation         // lppiProcInfo
                );
}

void DebugLoop(void)
{
    DEBUG_EVENT event;
    DWORD continueStatus;
    BOOL fWin32s;
    BOOL fWaitResult;
    
    fWin32s = (GetVersion() & 0xC0000000) == 0x80000000;
    
    while ( 1 )
    {
        fWaitResult = WaitForDebugEvent(&event, INFINITE);
            
        if ( (fWaitResult == FALSE) && fWin32s )
        {
            EmptyMsgQueueOfUselessMessages();
            continue;
        }
        
        continueStatus = HandleDebugEvent( &event );
        
        if ( event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT )
            return;
        
        ContinueDebugEvent( event.dwProcessId,
                            event.dwThreadId,
                            continueStatus );
    }
}

PSTR SzDebugEventTypes[] = 
{
"",
"EXCEPTION",
"CREATE_THREAD",
"CREATE_PROCESS",
"EXIT_THREAD",
"EXIT_PROCESS",
"LOAD_DLL",
"UNLOAD_DLL",
"OUTPUT_DEBUG_STRING",
"RIP",
};

DWORD HandleDebugEvent( DEBUG_EVENT * event )
{
    DWORD continueStatus = DBG_CONTINUE;
    // char buffer[1024];

    // wsprintf(buffer, "Event: %s\r\n",
    //          SzDebugEventTypes[event->dwDebugEventCode]);
    // OutputDebugString(buffer);


    if ( event->dwDebugEventCode == CREATE_PROCESS_DEBUG_EVENT )
    {
        ProcessDebugInfo = event->u.CreateProcessInfo;
    }
    else if ( event->dwDebugEventCode == EXCEPTION_DEBUG_EVENT )
    {
        HandleException(event, &continueStatus);
    }
        
    return continueStatus;
}

void HandleException(LPDEBUG_EVENT lpEvent, PDWORD continueStatus)
{
    // char buffer[128];
    // wsprintf(buffer, "Exception code: %X  Addr: %08X\r\n",
    //          lpEvent->u.Exception.ExceptionRecord.ExceptionCode,
    //          lpEvent->u.Exception.ExceptionRecord.ExceptionAddress);
    // OutputDebugString(buffer);
            
                
    if ( lpEvent->u.Exception.ExceptionRecord.ExceptionCode
            == EXCEPTION_BREAKPOINT )
    {
        if ( FFirstBreakpointHit == FALSE )
        {
            InjectSpyDll();
            FFirstBreakpointHit = TRUE;
        }
        else if ( FSecondBreakpointHit == FALSE )
        {
            ReplaceOriginalPagesAndContext();
            FSecondBreakpointHit = TRUE;
        }
        
        *continueStatus = DBG_CONTINUE;
    }
    else
    {
        *continueStatus = DBG_EXCEPTION_NOT_HANDLED;
    }
}

void EmptyMsgQueueOfUselessMessages(void)
{
    MSG msg;        // See PeekMessage loop for explanation of idiocy

    // Win32s idiocy puts W32s_Debug_Msg message in our message queue
    // Dispose of them!  They're useless!
    while ( PeekMessage(&msg, 0, 0, 0, PM_REMOVE) )
    {
        if ( msg.hwnd )
            DispatchMessage(&msg);
    }
}

#pragma pack ( 1 )
typedef struct
{
    WORD    instr_SUB;
    DWORD   operand_SUB_value;
    BYTE    instr_PUSH;
    DWORD   operand_PUSH_value;
    BYTE    instr_CALL;
    DWORD   operand_CALL_offset;
    BYTE    instr_INT_3;
    char    data_DllName[1];
} FAKE_LOADLIBRARY_CODE, * PFAKE_LOADLIBRARY_CODE;

BOOL InjectSpyDll(void)
{
    BOOL retCode;
    DWORD cBytesMoved;
    char szSpyDllName[MAX_PATH];
    FARPROC pfnLoadLibrary;
    PFAKE_LOADLIBRARY_CODE pNewCode;
    
    // =====================================================================
    // Phase 1 - Locating addresses of important things
    // =====================================================================
        
    pfnLoadLibrary = GetProcAddress( GetModuleHandle("KERNEL32.DLL"),
                                     "LoadLibraryA" );
    if ( !pfnLoadLibrary )
        return FALSE;
    
    PInjectionPage = FindUsablePage(ProcessInformation.hProcess,
                                        ProcessDebugInfo.lpBaseOfImage);
    if ( !PInjectionPage )
        return FALSE;
    
    if ( !GetSpyDllName(szSpyDllName, sizeof(szSpyDllName)) )
        return FALSE;

    OriginalThreadContext.ContextFlags = CONTEXT_CONTROL;
    if ( !GetThreadContext(ProcessInformation.hThread,&OriginalThreadContext))
        return FALSE;
    
    // =====================================================================
    // Phase 2 - Saving the original code page away
    // =====================================================================

    // Save off the original code page
    retCode = ReadProcessMemory(ProcessInformation.hProcess, PInjectionPage,
                                OriginalCodePage, sizeof(OriginalCodePage),
                                &cBytesMoved);
    if ( !retCode || (cBytesMoved != sizeof(OriginalCodePage)) )
        return FALSE;

    // =====================================================================
    // Phase 3 - Writing new code page and changing the thread context
    // =====================================================================

    pNewCode = (PFAKE_LOADLIBRARY_CODE)NewCodePage;

    pNewCode->instr_SUB = 0xEC81;
    pNewCode->operand_SUB_value = 0x1000;
        
    pNewCode->instr_PUSH = 0x68;
    pNewCode->operand_PUSH_value = (DWORD)PInjectionPage
                            + offsetof(FAKE_LOADLIBRARY_CODE, data_DllName);

    pNewCode->instr_CALL = 0xE8;
    pNewCode->operand_CALL_offset =
            (DWORD)pfnLoadLibrary - (DWORD)PInjectionPage
            - offsetof(FAKE_LOADLIBRARY_CODE,instr_CALL) - 5;

    pNewCode->instr_INT_3 = 0xCC;

    lstrcpy(pNewCode->data_DllName, szSpyDllName); // Copy DLL name
    
    // Write out the new code page
    retCode = WriteProcessMemory(ProcessInformation.hProcess, PInjectionPage,
                                &NewCodePage, sizeof(NewCodePage),
                                &cBytesMoved);
    if ( !retCode || (cBytesMoved != sizeof(NewCodePage)) )
        return FALSE;

    FakeLoadLibraryContext = OriginalThreadContext;
    FakeLoadLibraryContext.Eip = (DWORD)PInjectionPage;
    
    if ( !SetThreadContext(ProcessInformation.hThread,
                            &FakeLoadLibraryContext) )
        return FALSE;
    
    return TRUE;
}

BOOL ReplaceOriginalPagesAndContext(void)
{
    BOOL retCode;
    DWORD cBytesMoved;
    
    retCode = WriteProcessMemory(ProcessInformation.hProcess, PInjectionPage,
                                OriginalCodePage, sizeof(OriginalCodePage),
                                &cBytesMoved);
    if ( !retCode || (cBytesMoved != sizeof(OriginalCodePage)) )
        return FALSE;

    if ( !SetThreadContext(ProcessInformation.hThread,
                            &OriginalThreadContext) )
        return FALSE;
    
    return TRUE;
}

PVOID FindUsablePage(HANDLE hProcess, PVOID PProcessBase)
{
    DWORD peHdrOffset;
    DWORD cBytesMoved;
    IMAGE_NT_HEADERS ntHdr;
    PIMAGE_SECTION_HEADER pSection;
    unsigned i;
    
    // Read in the offset of the PE header within the debuggee
    if ( !ReadProcessMemory(ProcessInformation.hProcess,
                            (PBYTE)PProcessBase + 0x3C,
                            &peHdrOffset,
                            sizeof(peHdrOffset),
                            &cBytesMoved) )
        return FALSE;
        
    
    // Read in the IMAGE_NT_HEADERS.OptionalHeader.BaseOfCode field
    if ( !ReadProcessMemory(ProcessInformation.hProcess,
                            (PBYTE)PProcessBase + peHdrOffset,
                            &ntHdr, sizeof(ntHdr), &cBytesMoved) )
        return FALSE;

    pSection = (PIMAGE_SECTION_HEADER)
                ((PBYTE)PProcessBase + peHdrOffset + 4
                + sizeof(ntHdr.FileHeader)
                + ntHdr.FileHeader.SizeOfOptionalHeader);
        
    for ( i=0; i < ntHdr.FileHeader.NumberOfSections; i++ )
    {
        IMAGE_SECTION_HEADER section;
        
        if ( !ReadProcessMemory( ProcessInformation.hProcess,
                                 pSection, &section, sizeof(section),
                                 &cBytesMoved) )
            return FALSE;

        // OutputDebugString( "trying section: " );
        // OutputDebugString( section.Name );
        // OutputDebugString( "\r\n" );

        // If it's writeable, and not the .idata section, we'll go with it
        if ( (section.Characteristics & IMAGE_SCN_MEM_WRITE)
             && strncmp(section.Name, ".idata", 6) )
        {
            // OutputDebugString( "using section: " );
            // OutputDebugString( section.Name );
            // OutputDebugString( "\r\n" );
            
            return (PVOID) ((DWORD)PProcessBase + section.VirtualAddress);
        }

        pSection++; // Not this section.  Advance to next section.
    }

    return 0;
}

BOOL GetSpyDllName(PSTR buffer, UINT cBytes)
{
    char szBuffer[MAX_PATH];
    PSTR pszFilename;
    
    // Get the complete path to this EXE - The spy dll should be in the
    // same directory.
    GetModuleFileName(0, szBuffer, sizeof(szBuffer));

    pszFilename = strrchr(szBuffer, '\\');
    if ( !pszFilename )
        return FALSE;
    
    lstrcpy(pszFilename+1, "APISPY32.DLL");
    strncpy(buffer, szBuffer, cBytes);
    return TRUE;
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
不卡视频一二三| 久久久蜜臀国产一区二区| 成人综合激情网| 国产精品资源在线观看| 免费高清在线视频一区·| 日韩福利视频导航| 天堂成人国产精品一区| 香蕉成人啪国产精品视频综合网| 亚洲欧美日韩国产一区二区三区 | 制服丝袜亚洲色图| 欧美日韩小视频| 欧美日韩一级片网站| 欧美日韩在线精品一区二区三区激情| 91福利社在线观看| 欧美午夜一区二区| 欧美色成人综合| 在线播放中文一区| 日韩欧美成人一区二区| 精品国产三级电影在线观看| 精品久久人人做人人爱| 久久久久久**毛片大全| 中文字幕精品综合| 18欧美乱大交hd1984| 亚洲欧洲av在线| 亚洲精品欧美在线| 亚洲福利视频一区| 免费观看一级特黄欧美大片| 韩国女主播成人在线观看| 国产精品一区二区不卡| k8久久久一区二区三区| 91麻豆福利精品推荐| 欧美在线观看视频一区二区三区| 欧美日韩国产成人在线91| 日韩欧美精品在线| 欧美国产欧美亚州国产日韩mv天天看完整| 国产精品久久福利| 一个色在线综合| 久久精品久久综合| 日韩欧美综合一区| 久久亚洲精精品中文字幕早川悠里| 中文字幕免费一区| 一区二区三区四区精品在线视频| 日本伊人精品一区二区三区观看方式| 久久99精品久久久久久动态图 | 久久精品国产精品亚洲精品| 国产精品亚洲综合一区在线观看| 99久久99久久久精品齐齐| 欧美无砖砖区免费| 26uuu国产日韩综合| 18成人在线视频| 免费一级欧美片在线观看| 懂色一区二区三区免费观看| 欧美在线观看一区二区| www国产精品av| 亚洲一区二区三区小说| 国产麻豆视频一区二区| 91国产视频在线观看| 精品国产凹凸成av人网站| 亚洲色欲色欲www| 久久黄色级2电影| 91一区一区三区| 欧美成va人片在线观看| 中文字幕在线免费不卡| 欧美aaaaaa午夜精品| 99视频精品全部免费在线| 日韩一区二区三区电影| 中文字幕制服丝袜一区二区三区| 免费人成精品欧美精品| 91麻豆蜜桃一区二区三区| 精品久久99ma| 一级日本不卡的影视| 国产凹凸在线观看一区二区 | 亚洲视频资源在线| 麻豆精品久久精品色综合| 91麻豆国产精品久久| 国产婷婷一区二区| 美女国产一区二区| 欧美午夜精品久久久久久超碰| 国产欧美日韩在线| 久久精品国产亚洲高清剧情介绍| 色综合欧美在线| 欧美国产一区视频在线观看| 青青草91视频| 欧美亚洲国产一区在线观看网站| 国产欧美日韩在线视频| 韩国v欧美v日本v亚洲v| 欧美一a一片一级一片| 亚洲视频一区二区在线观看| 国产一区不卡在线| 欧美刺激脚交jootjob| 天天色天天操综合| 欧美四级电影在线观看| 亚洲麻豆国产自偷在线| 国产精品一区二区x88av| 日韩欧美亚洲国产精品字幕久久久| 91免费观看在线| 亚洲国产精品二十页| 九九久久精品视频| 日韩一区二区三区视频在线 | 青青草精品视频| 制服丝袜成人动漫| 视频一区在线视频| 欧美麻豆精品久久久久久| 亚洲成a人v欧美综合天堂下载| 在线观看亚洲a| 亚洲乱码国产乱码精品精的特点 | 99久久精品一区二区| 国产精品亲子伦对白| 丁香婷婷综合激情五月色| 国产拍揄自揄精品视频麻豆| 激情综合色播五月| 26uuu国产电影一区二区| 紧缚奴在线一区二区三区| 欧美xxxxxxxxx| 狠狠色丁香婷婷综合| 精品福利视频一区二区三区| 国产一区二区在线看| 国产亚洲综合色| 成人激情图片网| 亚洲乱码国产乱码精品精的特点 | 亚洲一区二区三区激情| 91传媒视频在线播放| 亚洲成a人片在线观看中文| 51精品视频一区二区三区| 欧美a级一区二区| 久久影视一区二区| 成人黄色av网站在线| 亚洲免费观看在线视频| 精品视频免费看| 老司机精品视频一区二区三区| 26uuu亚洲综合色欧美| 成人美女视频在线观看| 亚洲伦在线观看| 欧美绝品在线观看成人午夜影视| 麻豆久久久久久久| 久久久99久久精品欧美| av电影天堂一区二区在线观看| 亚洲免费电影在线| 制服丝袜av成人在线看| 狠狠色丁香婷婷综合久久片| 中文字幕乱码日本亚洲一区二区 | 中文字幕制服丝袜一区二区三区| 色婷婷精品久久二区二区蜜臂av| 五月开心婷婷久久| 欧美精品一区二区久久久| 99久久久久久| 美女高潮久久久| 中文字幕一区二区三区精华液 | 欧美本精品男人aⅴ天堂| 欧美精品一区二区久久婷婷| 成人av在线观| 五月天一区二区| 中文字幕免费不卡| 欧美老人xxxx18| 国产69精品久久99不卡| 亚洲福利视频一区| 国产亚洲精品aa午夜观看| 欧美中文字幕亚洲一区二区va在线 | 欧美日韩激情一区二区三区| 精品一区二区在线看| 亚洲欧美aⅴ...| 欧美精品一区二区三| 欧美特级限制片免费在线观看| 国产成人在线视频网站| 性欧美疯狂xxxxbbbb| 国产精品第五页| 欧美一级艳片视频免费观看| 成人看片黄a免费看在线| 蜜桃在线一区二区三区| 亚洲欧美中日韩| 亚洲精品一线二线三线无人区| 欧美影院精品一区| 成人少妇影院yyyy| 久久99精品久久只有精品| 尤物在线观看一区| 国产日韩欧美在线一区| 欧美一卡二卡在线| 日本精品裸体写真集在线观看 | 欧美亚洲精品一区| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 国产高清精品在线| 青青草精品视频| 亚洲成人先锋电影| 亚洲人精品午夜| 久久久99精品久久| 欧美xxxxx裸体时装秀| 欧美日韩一卡二卡| 色综合咪咪久久| 成人av电影在线播放| 国产剧情一区二区| 久久国产精品无码网站| 视频在线观看91| 亚洲成人先锋电影| 洋洋成人永久网站入口| 国产精品久久久久桃色tv| 图片区小说区国产精品视频| 亚洲蜜桃精久久久久久久| 中文字幕在线观看一区| 国产欧美精品区一区二区三区| 精品美女被调教视频大全网站|