关于一句汇编 求解

mrpeterchen 2012-04-18 11:00:40
CLD
;store hash
push 0x1234567
push 0x1e1f1212
push 0x0c917432
mov esi, esp
lea edi, [esi - 0xc]

想请教最后一句 lea edi, [esi - 0xc]
想问下,为什么是减0xc呢,这句执行以后,edi是指向哪里 ?
小弟一直琢磨这句,苦思不得其解啊~~
...全文
833 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ProgrammingRing 2012-04-20
  • 打赏
  • 举报
回复
减8 怎么会是LoadLibraryA呢……同求解释
yh_no_code 2012-04-19
  • 打赏
  • 举报
回复
还是一样,楼主自己看一下把
yh_no_code 2012-04-19
  • 打赏
  • 举报
回复
变形了,在发一次

| |
| |
| |<---------edi (esi-0x0c);edi的最终的位置
|
|
长度0x0C (这一段就可以存取其他的数据了)
|
|
| |<---------esp(esi)
| |
| |
|_|<--------栈底
yh_no_code 2012-04-19
  • 打赏
  • 举报
回复
减0xc是为了给局部变量留出栈空间,最后edi指向了栈顶的后0x0c字节处
一下示意图

| |
| |
| |<---------edi (esi-0x0c);edi的最终的位置
|
|
长度0x0C (这一段就可以存取其他的数据了)
|
|
| |<---------esp(esi)
| |
| |
|_|<--------栈底

mrpeterchen 2012-04-19
  • 打赏
  • 举报
回复
谢谢回复

可能这个问题要结合其他代码一起看:
我来贴完整它

CLD
;store hash
push 0x1234567 ;hash of MessageBox
push 0x1e1f1212; hash of ExitProcess
push 0x0c917432; hash of LoadLibraryA
mov esi, esp ;esi = addr of the first function hash
lea edi, [esi - 0xc]; edi = addr to start writing function

;make some stack space
xor ebx, ebx
mov bh, 0x04
sub esp, ebx

;push a pointer to "user32" onto stack
mov bx, 0x3233 ; rest of ebx is null
push ebx
push 0x72657375 ; 不懂这个值怎么得来得,是不是就是user32这个字符串呢
push esp; 为什么要把ESP入栈,LZ依然不懂
xor edx, edx

;find base addr of kernel32.dll
***************
;这里由于代码没有相关性就省略掉了

; find_lib_functions:
lodsd ;load next hash into al and increment esi
cmp eax,0x1234567 ; hash of MessageBoxA - trigger LoadLibrary("user32")
jne find_functions
xchg eax, ebp ; save current hash
call [edi - 0x8]; LoadLibraryA LZ不理解作者为什么这样写
xchg eax, ebp; restore current hash, and update ebp with base address of user32.dll
好了,代码到此为止
LZ有几点 不明白
1.lea edi, [esi - 0xc] ;这句里头为什么是0xc而不是0x9或者其他数字,是不是和后面代码有联系
2.call [edi - 0x8]; 执行这句话的时候,edi指向哪里? 为什么后面要减0x8,看注释貌似这就是loadlibrary函数的地址了,但是loadlibrary是带参数的,call前不是应该先push一个参数进去的吗?不懂呢
3.xchg是交换两个值,call指令执行过后,如果有返回值,是不是默认保存在eax寄存器里的 - 这样的话就能解释通 xchg eax, loadlibrary应该是返回某个DLL的地址,那么eax收到的就是那个dll的基址,然后通过xchg指令交换给了ebp,这样ebp的值就更新为user32.dll的基址了,而eax最后还是保存函数的hash值
不知道这样理解对不对

请高手进来解答我的疑惑
THANKS



21,458

社区成员

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

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