atom table monitor
ATOM table monitor 1.8
출처 : Microsoft- 원자 테이블 정보
Atom Table Monitor, RegisterClass, RegisterClassex, GlobalAddatom, AddAtom 또는 registerWindowMessage 함수의 식별자를 사용하여 생성 된 모든 원자를 사용하여 모니터링 할 수 있으며 응용 프로그램이 원자 / 식별자가 누출되지 않았는지 확인할 수 있습니다.
관련 기사 :
특징:
참고 :
버전 1.6 :
글로벌 원자 테이블 :
RegisterWindowMessage 테이블 :
항목 표시 목록 :
일치하는 문자열 패턴 :
카운터 :
테스트 화면 :
세션 화면 선택 :
모니터링 서비스 세션 원자 :
스캔 원자 방법 :
procedure ScanAtoms ;
var
i: word;
cstrAtomName: array [ 0 .. 1024 ] of char;
cstrRWMName: array [ 0 .. 1024 ] of char;
AtomName, RWMName: string;
len, lenRWM: integer;
Value : string;
countAtom, countRWM: integer;
begin
countAtom := 0 ;
countRWM := 0 ;
for i := $C000 to $FFFF do
begin
Value := ' ' ;
len := GlobalGetAtomName(i, cstrAtomName, 1024 );
lenRWM := GetClipboardFormatName(i, cstrRWMName, 1024 );
if len > 0 then
begin
AtomName := StrPas(cstrAtomName);
SetLength(AtomName, len);
Value := AtomName;
Inc(countAtom);
FATomTable[i - $C000].atom[ 0 ] := Value + ' --GlobalAtom ' ;
end ;
if lenRWM > 0 then
begin
RWMName := StrPas(cstrRWMName);
SetLength(RWMName, lenRWM);
Value := RWMName;
Inc(countRWM);
FATomTable[i - $C000].atom[ 1 ] := Value + ' --RWM ' ;
end ;
end ;
end ;정규 표현식 사용 :
function GetColor (Text: string): TColor;
var
i: integer;
perl: TPerlRegEx;
res: TColor;
begin
res := clGray;
for i := 0 to FListPatterns.count - 1 do
begin
perl := TPerlRegEx.Create;
try
perl.RegEx := UTF8String(FListPatterns[i].RegularEx);
perl.Subject := UTF8String(Text);
if perl.Match then
begin
res := FListPatterns[i].color;
Break;
end ;
finally
perl.Free;
end ;
end ;
result := res;
end ;테스트 :
procedure AddatomClick (Sender: TObject);
var
i: integer;
begin
try
GlobalAddAtom(PChar(getRandomString(Edit4.Text)));
if GetLastError <> 0 then
begin
ShowMessage(IntToStr(GetLastError) + ' ' + SysErrorMessage(GetLastError));
Break;
end ;
Except
on e: exception do
ShowMessage(e.message + ' ' + IntToStr(GetLastError));
end ;
end ;
procedure RWMAddAtom (Sender: TObject);
var
i: integer;
myString: string;
begin
myString := getRandomString(Edit8.Text);
try
RegisterWindowMessage(PWideChar(myString));
if GetLastError <> 0 then
begin
ShowMessage(IntToStr(GetLastError) + ' ' + SysErrorMessage(GetLastError));
Break;
end ;
Except
on e: exception do
ShowMessage(e.message + ' ' + IntToStr(GetLastError));
end ;
end ;
function getRandomString (header: string): string;
const
Chars = ' 1234567890ABCDEFGHJKLMNPQRSTUVWXYZ!?/*+- ' ;
var
S: string;
i, N: integer;
begin
Randomize;
S := ' ' ;
for i := 1 to 6 do
begin
N := Random(Length(Chars)) + 1 ;
S := S + Chars[N];
end ;
result := header + S;
end ;RegisterClassex를 사용한 테스트
procedure btnCreateClick (Sender: TObject);
var
WC: TWndclassEx;
atom: word;
begin
WC.lpszclassName := PWideChar(Edit10.Text);
WC.cbSize := SizeOf(TWndclassEx);
WC.style := CS_VREDRAW or CS_HREDRAW;
WC.lpfnWndProc := @DefWindowProc;
WC.cbClsExtra := 0 ;
WC.cbWndExtra := 0 ;
WC.hinstance := hinstance;
WC.hIcon := Application.Icon.Handle;
WC.hIconSm := Application.Icon.Handle;
WC.hCursor := LoadCursor( 0 , IDC_ARROW);
WC.lpszMenuName := nil ;
WC.hbrBackground := (COLOR_BACKGROUND + 1 );
atom := RegisterClassEx(WC);
if atom <> 0 then
ShowMessage( ' Atom Created at ' + IntToHex(atom, 4 ));
end ;아래 테스트 :
아래에서 개발 :
stackoverflow 항목 :
Microsoft Debug 블로그 항목 :
아직 후원자가 없습니다! 당신은 첫 번째가 될 것입니까?