帮忙还原一段ASM代码,谢谢!

sysadm_cc 2003-08-30 08:58:31
一程序用Delphi编写,运行需要验证密码(明文),用SOFT-ICE跟踪到比较密码过程,ASM代码如下:

...
0167:004C7EBE MOV EDX,[EBP-04] //把真实密码的地址送入EDX
0167:004C7EC1 MOV EAX,[BBP-08] //把输入待验证密码的地址送入EAX
0167:004C7EC4 CALL 00409124 //调用过程比较密码

0167:00409124 PUSH ESI //此过程比较密码
0167:00409125 PUSH EDI
0167:00409126 MOV ESI,EAX
0167:00409128 MOV EDI,EDX

0167:0040912A OR EAX,EAX
0167:0040912C JZ 00409131
0167:0040912E MOV EAX,[EAX-04]

0167:00409131 OR EDX,EDX
0167:00409133 JZ 00409138
0167:00409135 MOV EDX,[EDX-04]

0167:00409138 MOV ECX,EAX
0167:0040913A CMP ECX,EAX
0167:0040913C JBE 00409140
0167:0040913E MOV ECX,EDX

0167:00409140 CMP ECX,ECX
0167:00409142 REPZ CMPSB
0167:00409144 JZ 0040914E
0167:00409146 MOVZX EAX,BYTE PTR [ESI-01]
0167:0040914A MOVZX EDX,BYTE PTR [EDI-01]
0167:0040914E SUB EAX,EDX
0167:00409150 POP EDI
0167:00409151 POP ESI
...
0167:00409152 RET //返回

请问:1、详细讲解一下此段代码
   2、把比较密码的过程还原成C
   3、把比较密码的过程还原成Delphi
   

非常感谢!
...全文
82 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sysadm_cc 2003-09-01
  • 打赏
  • 举报
回复
能用C还原一下吗?
zjybestzjybest 2003-09-01
  • 打赏
  • 举报
回复
0167:004C7EBE MOV EDX,[EBP-04] //在局部变量中取串1的首地址 //把真实密码的地址送入EDX
//EDX指向了串1首地址
0167:004C7EC1 MOV EAX,[BBP-08] //在局部变量中取串2的首地址 //把输入待验证密码的地址送入EAX
//EAX指向串2的首地址
0167:004C7EC4 CALL 00409124 //调用过程比较密码

0167:00409124 PUSH ESI //此过程比较密码
0167:00409125 PUSH EDI
0167:00409126 MOV ESI,EAX //ESI指向串1
0167:00409128 MOV EDI,EDX //EDI指向串2

0167:0040912A OR EAX,EAX //判断串1是不是空串
0167:0040912C JZ 00409131 //如果是空串跳转
0167:0040912E MOV EAX,[EAX-04] //取出串1的长度

0167:00409131 OR EDX,EDX //判断串2是不是空串
0167:00409133 JZ 00409138 //如果是空串跳转
0167:00409135 MOV EDX,[EDX-04] //取出串2的长度

//到了这一步实际上EAX就是串1的长度,EDX是串2的长度

0167:00409138 MOV ECX,EAX
0167:0040913A CMP ECX,EAX
0167:0040913C JBE 00409140 //如果串1的长度为0
0167:0040913E MOV ECX,EDX //串2的长度就是比较的长度

0167:00409140 CMP ECX,ECX
0167:00409142 REPZ CMPSB
0167:00409144 JZ 0040914E //如果EDI指向的串是ESI指向的子串
0167:00409146 MOVZX EAX,BYTE PTR [ESI-01]
0167:0040914A MOVZX EDX,BYTE PTR [EDI-01]
0167:0040914E SUB EAX,EDX //返回一个在ESI中最后不匹配的位置
0167:00409150 POP EDI
0167:00409151 POP ESI
...
0167:00409152 RET
sysadm_cc 2003-09-01
  • 打赏
  • 举报
回复
那为什么MOV EAX,[EAX-04]这样的形式在DEBUG下不能执行呢?
zjybestzjybest 2003-09-01
  • 打赏
  • 举报
回复
你看一下DELPHI中ANSISTRING的结构
strAnsi = record
nSize: Integer;
nRef: Integer;
nLength: Integer;//这个地方!!!
szBuf: array of Char;
end;
你可以发现
mov eax,dword ptr [eax-04]
实际上就是串的长度呀!


sysadm_cc 2003-09-01
  • 打赏
  • 举报
回复
mov eax,[eax-04]这条指令我在DEBUG上用也没有通过,可是SOFT-ICE跟踪到的却是这种形式,这是怎么回事?
还有这种形式是用反汇编软件得到的:
mov eax,dword ptr [eax-04]
请高手详解。
谢谢
zhangze 2003-08-31
  • 打赏
  • 举报
回复
我不知道这条语句:mov eax,[eax-04]是否能够进行,不过,从比较的语句来看,应该将密码和待验证的密码保存在像数组这样的结构中,并不进行任何的算法运算,直接比较两者是否完全相同,如果相同的话,就将eax与edx相减,否则就将eax与edx赋予别的值相减.具体的过程应结合程序单步运行的结果来验证.比较两个数组是否相同,在c语言中很容易实现,我估计程序通过指针来访问数组
klbt 2003-08-30
  • 打赏
  • 举报
回复
学习。

21,453

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧