• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運(yùn)轉(zhuǎn),開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            防調(diào)試相關(guān)做法

            Posted on 2009-10-14 15:01 S.l.e!ep.¢% 閱讀(404) 評論(0)  編輯 收藏 引用 所屬分類: Crack
            1.程序窗口句柄檢測
            原理:用FindWindow函數(shù)查找具有相同窗口類名和標(biāo)題的窗口,如果找到就說明有OD在運(yùn)行
            //********************************************
            //通過查找窗口類名來實(shí)現(xiàn)檢測OllyDBG
            //********************************************
            function AntiLoader():Boolean;
            const
            OllyName='OLLYDBG';
            var
            Hwnd:Thandle;
            begin
            Hwnd:=FindWindow(OllyName,nil);
            if Hwnd<>0 then
            ??? Result:=True
            else
            ??? Result:=False;
            end;
            procedure TForm1.FormCreate(Sender: TObject);
            begin
            if AntiLoader then
            ??? MessageBox(Handle,'找到調(diào)試器!','提示',MB_OK+MB_ICONINFORMATION)
            else
            ??? MessageBox(Handle,'未找到調(diào)試器!','提示',MB_OK+MB_ICONINFORMATION)
            end;

            2.用線程環(huán)境塊檢測
            原理:用ring3級下的調(diào)試器對可執(zhí)行程序進(jìn)行調(diào)試時,調(diào)試器會把被調(diào)試的可執(zhí)行程序作為一個子線程進(jìn)行跟蹤.這時被調(diào)試的可執(zhí)行程序的PEB結(jié)構(gòu)偏移0x02處的BeingDebugged的值為1,如果可執(zhí)行程序未被調(diào)試,則值為0,所以可以利用這個值來檢測程序是否被ring3級下的調(diào)試器調(diào)試
            //***************************************
            //使用PEB結(jié)構(gòu)檢測OllyDBG
            //***************************************
            function AntiLoader():Boolean; //檢測調(diào)試器;
            var
            YInt,NInt:Integer;
            begin
            asm
            ??? mov eax,fs:[$30]
            ??? //獲取PEB偏移2h處BeingDebugged的值
            ??? movzx eax,byte ptr[eax+$2]
            ??? or al,al
            ??? jz @No
            ??? jnz @Yes
            ??? @No:
            ????? mov NInt,1
            ??? @Yes:
            ????? Mov YInt,1
            end;
            if YInt=1 then
            ??? Result:=True;
            if NInt=1 then
            ??? Result:=False;
            end;
            procedure TForm1.FormCreate(Sender: TObject);
            begin
            if AntiLoader then
            ??? MessageBox(Handle,'發(fā)現(xiàn)調(diào)試器!','提示',MB_OK+MB_ICONINFORMATION)
            else
            ??? MessageBox(Handle,'未發(fā)現(xiàn)調(diào)試器!','提示',MB_OK+MB_ICONINFORMATION);
            end;
            3.用API函數(shù)IsDebuggerPresent檢測
            原理:操作系統(tǒng)將調(diào)試對象設(shè)置為在特殊環(huán)境中運(yùn)行,而kernel32.dll中的API函數(shù)IsDebuggerPresent的功能是用于判斷進(jìn)程是否處于調(diào)試環(huán)境中,這樣就可以利用這個API函數(shù)來查看進(jìn)程是否在調(diào)試器中執(zhí)行
            //****************************************
            //利用IsDebuggerPresent函數(shù)檢測OllyDBG
            //****************************************
            function AntiLoader():Boolean;
            var
            isDebuggerPresent: function:Boolean;
            Addr: THandle;
            begin
            Addr := LoadLibrary('kernel32.dll');
            isDebuggerPresent := GetProcAddress(Addr, 'IsDebuggerPresent');
            if isDebuggerPresent then
            ??? Result:=True
            else
            ??? Result:=False;
            end;
            procedure TForm1.FormCreate(Sender: TObject);
            begin
            if AntiLoader then
            ??? MessageBox(Handle,'發(fā)現(xiàn)調(diào)試器!','提示',MB_OK+MB_ICONINFORMATION)
            else
            ??? MessageBox(Handle,'未發(fā)現(xiàn)提示器!','提示',MB_OK+MB_ICONINFORMATION);
            end;
            4.檢查程序的父進(jìn)程
            原理:Windows操作系統(tǒng)下的GUI可執(zhí)行程序的父進(jìn)程都是explorer.exe(CUI可執(zhí)行程序的父進(jìn)程是CMD.exe,系統(tǒng)服務(wù)的父進(jìn)程是Service.exe,在實(shí)際使用的時候需要根據(jù)自己的程序類型來選擇父進(jìn)程實(shí)現(xiàn)反跟蹤),而正被調(diào)試器OD調(diào)試的程序的父進(jìn)程是調(diào)試器的執(zhí)行程序ollydbg.exe而不是別的.所以可以利用檢查父進(jìn)程是否為explorer.exe的方法來檢測OD.
            //***************************************************
            //檢查父進(jìn)程來檢測OllyDBG
            //***************************************************
            function AntiLoader():Boolean;
            const
            ParentName='\EXPLORER.EXE';
            var
            hSnap,hProcess:THandle;
            szBuffer:array[0..MAX_PATH] of char;
            FileName:array[0..MAX_PATH] of char;
            Process32:PROCESSENTRY32;
            LoopFlag:BOOL;
            begin
            ////得到所有進(jìn)程的列表快照
            hSnap:=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
            if hSnap=INVALID_HANDLE_VALUE then
            begin
            ??? Result:=False;
            ??? Exit;
            end;
            Process32.dwSize:=sizeof(PROCESSENTRY32);
            //查找進(jìn)程
            LoopFlag:=Process32First(hSnap,Process32);
            if LoopFlag=False then
            begin
            ??? CloseHandle(hSnap);
            ??? Result:=False;
            ??? Exit;
            end;
            while Integer(LoopFlag)<>0 do
            ??? begin
            ????? if Process32.th32ProcessID=GetCurrentProcessId() then
            ??????? begin
            ????????? hProcess:=OpenProcess(PROCESS_ALL_ACCESS,FALSE,Process32.th32ParentProcessID);
            ????????? if hProcess<>0 then
            ??????????? begin
            ????????????? if GetModuleFileNameEx(hProcess,0,FileName,MAX_PATH)<>0 then
            ??????????????? begin
            ????????????????? //取得系統(tǒng)目錄
            ????????????????? GetWindowsDirectory(szBuffer,MAX_PATH);
            ????????????????? //合并系統(tǒng)目錄和\EXPLORER.EXE
            ????????????????? StrCat(szBuffer,ParentName);
            ????????????????? //轉(zhuǎn)換成大寫以后比較當(dāng)前調(diào)試程序的進(jìn)程是否為父進(jìn)程
            ????????????????? if UpperCase(String(FileName))<>UpperCase(String(szBuffer)) then
            ??????????????????? Result:=True
            ????????????????? else
            ??????????????????? Result:=False;
            ??????????????? end;
            ??????????? end
            ????????? else
            ??????????? Result:=False;
            ??????? end;
            ????? LoopFlag:=Process32Next(hSnap,Process32);
            ??? end;
            CloseHandle(hSnap);
            end;
            procedure TForm1.FormCreate(Sender: TObject);
            begin
            if AntiLoader then
            ??? MessageBox(Handle,'發(fā)現(xiàn)調(diào)試器!','提示',MB_OK+MB_ICONINFORMATION)
            else
            ??? MessageBox(Handle,'未發(fā)現(xiàn)調(diào)試器!','提示',MB_OK+MB_ICONINFORMATION)
            end;
            5.檢查STARTUPINFO結(jié)構(gòu)
            原理:Windows操作系統(tǒng)中的explorer.exe創(chuàng)建進(jìn)程的時候會把STARTUPINFO結(jié)構(gòu)中的值設(shè)為0,而非explorer.exe創(chuàng)建進(jìn)程的時候會忽略這個結(jié)構(gòu)中的值,也就是結(jié)構(gòu)中的值不為0,所以可以利用這個來判斷OD是否在調(diào)試程序.
            /************************************************
            //通過檢測STARTUPINFO結(jié)構(gòu)來檢測OllyDbg
            //************************************************
            function AntiLoader():Boolean;
            var
            Info:STARTUPINFO;
            begin
            GetStartupInfo(Info);
            if (Info.dwX<>0) or (Info.dwY<>0) or (Info.dwXCountChars<>0) or (Info.dwYCountChars<>0) or
            ???? (Info.dwFillAttribute<>0) or (Info.dwXSize<>0) or (Info.dwYSize<>0) then
            ??? Result:=True
            else
            ??? Result:=False;
            end;
            procedure TMainFrm.FormCreate(Sender: TObject);
            begin
            if AntiLoader then
            ??? MessageBox(Handle,'發(fā)現(xiàn)調(diào)試器!','提示',MB_OK)
            else
            ??? MessageBox(Handle,'未發(fā)現(xiàn)調(diào)試器!','提示',MB_OK);
            色天使久久综合网天天| 国内精品久久久久影院日本| 久久九九亚洲精品| 国产—久久香蕉国产线看观看| 久久久噜噜噜久久中文福利| 国产成人精品久久综合| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久AAAA片一区二区| 伊人色综合久久天天| 亚洲欧美一区二区三区久久| 亚洲中文字幕无码久久精品1| 精品国产91久久久久久久| 精品国产乱码久久久久久浪潮| 精品熟女少妇aⅴ免费久久| 亚洲精品国产第一综合99久久| 亚洲国产另类久久久精品| 国产福利电影一区二区三区久久老子无码午夜伦不 | 久久亚洲精品成人无码网站| 国产精品一区二区久久精品涩爱| 国产精品岛国久久久久| 亚洲?V乱码久久精品蜜桃| 91精品国产乱码久久久久久| 久久性生大片免费观看性| 欧美牲交A欧牲交aⅴ久久 | 香蕉99久久国产综合精品宅男自 | 精品国产乱码久久久久久人妻 | 久久久噜噜噜久久| 久久国产欧美日韩精品| 伊人伊成久久人综合网777| 色综合久久精品中文字幕首页| 伊人久久综合无码成人网| 大美女久久久久久j久久| 精品国产福利久久久| 99久久国产宗和精品1上映| 一本久久精品一区二区| 久久这里只有精品视频99| 精品国产一区二区三区久久蜜臀| 免费观看成人久久网免费观看| 狠狠色丁香久久婷婷综| 精品久久久久久成人AV| 97久久香蕉国产线看观看|