吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1291|回复: 4
收起左侧

[求助] Delphi内嵌汇编(push eax 怎么来的?

[复制链接]
冥界3大法王 发表于 2020-2-27 09:22
本帖最后由 冥界3大法王 于 2020-2-27 11:38 编辑

https://www.cnblogs.com/JiangHuakey/archive/2010/10/07/1845054.html

请给我解释下:  为啥要从push eax开始? 没学过内嵌汇编,实在是不明白啊。
不是该从00450590取么?  从入门指导丛书,谢谢。


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只输出了一位啊。

此楼作废

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

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

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

懂了,加个判断就行了。
[Delphi] 纯文本查看 复制代码
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);
      {下面这段如看不明白请参考我的另一篇文章}
      {[url=http://www.cnblogs.com/JiangHuakey/archive/2010/09/25/1834378.html]http://www.cnblogs.com/JiangHuak ... /09/25/1834378.html[/url]}
  asm
        PUSH    ESI;
        PUSH    EDI;
        CLD;
        LEA     ESI, byte ptr[code];
        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', [Integer(myCode[i])]);
    if Length(Memo1.Text + Format('%x', [Integer(myCode[i])])) > 0 then
    begin
//      ShowMessage(Memo1.Text + Format('%x', [Integer(myCode[i])]));
      if Length(Format('%x', [Integer(myCode[i])])) = 2 then
      begin
        Memo1.SelLength := 0;
        Memo1.SelText := Format('%x ', [Integer(myCode[i])]);
      end;

      if Length(Format('%x', [Integer(myCode[i])])) = 1 then
      begin
        Memo1.SelLength := 0;
        Memo1.SelText := Format('0%x ', [Integer(myCode[i])]);
      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
谢谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 20:31

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表