|
本帖最后由 taizhong 于 2018-1-19 05:38 编辑
各个VIP模块都是抄来抄去,你破J我的,我破J你的,
你是超级功能,我是究极功能,不知道再往后会叫什么XX功能,真是狗咬狗,一嘴毛
这些模块很少有自己原创的功能,就算是原创,不过就是把其他语言的代码移植到易语言,欺骗新手而已
毕竟初学易语言的都是一些新手,连API函数都不懂,新手的钱最好骗
还好有精易这样的公司,模块也是开源的,广大新手可以免费学习,只要你有时间,有兴趣,肯定会有所收获,不要再去其他论坛买什么永久VIP了
1 什么是超级HOOK功能?
'==================
可以实现读取指定地址寄存器值的功能
取出寄存器的值用处不大,我们是要的是寄存器+偏移值 后的数据,
2 人造指针和超级HOOK
'==================
CE具有自动汇编功能,将输入的汇编代码插入到目标进程中,来实现某些目的
比如,存放阳光数量的地址是一个动态的数值,每次启动游戏后,这个地址就会变动,于是就需要通过"是什么访问了这个地址"来一层一层的找出 阳光的基址(基址是一个常量,软件编译后,就固定不变了)
可是这样找偏移很麻烦,可以写入一段汇编代码,不用基址,不用偏移,.同样找出阳光的数量
找出阳光的数量地址后,通过 "是什么访问了这个地址",找出有这样的语句:
XXX(伪地址) 22ddFFF(伪机器码) add eax ,[edx+5560]
这段汇编代码的意思是:把edx+5560这个地址中的数值,和eax相加,存放到eax中
其中edx+5560这个地址里面存放了阳光的地址,指向指针的指针,二级指针
假如知道了 在XXX地址这个地方,寄存器edx的值,就可以知道了阳光的数量
人为的找出一个地址,用来存放[edx+5560]的值,这种方法叫"人造指针"
如何写汇编得到寄存器[edx+5560]的值呢?
CE中新建一个空的脚本:
[ENABLE]
//code from here to '[DISABLE]' will be used to enable the cheat
alloc(newmem,2048)
label(returnhere)
label(originalcode)
label(exit)
newmem: //this is allocated memory, you have read,write,execute access
//place your code here
//这里存放我们要置入的汇编代码
originalcode:
//这里保留了原来的汇编代码
exit:
jmp returnhere
//这里是下一行指令
00400008://这里是当前的地址
jmp newmem
returnhere:
[DISABLE]
//code from here till the end of the code will be used to disable the cheat
dealloc(newmem)
00400008:
//Alt: db 00 00 00 00 00
上面的东西看不懂,可以不看,看下面的文字讲解:
在目标进程中,新申请2048长度的空间,用来存放我们写入的汇编代码,同时保留了要HOOK地址行的原始数据,和下一行的地址
通常可以这样写:
push eax
lea eax ,[edx+5560]
mov [YYY],eax
pop eax
YYY是我们指定的地址,用来存放阳光的地址,不用管EDX的值是多少
超级HOOK说白了,就是人造指针,没什么超级的,普普通通的技术,只不过用易语言来写出
3 不用某某VIP模块,"超级HOOK"该如何写?
'==================
第一步:申请一片内存空间,用于存放我们置入的代码;申请一个地址,用来存放[ebx+5560]的值
第二步:在这个内存空间,写入代码,最后jmp回来(被hook地址的下一行,加5)
第三步:hook目标地址,跳转到申请的地址空间
难点在第二步"mov [YYY],eax"和jmp语句,
YYY是变量,易语言不像C++内联汇编那样可以写入变量,置入代码()和_asm()都不行
mov dword ptr [YYY],eax 可以转换的机器码是: { 163 } + 到字节集 ( 十六到十(YYY)),这样就可以写入变量了
jmp语句,这里是个远跳,需要计算目标地址和当前地址的距离,这个也不难计算
超级hook功能,仅此而已,仅此而已
附上某作坊超级hook源码用于学习
根据我的讲解,希望可以写出自己的"超级hook"
|
评分
-
查看全部评分
|