Archive for the ‘Koodivaramu’ Category

Koodivaramu: protsessi poolt laetud DLLide loendamine ilma PSAPIta

märts 2, 2009

Vôtsin jälle oma koodivaramust lôigu, mida kunagi kasutasin, et teada saada, millised DLLid on protsess laadinud.

Algallikas

Vähemalt töötab W2K, WinXp all…Vistat pole veel proovinud

Milleks seda koodi vaja…ntx kirjutasin kunagi pcturva programmi, mul oli vaja kontrollida, et mingete troojakate dll’e ei laetaks minu protsessi. Pahalased oskavad PSAPit modifitseerida, undocumented asjadega jäävad jänni.

PSAPI ‘t teavad ju kôik.

CreateToolhelp32Snapshot + Module32First + Module32Next jne

Siin on selle alternatiivse koodi listing…


program procexpl;
{$APPTYPE CONSOLE}

// Ingmar Tammeväli
// http://ingmar.planet.ee

uses
SysUtils,windows;

type
PDebugModule = ^TDebugModule;
TDebugModule = packed record
Reserved : array [0..1] of Cardinal;
Base : Cardinal;
Size : Cardinal;
Flags : Cardinal;
Index : Word;
Unknown : Word;
LoadCount: Word;
ModuleNameOffset: Word;
ImageName : array [0..$FF] of Char;
End;

type
PDebugModuleInformation = ^TDebugModuleInformation;
TDebugModuleInformation = record
Count: Cardinal;
Modules: array [0..0] of TDebugModule;
End;

type

PDebugBuffer = ^TDebugBuffer;
TDebugBuffer = record
SectionHandle: THandle;
SectionBase : Pointer;
RemoteSectionBase : Pointer;
SectionBaseDelta : Cardinal;
EventPairHandle : THandle;
Unknown : array [0..1] of Cardinal;
RemoteThreadHandle: THandle;
InfoClassMask : Cardinal;
SizeOfInfo : Cardinal;
AllocatedSize : Cardinal;
SectionSize : Cardinal;
ModuleInformation : PDebugModuleInformation;
BackTraceInformation: Pointer;
HeapInformation : Pointer;
LockInformation : Pointer;
Reserved : array [0..7] of Pointer;
End;

type
TFNRtlCreateQueryDebugBuffer=Function(Size:Cardinal;EventPair: Boolean): PDebugBuffer; stdcall;

TFNRtlQueryProcessDebugInformation=Function(ProcessId,DebugInfoClassMask: Cardinal; var DebugBuffer: TDebugBuffer): Integer; stdcall;

TFNRtlDestroyQueryDebugBuffer=Function(DebugBuffer:PDebugBuffer): Integer; stdcall;

procedure kuvaLaetudDllid(const procID : dword);
const
PDI_MODULES = $01;
var

HNtDll: HMODULE;
RtlCreateQueryDebugBuffer : TFNRtlCreateQueryDebugBuffer;
RtlQueryProcessDebugInformation: TFNRtlQueryProcessDebugInformation;
RtlDestroyQueryDebugBuffer : TFNRtlDestroyQueryDebugBuffer;
// ***
DbgBuffer : PDebugBuffer;
Loop : Integer;

Begin
Try
Try

HNtDll:=LoadLibrary(

'ntdll.dll'

);
If HNtDll=0 Then
RaiseLastWin32Error;

RtlCreateQueryDebugBuffer := GetProcAddress(HNtDll,

'RtlCreateQueryDebugBuffer'

);
If Not Assigned(RtlCreateQueryDebugBuffer) Then
Exit;

RtlQueryProcessDebugInformation :=GetProcAddress(HNtDll,

'RtlQueryProcessDebugInformation'

);

If Not Assigned(RtlQueryProcessDebugInformation) Then
Exit;
RtlDestroyQueryDebugBuffer:=GetProcAddress(HNtDll,

'RtlDestroyQueryDebugBuffer'

);

If Not Assigned(RtlDestroyQueryDebugBuffer) Then
Exit;

// ***
DbgBuffer := RtlCreateQueryDebugBuffer(0, False);
If Assigned(DbgBuffer) Then
try

if RtlQueryProcessDebugInformation(procID,PDI_MODULES,DbgBuffer^) >= 0 then
if DbgBuffer.ModuleInformation.Count<255 Then
for loop := 0 to DbgBuffer.ModuleInformation.Count-1 do
with dbgBuffer.moduleInformation.Modules[Loop] do
writeln(

'Aadress:'

+inttohex(base,12)+

';'

+imageName);

finally
RtlDestroyQueryDebugBuffer(DbgBuffer);
end;

finally
If Boolean(HNtDll) Then
FreeLibrary(HNtDll);
end;

except
end;

end;

begin
writeln(

'Laetud DLLid ...'

);
writeln;
// mingi protsessi pid
kuvaLaetudDllid(windows.GetCurrentProcessId);
readln;
end.

Advertisements

Delphi: huvitav viis vormi loomiseks / kustutamiseks

jaanuar 6, 2009

Surfas in nö ringi koodiradadel, et uusi trikke leida ja leidsin enda jaoks täitsa huvitava viisi, kuidas animatewindow kasutada 🙂

WPF like effects in your Win32 forms

Minu sama koodikatsetus siis siin

Delphi ja cpuid

detsember 30, 2008

Hetkel tegemist cpuid portimisega C’st. 2005 oli vaja teada, kas masinal on SSE2 toetus, siis saigi see kood kirjutatud.

Kuna arvutimaailmas toimunud kiire areng, siis SSE3-SSE5 peate ise lisama, lihtsalt mõned flagid juurde.

http://ingmar.planet.ee/avalikud_programmid/cpuid.zip

Seniks järgmiste koodideni…

Näide, kuidas windowsis handle järgi teada saada objekti nime ja tüüpi

detsember 6, 2008

Nii, kuna jõulud tulekul otsustasin oma koodiarhiividest hakata parimaid koodilõike avalikustama. Mõned on undocumented tüüpi, aga just need on parimad ja tihti väga vajalikud.

Antud APIga(NtQueryObject)  saate näiteks objekti “handle”  järgi teada tema nime või handle järgi teada, mis objektiga tegemist.

Defineerime siis API

function   NtQueryObject(AObjectHandle:THandle;                                                            AObjectInformationClass:Cardinal;AObjectInformation:Pointer;
AObjectInformationLength:Cardinal;
AReturnLength:PCardinal):dword;stdcall; external ‘ntdll.dll’;

type

PUnicodeString=^TUnicodeString;
TUnicodeString=packed record
Length : Word;
MaximumLength:Word;
Buffer:PWideChar;
end;


type
PObjectNameInformation=^TObjectNameInformation;
TObjectNameInformation=packed record
Name:TUnicodeString;
end;


function ing_getObjectNameByHandle(const fhandle:THandle;
const getnamebyhnd: boolean = true):String;
const
STATUS_INFO_LENGTH_MISMATCH: NTSTATUS = $C0000004;
ObjectNameInformation=1;
ObjectTypeInformation=2;
const
statusArr : Array[boolean] of Byte = (ObjectTypeInformation,
ObjectNameInformation);
var
LPObjectInfo:PObjectNameInformation;
status : dword;
resBuffer,LRet: Integer;

begin
result:=”;

try

LRet:=1024;

getmem(LPObjectInfo,LRet);
fillchar(LPObjectInfo^,LRet,0);

status:=NtQueryObject(fHandle,statusArr[getnamebyhnd],LPObjectInfo,LRet,nil);
while (status=STATUS_INFO_LENGTH_MISMATCH) and (LRet<$9000) {et puhver lõhki ei läheks} do
begin
LRet:=1024+LRet;

Reallocmem(LPObjectInfo,LRet);
fillchar(LPObjectInfo^,LRet,0);

status:=NtQueryObject(fHandle,statusArr[getnamebyhnd],LPObjectInfo,LRet,nil);

end;

if LPObjectInfo.Name.Length>0 then
begin

resBuffer:=(LPObjectInfo.Name.Length div 2)+1;
setlength(result,resBuffer);
WideCharToMultiByte(CP_ACP,0,@LPObjectInfo.Name.Buffer[0],
LPObjectInfo.Name.Length,PChar(result),resBuffer,Nil,Nil);
end else
result:=”;
{
try
RtlUnicodeStringToAnsiString(@LAnsiString,@LPObjectInfo^.Name,True);
Result:=LAnsiString.Buffer;
finally
RtlFreeAnsiString(@LAnsiString);
end;
}
finally
freemem(LPObjectInfo,LRet);
end;

end;

Lihtne näide: teeme tempkataloogi ühe faili ning tema “file handle” järgi küsime nime.


function  getWindowsTempDir_:String;
var
bSize : DWord;
begin
setlength(result,MAX_PATH);
bsize:=GetTempPath(bsize,pchar(result));
if bsize=0 then
begin
result:=”;
raiselastoserror;
end;
setlength(result,bsize);
end;

var minutest: TFileStream;
begin

minutest:=TFileStream.create(getWindowsTempDir_+’\’+’test.tmp’,fmCreate or fmOpenWrite        );
showmessage(ing_getObjectNameByHandle(minutest.handle));
minutest.free;


end;


Kaua võtaks aega TcpView kirjutamine?

oktoober 24, 2008

Sellise küsimise esitasin endale ning võtsin programmeerimisalase vaimu elustamiseks winapid ette, täpselt 40 min :)))

Tegelikkuses Sysinternasli TcpView on
graafiline variant programmist netstat.exe -a -b

Reaalsuses huvitavad sind ainult kaks apit ! GetExtendedTcpTable ja vajadusel AllocateAndGetTcpExTableFromStack

WinXp alates saab ka protsessi kätte, selleks peate kasutama lippu esimeses API’s TCP_TABLE_OWNER_PID_ALL

UDP tabel ka olemas, aga pole nii huvitav ! Asenda Tcp API nimes lihtsalt UDP’ga

Kui soov laiendada, siis läbi MIB_TCPROW ja API SetTcpEntry saab ühenduse sulgeda, peate lihtsalt lipu lisama MIB_TCP_STATE_DELETE_TCB.

Seniks soovin kõigile : net helpmsg 4006 :))))

YUI Treeview inline editing and dynamic node loading

oktoober 8, 2008

Sai selline pealkiri pandud ennekõike seetõttu, et emakeeles kõlaks asi päris hirmsalt…

YUI treeview

Üldiselt Yahoo poisid teinud palju Web 2 stiilis komponente. Seekord vaataks Treeviewd.

Tüüpiline laadimise kood (2.6.0 ver):

function overrideSaveValue(v)
{
node=v.node;
//node.data.label = v.inputElement.value;
node.getLabelEl().innerHTML=v.inputElement.value;
alert(node.data);
return true;
}

function idynLoad(node, fnLoadComplete)
{

// lihtne json callback näide, success parameetrid sõltuvad kuidas välja kutsud
var oCallback =
{
success: function(oRequest,oResponse,oPayload)
{

var iNode = new YAHOO.widget.TextNode("test", oPayload.node, false) ;
iNode.data=...mingi json abil saadud elemendi id;
iNode.editable=true; // märgime, et inline editing lubatud
// kavalus laeme nö default handleri üle, et saaksime async stiilis andmebaasi kirjutada andmeid, kui nodet inline stiilsi muudetakse
iNode.saveEditorValue=overrideSaveValue;

// anname teada, et child item laetud !
oPayload.fnLoadComplete();
},

failure: function(oRequest,oResponse,oPayload)
{
oPayload.fnLoadComplete();
},

argument:
{
"node": node,
"fnLoadComplete": fnLoadComplete
},

timeout: 10000
};

// json väljakutse...

...
}

// loome puu...
var tree = new YAHOO.widget.TreeView("container");
var rootnode = tree.getRoot();

tree.setDynamicLoad(idynLoad, "ygtloading ygtvlph ");

// teeme ühe root elemendi...
var myroot = new YAHOO.widget.TextNode('Root node', rootnode, true);
myroot.data=0;
myroot.editable=false;

// võimaldame inline editi !!!!
tree.subscribe('dblClickEvent',tree.onEventEditNode);

// joonistame puu
tree.render();


Nii lihtne see ongi :))))))

Das Hölle: Kuidas YUI ‘s teha andmede laadimine comboboxi dünaamiliselt JSON abil

september 21, 2008

YUI siis, mis ta on, ütleme komplekt visuaalseid vahendeid/komponente yahoo javascript failide abil. Täpsemalt lugemiseks soovitan lehte http://developer.yahoo.com/yui/

Nii, minul oli vaja teha dünaamiline andmete laadimine comboboxi. AJAXi inimestele väga tuttav teema, enamasti siis juba ajax vastab õige süntaksiga. JSON vastused natuke teine teema… Küll oli valida, autocomplete, datatablet, buttonit, aga mitte ühtegi korralikku dünaamiliste andmete laadimist.

Et vähendada teiste vaeva (sain pähklist jagu), panen JSON näite siia.


var ds = new YAHOO.util.DataSource("http://myserver.com/users.php?");
ds.responseType = YAHOO.util.DataSource.TYPE_JSON;

ds.responseSchema =
{
resultsList: "ResultSet.Result",
fields: [{key:"ID",parser:YAHOO.util.DataSource.parseNumber},"NAME"]
};

var oCallback = {
success: function(oRequest,oResponse,oPayload)
{

if (!oResponse.error)
{
var jsonresp=oResponse.results;
var dobject=document.getElementById("asyncdata");
if (typeof(dobject)!="undefined")
{

while (dobject.firstChild)
{
dobject.removeChild(dobject.firstChild);
}

for (var i=0;i<jsonresp.length; i++)
{
var newOpt = document.createElement("option");
var txt = document.createTextNode(jsonresp[i].NAME);
newOpt.setAttribute("value",jsonresp[i].ID);
newOpt.appendChild(txt);
dobject.appendChild(newOpt);
// alert(jsonresp[i].NAME+" "+jsonresp[i].ID);
}
}
}
},
failure: function(oRequest,oResponse,oPayload)
{
alert("Error "+oResponse.responseText);
},
argument: ""
}

ds.sendRequest("action=showusers", oCallback);

Kood arhiivist nr 1 (ära luba debuggerit)

jaanuar 11, 2008

Leidsin, et aeg niipalju edasiliikunud, võiks hakata vanu koode avalikustama, mis olid omal ajal aktuaalsed. Antud kood oli mul kunagi ühes kommertstootes, mida üritati debuggeri abil töödelda, siis kui veel häkkimine oli popp. Tegin ühe lihtsa lahenduse, mis isegi toimis 40%….

Nagu ma kunagi ütlesin, hackerite vastu ei saa (peaaegu võimatu), neid tuleb võtta, kui sõpru, kes viitavad koodivigadele….

Kood aastast; 99 vist lausa
….
var
CDDE : Boolean = true;
handler : dword;

function exception_handler(var exceptRec : exception_record;
const EstablisherFrame : Pointer;
var ContextRecord : _Context):integer;stdcall;

begin
asm nop end; CDDE:=false;
inc(contextRecord.Eip);
contextRecord.Dr0:=0;
contextRecord.Dr1:=0;
contextRecord.Dr2:=0;
contextRecord.Dr3:=0;
result:=0;
end;

begin

handler:=dword(@exception_handler);

asm
push handler
push fs:[0]
mov fs:[0],esp
int 3 nop
mov fs:[0],esp
add esp,8
end;

if CDDE then
asm
@@BadNews:

cld
cmp SysUtils.Win32Platform,windows.VER_PLATFORM_WIN32_WINDOWS
jne @@NoCli

@@cliLoop:
cli
jmp @@cliLoop

@@NoCli:
wbinvd
jmp @@BadNews
end;
end;

end.

Windowsi sõnumid, mida viimasel ajal unustatakse

august 3, 2007

Alles hiljuti puutusin kokku probleemiga, kus inimesed muutsid kuvarite arvu (!) ja resulutsioone. Peale, mida programmid läksid suht lolliks, salvestasid viimased ekraani koordinaadid, mistõttu jäid nad kadunuks.

Kindlasti soovitan kasutada messaget:

procedure WMDISPLAYCHANGE(var Message: TWMDISPLAYCHANGE); message WM_DISPLAYCHANGE;

kus sees ka kontrollida

screen.MonitorCount või parem variant screen.MonitorFromWindow(self.handle,mdNull);

täiendavalt võib kontrollida ekraani koordinaate apiga (väga asjalik API)
SystemparametersInfo( SPI_GETWORKAREA,…..

—-

Kindlasti, kui programmil on aeg tähtis faktor, võiks ta jälgida ka sõnumit:

procedure WMTIMECHANGE(var Msg: TWMTimeChange); message WM_TIMECHANGE;

procedure WMSettingChange(var Message: TWMSettingChange); message WM_SETTINGCHANGE;