我正在使用Assembly在Delphi中编写一些函数.所以我想把它放在一个名为的.pas文件中Strings.pas.用于uses新的Delphi软件.我需要写什么才能使它成为一个有效的库?
我的功能是这样的:
function Strlen(texto : string) : integer;
begin
asm
mov esi, texto
xor ecx,ecx
cld
@here:
inc ecx
lodsb
cmp al,0
jne @here
dec ecx
mov Result,ecx
end;
end;
Run Code Online (Sandbox Code Playgroud)
这会计算字符串中字符的数量.如何在lib中创建它Strings.pas以uses Strings;在我的表单中调用?
我正在Delphi和我一起工作Assembly,所以,我有一个问题.我使用的指令(RDTSC在大会得到一个64位读时间戳的),则该指令把数字分别在两个寄存器EAX和EDX.但没关系,我用Delphi Integer变量得到它.但现在,我需要将这些变量加入64位中的1位.就像是:
Var1 = 46523
var2 = 1236
Run Code Online (Sandbox Code Playgroud)
所以我需要将它放入一个变量,如:
Var3 = 465231236
Run Code Online (Sandbox Code Playgroud)
它就像一个StrCat,但我不知道该怎么做.有人可以帮帮我吗?
早上好.我正在尝试学习DLL注入,所以我写了一个小软件,它只获取一个String,与StrCmp()进行比较,如果输入等于"Winner",则该软件会给出一个好男孩消息,学习DLL注入的porpouse.所以我写了一个DLL,它在注入时加载一个Form,porpouse正在使用DLL注入,修改比较指令(JNZ(74)到JMP(EB)),然后制作软件,接受任何字符串.我的DLL代码是:
library Project2;
uses
SysUtils,
Windows,
Classes,
Unit1 in 'Unit1.pas' {Form1};
{$R *.res}
var
Hproccess:THandle;
Hid:Cardinal;
b:Boolean=false;
Procedure Chamar;
begin
Form1:=TForm1.Create(nil);
Form1.ShowModal;
end;
begin
Hproccess:=OpenProcess(PROCESS_ALL_ACCESS,false,GetCurrentProcessID);
CreateRemoteThread(Hproccess,nil,0,@Chamar,@Chamar,0,Hid);
end.
Run Code Online (Sandbox Code Playgroud)
你怎么看,DLL只是创建一个新的线程来加载窗体(Form1).问题是,当我在Memory Addres中写入以覆盖JNZ指令时,Windows不允许我这样做,并在地址005B55A9返回访问冲突消息.我的表单代码也很简单.
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button2: TButton;
procedure Button2Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.Button2Click(Sender: TObject);
var
Memory:Dword;
begin
Memory:=$005B55A9;
PDWORD(Memory)^:=225; {EB=225}
Free();
end;
end.
Run Code Online (Sandbox Code Playgroud)
我做错了什么?如何在没有访问冲突错误的情况下将JNZ(74)的指令覆盖到JMP(EB)?对不起我的错误,我昨天开始阅读它,这是我的第一个例子.我已经有了Injector(极端注射器).我的疑问只是关于DLL编码.你能帮助我吗?
我忘了说,我使用的是Windows 10 ...