首页
社区
课程
招聘
一段汇编代码求用DELPHI内联汇编实现
发表于: 2013-6-1 10:10 4103

一段汇编代码求用DELPHI内联汇编实现

2013-6-1 10:10
4103
这段汇编代码是加密字符串的

求助使用DELPHI内联汇编把下面这段代码写成一个函数,函数的参数为字符串和字符串长度

0052A001    60              pushad
0052A002    BE 17A05200     mov     esi, 0052A017
0052A007    8B4E 04         mov     ecx, dword ptr [esi+0x4]  //这个地址是字符串的长度
0052A00A    8D76 08         lea     esi, dword ptr [esi+0x8]  //这个地址是字符串
0052A00D    8BFE            mov     edi, esi
0052A00F    AC              lods    byte ptr [esi]
0052A010    34 07           xor     al, 0x7
0052A012    AA              stos    byte ptr es:[edi]
0052A013    E2 FA           loopd   short 0052A00F
0052A015    61              popad

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 93
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
2
edi,esi 递增,还是递减?貌似没看到设置标志位指令...
2013-6-1 11:20
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
这种直接就是源代码出来了还需要内嵌?
2013-6-1 15:52
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
procedure Decryption(var Data: Pointer);
var
  _Length,i:Integer;
begin
   if Data=nil then Exit;
   _Length:= PInteger( Dword(Data)+4)^;
   for i:=0 to _Length-1 do
   begin
      PByte(Dword(Data)+8+i)^:=  PByte(Dword(Data)+8+i)^ xor 7;
   end;

end;
2013-6-1 16:01
0
雪    币: 182
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
Data定义的是Pointer类型,要加密的字符串是string类型。
2013-6-1 17:44
0
雪    币: 22
活跃值: (443)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
function EncryptString(SourceStr: string;SourceLen:integer): string;
var
  i: Integer;
begin
   SetLength(Result, SourceLen);
  for i := 1 to SourceLen do
  begin
      Result[i] := Chr(Ord(SourceStr[i]) xor 7);
  end;
end;
2013-6-1 18:00
0
雪    币: 182
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
function enstr(strtmp: string): pchar;
begin
  asm
    pushad
    mov     ecx, 31  //这个是字符串的长度
    lea     esi, strtmp  //这个是要加密的字符串
    mov     edi, [esi]
    @a1:
    lods    byte ptr [esi]
    xor     al, 7
    stos    byte ptr es:[edi]
    loop    @a1
    popad
  end;
  Result := PChar(strtmp);
end;

我自己写的这段只能加密第一个字符,后面的循环好像有问题
2013-6-1 18:39
0
雪    币: 95
活跃值: (85)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
8
loop @@L1后ecx就突然变成0了,所以你的程序只能对第一个字符加密。
建议把loop那一句改为
dec ecx
jnz @@L1

另外:
lea    esi, strtmp

也不妥,因为每次lods byte ptr [esi]之后,查看al的值并不是你期望的那个字符的asic码值!
再另外,mov    ecx, 31这一句把字符串长度写死了。
下面是我的程序,请测试一下效果:
procedure Encrypt(str:string);
var
	len:Integer;
begin
	len := Length(str)
	asm
		pushad
		cld;
		mov     ecx, len
		mov     esi, str
		mov     edi, esi
	@@L1:
		lods    byte ptr [esi]
		xor     al, 7
		stos    byte ptr es:[edi]
		dec		ecx
		jnz     @@L1
		popad
	end;
end;
2013-6-2 09:49
0
游客
登录 | 注册 方可回帖
返回
//