- 在线时间
- 80 小时
- 推广
- 178
- 存款
- 0
- 最后登录
- 2012-1-18
- 阅读权限
- 50
- 主题
- 5
- 精华
- 1
- UID
- 74735
  
- 帖子
- 42
- 积分
- 418
- 金币
- 541
- 鲜花
- 7
- 注册时间
- 2010-8-23
|
本帖最后由 cn_zou 于 2011-1-8 14:20 编辑
---------------
III.c Push and Pop + The Stack
---------------
你已经看了上面的Push和Pop 命令的用法。等等!我是尤里!我能读你的思想!
| You wrote: | | 那个push和pop都是干啥的?还有啥是stack? |
好,你读了前文, 在"Push"之后,我是这么注释的。
| Code: | | //Push eax onto the stack (让eax入栈) |
这个基本上就是把eax存到堆栈里。而pop eax 基本上就是把eax从堆栈中清除。CEF的Skyone写了一个非常非常好的关于堆栈的解释,我甚至无法容忍自己不让你像我那样获得对此学习的快乐;)
| Skyone wrote: | 堆栈是用来存放可变的空白的值。它就如同: 你有用来做作业的一张纸, 但是之后你的朋友打电话叫你给Phil打电话,他的电话是 555-6405。 你慌了,没地方记啊,所以你把它写在了作业本上了。 之后你撂下电话, 就可以把Phil's电话写在电话薄上了。 在写完号码之后, 你就把号码从作业本用橡皮擦掉了, 然后打电话给Phil,并且继续做作业。
把值push to stack (入栈)就是 "在作业本上写下Phil的电话号码" 而pop就是 "把电话号码录入到电话薄上, 然后再从作业本上擦掉。"
|
继续...
---------------
III.d Alloc/Label/RegisterSymbol
---------------
我一般喜欢用两种方法来区分Auto Assembler脚本
1) 简单的地址改变
如同下面的简单代码:
| Code: |
[enable]
00ABC123:
mov eax,ebx
[disable]
00ABC123:
mov ebx,eax
|
这是在改变地址00ABC123里面的操作码。
但是也有非常复杂的脚本,就如同dICE 或 pID00的脚本。 (我不会在这里介绍, 因为那真的没什么必要去学)
在非常复杂的脚本当中,你会在最顶上看到某些函数,(注意,我并没有经常使用)在一个复杂的脚本当中通常会出现"alloc","label"函数,有时还会出现"registersymbol"。
````````````
Label
````````````
我认为"label"函数是三个函数中最有重要的。 他能够允许你用在脚本中使用"label"定义的变量,如同下面这样。 (摸丸:label用于定义用于跳转的标签)
| Code: |
label(Continue)
AutoAssembler:
mov eax,02
cmp eax,03
jne Continue
je SayWhat
Continue:
//...
//...
SayWhat:
jmp 0 //insta-crash! =D
|
首先应该注意此脚本的一些问题,这个脚本没有 "alloc" 函数, 之后我就讲
接着,如果你明白为什么程序执行了对应jne的label,那你做得不错。
注意所有的labels(跳转标签)都在我的脚本中定义了,否则他们不会编译。
````````````
Alloc
````````````
现在开始讲解"alloc"函数。 它是用来按照你的设想来分配X量的内存的函数 (hence,alloc,allocate)。 这些内存不是那些用过的, 而是那些你在运行程序中可以覆盖的没有被使用的内存。 就如同我说的,它会分配X量的内存。 X是个字节数的变量。1024bytes, 或者1 kb(kilobyte) 一般就足够你用了。现在我们了解了alloc函数,让我来演示下如何来使用它,并利用之前所学到的一切。(摸丸:按照尺寸划分一块内存,并给它起个名字)
| Code: |
alloc(AutoAssembler,1024)
alloc(SayWhat,1024)
label(Continue)
AutoAssembler:
mov eax,02
cmp eax,03
jne Continue
je SayWhat
Continue:
//...
SayWhat:
jmp 0
|
注意为什么我不这么做
| Code: | label(AutoAssembler)
|
或者
因为当用alloc划分出内存的时候,他们在Cheat Engine的词典中就自动得已经定义好了,便于我们调用。
````````````
RegisterSymbol
````````````
最后,函数"registersymbol"。 它可以添加你Cheat Table中你注册的标志。注意,你始终需要去为它分配内存。让我们在我们的脚本中试一试。
| Code: | alloc(AutoAssembler,1024)
alloc(SayWhat,1024)
alloc(WooHoo,1024)
label(Continue)
registersymbol(WooHoo)
AutoAssembler:
mov eax,02
cmp eax,03
jne Continue
je SayWhat
Continue:
cmp eax,[WooHoo]
SayWhat:
jmp 0
|
````````````
Counterparts
````````````
现在,让我们来继续最后的一小段: the counterparts。
有两种使用AutoAssembler script的方法。第一种,你可以注入一些东西。第二种,你可以把它添加到Cheat Table中。如果你决定要把它填到cheat table (当今大多数脚本都是如此), 那你的代码需要enable和disable两部分代码,如下。
| Code: |
[ENABLE]
alloc(AutoAssembler,1024)
alloc(SayWhat,1024)
alloc(WooHoo,1024)
label(Continue)
registersymbol(WooHoo)
AutoAssembler:
mov eax,02
cmp eax,03
jne Continue
je SayWhat
Continue:
cmp eax,[WooHoo]
[DISABLE]
|
现在,你会注意到,Disable部分什么也没有,不过一会就不会了!;)
你在Disable部分中所想达到的就是:撤销你在Enable部分中所做的。
如何撤销内存分配和注册中的标记。现在,我感觉有个问题要来了
简单来说,我的朋友。通过dealloc和 unregister symbol 函数! 哦,等等又有问题要来了。
"那label怎么办?" 你问?
嗯,没必要去撤销label。 =) 这意味着在Disable部分中,你大概要从开始那段中扔掉一半的代码! =)
那我们为什么不把学的加进脚本里呢?
| Code: |
[ENABLE]
alloc(AutoAssembler,1024)
alloc(SayWhat,1024)
alloc(WooHoo,1024)
label(Continue)
registersymbol(WooHoo)
AutoAssembler:
mov eax,02
cmp eax,03
jne Continue
je SayWhat
Continue:
cmp eax,[WooHoo]
[DISABLE]
dealloc(AutoAssembler)
dealloc(SayWhat)
dealloc(WooHoo)
unregistersymbol(WooHoo)
|
哦这儿...还有个问题。
| You wrote: | | 为什么你不用那个"1024"了? |
因为计算机知道你分配的AutoAssembler是大小为1024 bytes 的 (我们就把它当个例子试一试吧),你只是需要deallocAutoAssembler,它就知道应该取消分配AutoAssembler的全部1024 bytes了。(很抱歉,解释的有些迷糊) |
-
总评分: 金币 + 2
查看全部评分
|