delphi Format格式化函数

Format是一个很常用,却又似乎很烦的方法,本人试图对这个方法的帮助进行一些翻译,让它有一个完整的概貌,以供大家查询之用:

首先看它的声明:
function Format(const Format: string; const Args: array of const): string; overload;

事实上Format方法有两个种形式,另外一种是三个参数的,主要区别在于它是线程安全的,
但并不多用,所以这里只对第一个介绍:
function Format(const Format: string; const Args: array of const): string; overload;

Format参数是一个格式字符串,用于格式化Args里面的值的。Args又是什么呢,
它是一个变体数组,即它里面可以有多个参数,而且每个参数可以不同。
如以下例子:

Format('my name is %6s',['wind']);
返回后就是my name is wind

查看更多内容...

Posted in 软件开发 at February 14, 2016. by 傻猫 .    Views: 2999    No Comments

如何将Bitmap位图与base64字符串相互转换

先引用delphi自带的单元
uses EncdDecd;

然后就可以使用下面二个函数了:

///将Bitmap位图转化为base64字符串
function BitmapToString(img:TBitmap):string ;
var
ms:TMemoryStream;
ss:TStringStream;
s:string;
begin
ms := TMemoryStream.Create;
img.SaveToStream(ms);
ss := TStringStream.Create('');
ms.Position:=0;
EncodeStream(ms,ss);//将内存流编码为base64字符流
s:=ss.DataString;
ms.Free;
ss.Free;
result:=s;
end;

///将base64字符串转化为Bitmap位图
function StringToBitmap(imgStr:string):TBitmap;
var ss:TStringStream;
ms:TMemoryStream;
bitmap:TBitmap;
begin
ss := TStringStream.Create(imgStr);
ms := TMemoryStream.Create;
DecodeStream(ss,ms);//将base64字符流还原为内存流
ms.Position:=0;
bitmap := TBitmap.Create;
bitmap.LoadFromStream(ms);
ss.Free;
ms.Free;
result :=bitmap;
end;

Posted in 软件开发 at December 11, 2015. by 傻猫 .    Views: 2258    No Comments

Delphi中Hook API进行进程保护(不允许进程结束的方法)

const
PRG_NAME = 'HA.exe';
var
TerminateProcessNext : function (processHandle, exitCode: dword) : bool; stdcall;
NtTerminateProcessNext : function (processHandle, exitCode: dword) : dword; stdcall;

{$R *.res}
function ThisIsOurProcess(processHandle: dword): boolean;
var
pid: dword;
arrCh: array [0 .. MAX_PATH] of char;
begin
pid := ProcessHandleToId(processHandle);
result := (pid <> 0) and ProcessIdToFileName(pid, arrCh) and
(PosText(PRG_NAME, arrCh) > 0);
end;

查看更多内容...

Posted in 软件开发 at September 11, 2015. by 傻猫 .    Views: 1962    No Comments

自定义Delphi公用函数单元

{*******************************************************}
{ }
{ Delphi公用函数单元 }
{ }
{ 版权所有 (C) 2008 }
{ }
{*******************************************************}
unit YzDelphiFunc;

interface

uses
ComCtrls, Forms, Windows, Classes, SysUtils, ComObj, ActiveX, ShlObj, Messages,
Graphics, Registry, Dialogs, Controls, uProcess, uCpuUsage, StrUtils, CommCtrl,
jpeg, WinInet, ShellAPI, SHFolder, ADODB, WinSock;

{ 保存日志文件 }
procedure YzWriteLogFile(Msg: String);

{ 延时函数,单位为毫秒 }
procedure YzDelayTime(MSecs: Longint);

{ 判断字符串是否为数字 }
function YzStrIsNum(Str: string):boolean;

{ 判断文件是否正在使用 }
function YzIsFileInUse(fName: string): boolean;

{ 删除字符串列表中的空字符串 }
procedure YzDelEmptyChar(AList: TStringList);

{ 删除文件列表中的"Thumbs.db"文件 }
procedure YzDelThumbsFile(AList: TStrings);

{ 返回一个整数指定位数的带"0"字符串 }
function YzIntToZeroStr(Value, ALength: Integer): string;

{ 取日期年份分量 }
function YzGetYear(Date: TDate): Integer;

查看更多内容...

Posted in 软件开发 at September 7, 2015. by 傻猫 .    Views: 2002    No Comments

DELPHI实现关机,兼容全部WINDOWS系统

{=======================================================================================================================
关闭Windows函数ExitWindowsEx(UINT uFlag,DWORD:dwReserved)说明:

控制WINDOWS的开关:如关闭WINDOWS,重新启动WINDOWS等, ExitWindowsEx(UINT uFlags,DWORD dwReserved);是实现这一功能的API函数。如果Complile时提示EWX_XXXX未定义,那么请手动定义这几个常数,默认情况下是无需我们手动定义的。
const
EWX_FORCE=4; //关闭所有程序并以其他用户身份登录?(!!应为“强制执行否”吧!!)
EWX_LOGOFF=0; //重新启动计算机并切换到MS-DOS方式
EWX_REBOOT=2; //重新启动计算机
EWX_SHUTDOWN=1;//关闭计算机
EWX_POWEROFF=8;//切断电源
EWX_FORCEIFHUNG=$10;//不记得了,有谁好心查下MSDN
调用方法:
ExitWindowsEx(EWX_REBOOT,0); //重启计算机
ExitWindowsEx(EWX_FORCE+EWX_SHUTDOWN,0); //强行关机
不过博主经常听到有人说这一API只在Windows 95/98/98SE/Me下有效,而在Windows NT/2000/XP下无效。
其实这是不正确的,这一API在上述平台下均是有效的,只是我们在Windows NT/2000/XP平台下执行此函数之前,必须要获取得关机特权罢了,其实就算是Windows NT/2000/XP系统自身关机也必须要走这一流程的。
view plainprint?
获取关机特权函数如下:
procedure Get_Shutdown_Privilege; //获得用户关机特权,仅对Windows NT/2000/XP
var
rl: Cardinal;
hToken: Cardinal;
tkp: TOKEN_PRIVILEGES;
begin
OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, hToken);
if LookupPrivilegeValue(nil, 'SeShutdownPrivilege', tkp.Privileges[

另一个关机API,InitiateSystemShutdown(PChar(Computer_Name),PChar(Hint_Msg),Time,Force,Reboot);在Windows NT/2000/XP平台下还会自动调用系统本身的关机提示窗口。
InitiateSystemShutdown(PChar(Computer_Name), PChar(Hint_Msg),Time,Force,Reboot);
//关机计算机名,关机提示信息,停留时长,是否强行关机,是否要重启
当我们把Computer_Name设为nil时,默认为本机,如 InitiateSystemshutdown(nil,nil,0,True,False);//强行关机

由于我们需要制作一个通用的关机程序,故要对当前的操作系统进行判断,这个比较简单,函数如下:
function GetOperatingSystem: string;//获取操作系统信息
var osVerInfo: TOSVersionInfo;
begin
Result :='';
osVerInfo.dwOSVersionInfoSize := SizeOf(TOSVersionInfo);
if GetVersionEx(osVerInfo) then
case osVerInfo.dwPlatformId of
VER_PLATFORM_WIN32_NT:
begin
Result := 'Windows NT/2000/XP'
end;
VER_PLATFORM_WIN32_WINDOWS:
begin
Result := 'Windows 95/98/98SE/Me';
end;
end;
end;

执行关机的主函数:
procedure ShutDownComputer;
begin
if GetOperatingSystem='Windows NT/2000/XP' then
begin
Get_Shutdown_Privilege;
//调用此函数会出现系统关机提示窗口,并允许用户取消关机动作
//InitiateSystemShutDown(nil,'关机提示:讨厌你所以关了你!',0,True,False);
ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
end else
begin
ExitWindowsEx(EWX_SHUTDOWN+EWX_FORCE+EWX_POWEROFF+EWX_FORCEIFHUNG,0);
end;
end;
=========================================================================================================================}

使用:

procedure TShutDownForm.btn_PowerOffClick(Sender:Object);
begin
ShutDownComputer;
end;

Posted in 软件开发 at September 7, 2015. by 傻猫 .    Views: 1722    No Comments

19种防调试检测方法

unit Unit1;

interface

uses
JwaNative, Debug,
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Timer1: TTimer;
Button2: TButton;
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
procedure Timer1Timer(Sender: TObject);
procedure Button2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

function FD_IsDebuggerPresent(): Boolean;
function PD_PEB_BeingDebuggedFlag(): Boolean;
function FD_PEB_NtGlobalFlags(): Boolean;
function FD_Heap_HeapFlags(): Boolean;
function FD_Heap_ForceFlags(): Boolean;
function FD_CheckRemoteDebuggerPresent(): Boolean;
function FD_NtQueryInfoProc_DbgPort(): Boolean;
function FD_NtQueryInfoProc_DbgObjHandle(): Boolean;
function FD_NtQueryInfoProc_DbgFlags(): Boolean;
function FD_SeDebugPrivilege(csrssPid: THandle): Boolean;
function FD_Find_Debugger_Window(): Boolean;
function FD_Exception_Closehandle(): Boolean;
function FD_Exception_Int3(): Boolean;
function FD_OutputDebugString(): boolean;
function FD_Check_StartupInfo(): Boolean;
function FD_INT_2d(): Boolean;
function FS_OD_Int3_Pushfd(): Boolean;
function FS_SI_Exception_Int1(): Boolean;
function FB_HWBP_Exception(): Boolean;

代码下载:20095641408249.rar

查看更多内容...

Posted in 软件开发 at September 7, 2015. by 傻猫 .    Views: 1661    No Comments

反编译Delphi软件DEDE的使用

elphi/C++ Builder采用控件拖放的方式来完成界面的设计,并和事件联系起来。而这些信息以资源(RCDATA)的方式存放于可执行文件中。DeDe便利用这个原理进行反编译,获取相关信息,将界面与事件联系关系还原,但事件的汇编代码不能还原。DeDe公开了源代码,感兴趣的读者可以研究一下。

1.主要功能
用DeDe可以查看Delphi程序窗体的属性,可以查看按钮对应的事件,并将事件代码反汇编出来,其能识别出Delphi库函数,具有良好的可读性。另外,还可以把事件输出到map文件中供其他工具使用。

2.配置
(1)DSF文件

①DSF文件的含义

DSF文件内容来自不同版本BPL库文件的输出符号表。DeDe反汇编引擎使用这些符号表对生成的ASM代码文件添加类成员方法调用的注释,这非常类似于IDA Pro的FLIRT技术。如果没有加载任何BPL符号表文件,对BPL类的调用就无法以注释的格式说明。

②加载DSF文件

经由“File/Load Symbol File”菜单,就可加载所需要的DSF文件。程序若能正确识别出相应版本的Delphi程序,会自动加载DSF文件。若希望每次启动DeDe的同时自动加载若干DSF文件,选中“Options/Configuration”菜单,在Symbols选项卡中就可完成本项工作。如果想查看包含在某个特定DSF文件中的输出符号表,选择“Options/Symbols”。

③为何需要创建DSF文件

处理使用自定义构件(即不是Delphi安装的构件)的程序时,如果有这些自定义构件的BPL,并且为它们创建了DSF文件,那么DeDe将会注释所有对这些自定义构件的调用。创建DSF的速度也是很快的。

查看更多内容...

Posted in 软件开发 at September 7, 2015. by 傻猫 .    Views: 1485    No Comments

Delphi 5 种反调试技术

1.程序窗口句柄检测
原理:用FindWindow函数查找具有相同窗口类名和标题的窗口,如果找到就说明有OD在运行
//******************************************** //通过查找窗口类名来实现检测OllyDBG
//******************************************** function AntiLoader():Boolean;
const
OllyName='OLLYDBG';
var
Hwnd:Thandle;
begin
Hwnd:=FindWindow(OllyName,nil);
if Hwnd<>0 then
Result:=True
else
Result:=False;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
if AntiLoader then
MessageBox(Handle,'找到调试器!','提示',MB_OK+MB_ICONINFORMATION)
else
MessageBox(Handle,'未找到调试器!','提示',MB_OK+MB_ICONINFORMATION)
end;

查看更多内容...

Posted in 软件开发 at September 7, 2015. by 傻猫 .    Views: 1459    No Comments