冥界3大法王 发表于 2021-4-10 17:05

不支持64位内嵌汇编,老外的文档看不太懂


function TForm1.GetSerialMotherBoard: string;   //获取主板ID
var
a, b, c, d: LongWord;
begin
asm
      push    EAX
      push    EBX
      push    ECX
      push    EDX
      mov   eax, 1
      db      $0F, $A2
      mov   a, EAX
      mov   b, EBX
      mov   c, ECX
      mov   d, EDX
      pop   EDX
      pop   ECX
      pop   EBX
      pop   EAX
end;
result := inttohex(a, 8) + '-' + inttohex(b, 8) + '-' + inttohex(c, 8) + '-' + inttohex(d, 8);
end;


出现报错信息

E1025 Unsupported language feature: 'ASM'   delphi
百度那饭桶又没找到;Google搜索找到以下官方解释:http://docwiki.embarcadero.com/RADStudio/XE2/en/Converting_32-bit_Delphi_Applications_to_64-bit_Windows#Inline_Assembly_code

问题是怎么修改呢?

CRoot 发表于 2021-4-10 18:01

本帖最后由 CRoot 于 2021-4-10 18:06 编辑

就是说 不支持内联64位混合汇编。 要么函数里面只有Pascal 要么函数里面只有汇编语句,不能写了Pascal的变量生成,然后又写汇编代码。

比如
function PortIn(Address: Word): Byte;
    {-Use this instead of Port since it works in both 16 and 32-bit mode}
{$IFDEF CPUX86}
begin
    asm
      mov dx,Address
      inal,dx
      mov @Result,al
    end;
end;
{$ELSE}
// CPU64, x64
asm
    mov dx,Address
    inal,dx
    mov @Result,al
end;
{$ENDIF CPUX86}

你可以把汇编部分单独拆成 函数 ,然后再调用。

冥界3大法王 发表于 2021-4-10 18:05

@CRoot
是不是就是这页面中说的注入线程
https://stackoverflow.com/questi ... orted-language-feat
或QQ群说的封装成activeX来实现?
那别人来破解是不是也得x32dbg+x64dbg同时上阵了?

CRoot 发表于 2021-4-10 18:14

冥界3大法王 发表于 2021-4-10 18:05
@CRoot
是不是就是这页面中说的注入线程
https://stackoverflow.com/questi ... orted-language-feat


不好意思,可能不是太明白您的意思。上述 似乎出错的原因似乎是用X64的编译器编译的32位的汇编出的问题。针对进程注入的话,肯定是32位的注入到32位里面,64位注入到64位里面。而您出现的问题似乎是在x64编译器下,汇编和Pascal混写了,您可以将asm代码单独拆到一个函数里面,就是这个函数里面只有asm,没有
result := inttohex(a, 8) + '-' + inttohex(b, 8) + '-' + inttohex(c, 8) + '-' + inttohex(d, 8);
这类语句。而32位汇编,就可以混合写,您也可以将编译的目标改为编译成32位的程序,而不是64位的程序。由于我这边没有Delphi环境,所以没法写一下改好的内容。

CRoot 发表于 2021-4-10 18:17

本帖最后由 CRoot 于 2021-4-10 18:29 编辑

将目标改为32位的方法 https://bbs.csdn.net/topics/391848041

这问题在VS也有,就是32位的还能用内联汇编,64位的必须保存成.asm文件,写成函数然后添加到项目工程中编译,也蛮麻烦的64位的。

页: [1]
查看完整版本: 不支持64位内嵌汇编,老外的文档看不太懂