冥界3大法王 发表于 2020-2-27 09:22

Delphi内嵌汇编(push eax 怎么来的?

本帖最后由 冥界3大法王 于 2020-2-27 11:38 编辑

https://www.cnblogs.com/JiangHuakey/archive/2010/10/07/1845054.html
https://pic002.cnblogs.com/images/2010/147787/2010100712263169.png
请给我解释下:为啥要从push eax开始? 没学过内嵌汇编,实在是不明白啊。
不是该从00450590取么?从入门指导丛书,谢谢。{:301_1006:}
{:301_973:}

begin
      ASM
       PUSH EAX;
         PUSH EBX;
         LEA EAX,codeEnd; {获取codeEnd函数的地址}
         LEA EBX,code;    {获取code函数的地址}
         SUB EAX,EBX;   {用codeEnd函数的地址减code函数的地址则可得出code函数的}
                        {大小,因为codeEnd函数刚好位于codeEnd函数的下面。}
         MOV codeSize,EAX;{把code函数的大小保存在变量codeSize中}
         POP EBX;
         POP EAX;
      END;

冥界3大法王 发表于 2020-2-27 09:27

本帖最后由 冥界3大法王 于 2020-2-27 11:36 编辑

B8 0A000000      
0只输出了一位啊。

此楼作废{:301_1006:}

冥界3大法王 发表于 2020-2-27 10:13

问题1解决,此层也作废,请回答新问题2

本帖最后由 冥界3大法王 于 2020-2-27 11:37 编辑

懂了,加个判断就行了。{:301_1008:}
unit Unit1;

interface

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

type
TForm1 = class(TForm)
    Button1: TButton;
    Edit1: TEdit;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
private
    { Private declarations }
public
    { Public declarations }
end;

type
pFunction = function(): Integer;

var
Form1: TForm1;

function code(): Integer;

function codeEnd(): Integer;

implementation

{$R *.dfm}
function code(): Integer;
var
i, j, k: Integer;
begin
i := 10;
j := 50;
k := i + j;
result := k;
end;

function codeEnd(): Integer;
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var
func1, func2, func3: pFunction;
myCode: array of char;
codeSize: Integer;
i: Integer;
begin
asm
      PUSH    EAX;
      PUSH    EBX;
      LEA   EAX, codeEnd; {获取codeEnd函数的地址}
      LEA   EBX, code;    {获取code函数的地址}
      SUB   EAX, EBX;   {用codeEnd函数的地址减code函数的地址则可得出code函数的}
                        {大小,因为codeEnd函数刚好位于codeEnd函数的下面。}
      MOV   codeSize, EAX; {把code函数的大小保存在变量codeSize中}
      POP   EBX;
      POP   EAX;
end;
SetLength(myCode, codeSize);
      {下面这段如看不明白请参考我的另一篇文章}
      {http://www.cnblogs.com/JiangHuak ... /09/25/1834378.html}
asm
      PUSH    ESI;
      PUSH    EDI;
      CLD;
      LEA   ESI, byte ptr;
      MOV   EDI, myCode;
      MOV   ECX, codeSize;
      REP   MOVSB;
      POP   EDI;
      POP   ESI;
end;
for i := 0 to HIGH(myCode) - 1 do
begin
//    Memo1.Text := Memo1.Text + Format('$%x', )]);
    if Length(Memo1.Text + Format('%x', )])) > 0 then
    begin
//      ShowMessage(Memo1.Text + Format('%x', )]));
      if Length(Format('%x', )])) = 2 then
      begin
      Memo1.SelLength := 0;
      Memo1.SelText := Format('%x ', )]);
      end;

      if Length(Format('%x', )])) = 1 then
      begin
      Memo1.SelLength := 0;
      Memo1.SelText := Format('0%x ', )]);
      end;

    end;

end;
func3 := pFunction(myCode);
i := func3;
Edit1.Text := IntToStr(i);
end;

end.

小学生黑大帅 发表于 2020-2-27 19:23

以下是我猜的,因为你要把codeEnd 和 code 移动到 寄存器进行一系列操作 ,所以你可以选用eax ebx ecx等,但是你又不能破环原来的寄存器值 ,所以要push 存起来,用完再 pop 还回去 。说白了就是再原有线程中插入一段汇编,你借它寄存器 用完 你得把寄存器的值复原,让线程按原来进行下去。
嘿嘿嘿,说错别怪我,大佬好

hkfox 发表于 2020-3-9 19:49

谢谢分享
页: [1]
查看完整版本: Delphi内嵌汇编(push eax 怎么来的?