一个实用的x64dbg脚本

以下内容摘自紧跟法王我们一起写一个实用的x64dbg脚本《走位标线器-破迷宫专用》 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn

因觉得有用,便收藏于此,如有侵权,请联系删除。

你是否想过?写一个这样的脚本:
程序单步一步,当前行就注释一条 。。走位1
。。。。。。。。。。。。。。。。。走位2
。。。。。。。。。。。。。。。。。走位3
。。。。。。。。。。。。。。。。。。。。
。。。。。。。。。。。。。。。。。走位N
效果如下:



就跟你学做饭一样一样的,上来你得有调料吧?
比如我们今晚做鸡蛋羹
那你得准备四个鸡蛋吧?还得有酱油、盐、香油、水、一只大碗、味精、蒸锅。
你之所以破解学不好,不是因为人笨,而是因为你不会下棋,不懂全局观、不会自问自答、创造问题,解决问题。
那么我们就开始调制吧。
比如你是跳水运动员,上来你给我们表演个燕子空翻+转体3603S级入水动作
你肯定玩不转啊,我们得拆解成分解动作才行呐~~ 不然直接腰就折了。。。

注释的命令是啥?

CHM神器ExtraCHM法王破解版打开CHM,我们查看下吧。
commentset 地址,注释文本
既然是文本,那肯定是字符串喽
那就肯定得引起来呗

commentset 0040101A,"猪狗不如"
成功后,如下:

我们现在学会了注释命令,就是如此简单。

接下来,我们再来学一个命令弹框,也叫信息框,消息框,叫啥阿猫阿狗啥的并不重要,重要的你知道这玩意干啥用的就行了。

接下来,自行测试下面的命令
msg 我来了        //最简单的弹字符串型对话框
msg "你来了"     //与上等价,只不过加了双引号更加的规范哟~~
msg 1+2            //结果还是1+2
msg {1+2}        //这个就会得到3,因为{}里是一个表达式
不要小看msg这个命令!它有以下几点:

  • 弹出一个消息框
  • 打断程序
  • 弹出中间值(可以用来做测试 及时反馈汇报给我们的测试表达式是否正确?)


好了,到这里弹框方面你就基本上毕业了

我们再来学习一下格式化字符串

上面说了表达式,接下来就得说说格式化字符串了(其实它这个翻译的不好,正常编程习惯该是反过来翻译才对啊)
{大括号里边是表达式}
?:表达式         这样的格式哟~~
下面? 可用下面这些字母替换掉~~
光说不练做菜鸟,狗屁你也学不会。。。就算是做鸡蛋羹这么简单的东西也得自己动手做做呗。。。
不然学不会空吐槽的,只能证明自己是真的笨了。。。(其实呢,就算楼主的求助贴,你真的动脑子了吗?弄会弄懂之后还是饭桶?)

其他类似,等量代换,角1=2。。。用用你当年的几何代数知识就行了。。。不再赘述。。。

对了,还支持下面的复合类型组合
{ansi[;length]@address}
呵呵,具体看帮助喽~~
说多怕你们脑袋大。。。
主要为了输出一种格式化了字符串,例如你要在日志窗口中输出 【文件名:。。。。。。】就得调用寄存器和上面的东东,不然可直接给你打脸啊~~
但是你弄会之后就觉得很神奇的组合。这东西其实是给机器用的,并不适合给人类看。

接下来呢,你们再来说一下算术表达式

你不可能只用个1+1吧? 至少还得有个== 比较   !=不等于之类的写法吧。。。。
复制试试,看看就好,用时抄抄,就这么简单,想多了,你就输了。


接下来,我们再来学习一下表达式函数

函数是啥? 好比就是组装好的零件或有相应功能的盒子,用时去调用,执行之后,它会告诉你成功了,或失败了。。。非常的听话和靠谱哟~~
我们这里只需要一个 {mod.party(地址)}就够了。
我们换成下面的代码测试下:
msg {mod.party(eip)}

当前eip00401000
它是crackme领空
所以呢,弹框测试,当然我们得到的是0 用户领空喽~~


接下来,你还得知道F8单步步过  F7单步步入。。。。等咋写?


StepOver 就相当于F8
StepInto。。。。。F7
如果前边多个字母e就有跳过异常之意。。。
这一部分基本上够用了,就到这里吧。。。


接下来,我们再来学下定义变量

varnew 就是定义或声明一个新变量
有两个参数
1是变量名 ,如   a1$
2是初始化变量值 ,如123 这是一个字符串
那么我们
var a1$, 1
msg {a1$}  //
我们就得到了1

要是下面这样呢?


 

var a1$, 1
msg {a1$+1}               //
我们就得到了2

因为楼主要的注释内容是  走位1。。。走位2。。。走位3。。。。

修改一下代码,并合在一起就是:commentset eip, "走位"{a1$+1}


这一部分,我们也鼓捣好了。。。。


接下来,我们还需要定义标签
bing/google网上搜索下脚本,别用百度那个国产吃货就行了。

你会发现一般人家的脚本长这个样子

标签:                                   //我们就修改成    XunHuan_Jia1:
XXX
ret                                         //
一般代表return代码段结束
代表一个小节(子程序段)

$result 代表内置的结果变量    一般是01
cmp $result, 0                       //
用这个命令来检测结果
然后呢,我们还需要一个相等,或不相等的命令。。。





现在似乎该有的调料都有了,万事俱备,只欠东风。。。
加分不积极,心情不好,没几个人识货。。。



编好了,自己先爽了,睡觉了~~

[C++] 纯文本查看 复制代码

?

// Author: 吾爱破解论坛之荣誉会员-冥界三大法王

// Comment: x36dbg之走位注释标线器-破迷宫专用

// Date:2021-4-5晚 生产

var a1$, 1 //首先我们定义一个Integer型变量为以后的注释内容"走位+数字N"作准备

XunHuan:

//msg {a1$+1} 得到2 //msg {$result} //正确

//cmp {mod.party(eip)},0 //这样写也没有报错

cmp mod.party(eip), 0 //当然是先判断一下当前行eip到底是用户领空还是系统领空啦?(两种写法都没有报错)

je ZhuShi_Jia1   //如果=0则相等则跳转到ZhuShi_Jia1子程序部分来添加 注释内容"走位+数字N"

StepOver        //单步执行

ret                  //小节结束

ZhuShi_Jia1:

commentset eip, "走位"{a1$+1}

jmp XunHuan //注释完了,当然还得接着重复判断加注释啦,所以无条件跳转到XunHuan

ret //小节结束



============================================================================

紧跟法王我们一起写一个实用的x64dbg脚本《走位标线器-破迷宫专用》
我们上一节中编了第一个脚本,但是根据使用和测试情况来说,发现了几个不足:
1.程序运行起来了,卡住了!
2.我们似乎忘记点什么?
3.每次重载脚本,自定义变量调试器并不会自动清掉;导致因重复定义变量而报错
(视图=》变量=》删除)
4.改一次脚本,就得Alt+S切换到脚本窗口,并Ctrl+o打开该脚本路径,或按Ctrl+R重载,空格键运行,活人手动清理变量名
显然很麻烦,操作起来很不方便
5.脚本的功能尚开延伸和加强
6.输出的 序号并非10进制的数
7.已经注释行的内容会被清掉,导致成为成一色的"走位XX序号"

[Asm] 纯文本查看 复制代码

?

// Author: 吾爱破解论坛之荣誉会员-冥界三大法王

// Comment: x36dbg之走位注释标线器-破迷宫专用

// Date:2021-4-5晚 生产

var a1$, 1 //首先我们定义一个Integer型变量为以后的注释内容"走位+数字N"作准备

XunHuan:

//msg {a1$+1} 得到2 //msg {$result} //正确

//cmp {mod.party(eip)},0 //这样写也没有报错

cmp mod.party(eip), 0 //当然是先判断一下当前行eip到底是用户领空还是系统领空啦?(两种写法都没有报错)

je ZhuShi_Jia1   //如果=0则相等则跳转到ZhuShi_Jia1子程序部分来添加 注释内容"走位+数字N"

StepOver        //单步执行

ret                  //小节结束

ZhuShi_Jia1:

commentset eip, "走位"{a1$+1}

jmp XunHuan //注释完了,当然还得接着重复判断加注释啦,所以无条件跳转到XunHuan

ret //小节结束





这是一上次写的第一个脚本哈~~
似乎呢,我们并不需要写两个小节。
我们尝试进行下面的修改:

[Asm] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

16

17

var a18$, x1  //首先我们定义一个Integer型变量为以后的注释内容"走位+数字N"作准备,10进制的1你得写成1d,最好用英文,否则不显

//var DaQian_VAaddress$, eip

XunHuan:

cmp mod.party(eip), 1      //和1比较,如返回1则是系统领空

StepOver                          //单步执行

cmp mod.party(eip), 0    //和0比较,如返回0则是用户领空

inc a18$                          //自增变量加1

//msg {DaQian_VAaddress$}

//commentset DaQian_VAaddress$, "MY_Path"{a19$}

commentset eip, "MY_Path"{a18$}

//commentset eip, "MY_Path"{a18$}  //这句也有问题,得分成两句来写!

jmp XunHuan   //跳到头部重复执行

ret                  //小节结束








已经注释的内容是这个样子的

报错就是这个样子的

也就是说,我们只需要一个小节(子程序)
来不断的循环就行了。

让我们再来学习下16进制   10进制在x32dbg/x64dbg的中表示方法吧?

xFF16进制) 我们得到的是255d10进制

.255 (10进制)。。。。。。。FF(255d)  


所以,我们上面的

var a18$, x1  //定义一个叫a19的变量,整型的,初始数值为1(后面无论你写成x1 还是1d)其实都是一样的

inc a18$     //自增变量加1     这个我们没说,您可以查看下帮助

commentset eip, "MY_Path"{a18$}   //这个合起来就是这样的(前面得到当前行运行到的VA地址;后面则是输出MY_Path这个字符串加自增变量a191


虽然状态栏显示【删除变量成功】但是列表并不会自动刷新,这就是bug,绝对是bug




EasyLableVeiw插件处则会显示成这个
同时呢,当我们Ctrl+F2之后也可能注释显示为MyPath{d:18$} 或后面是???
估计受了插件的影响吧,具体这个说不清。


改好之后

[Asm] 纯文本查看 复制代码

?

01

02

03

04

05

06

07

08

09

10

11

12

13

14

15

ClearLog                  //清空日志窗口

vardel a18$             //先清掉原先变量,因x32dbg/x64dbg不会自己清,再运行时就会因重复而报错!写命令清了也白搭还提示,得窗口手动清

var a18$, x0            //首先定义1个Integer型变量为以后的注释内容"MyPath+数字N"作准备,10进制的1你得写成1d或x1(最好用英文否则不显或乱码)

  

XunHuan:

cmp mod.party(eip), 0 //当然是先判断一下当前行eip到底是用户领空还是系统领空啦?(两种写法都没有报错)

inc a18$

/var DaQianVA, p:eip 定义成变量,再调用之,也是一样被覆盖掉了!

commentset eip, "MyPath"{d:a18$}  //{d:来格式化字符串}不然显示的可是16进制的(这行会被覆盖掉,靠,百思不解!)

commentset disasm.sel(), "MyPath"{d:a18$}  //输出效果一样,依旧覆盖注释问题没解决

log "commentset "{eip}", MyPath_"{d:a18$}              //输出效果比较牛逼!这个是新最后添加的输出到日志窗口,也是通过几轮字符串简单组合测试最终合在一起的样子哟~~(为了以后从日志窗口中提到加【注释序号的代码】因为注释被覆盖的问题想了几天还是不能直接解决{:301_1008:}

StepOver          //单步执行

jmp XunHuan   //跳转到开始重新判断写注释

ret                    //小节结束



日志窗口就是这个样子的



从网上下载插件,命令行输入【Scriptw】启动插件
基本方法是:F11 单步执行   F12 自动运行
它是Scriptw插件中一个;   

[Asm] 纯文本查看 复制代码

?

1

write2File  参数1,参数2,参数3

参数1:路径,要双引号括起来
参数2True/False
参数3:要写入的字符串,可以为数组
帮助中这样描述的:

write2File path,over_append(false/true),data (Can be array )

note: you can write array directly to file by write the array name see sample
this Function used to write data to file and can write array to file too .
write2File path,over_append(false/true),data
- in parameter 1 :set the path of the file it can be done by variable other wise use "" surrounded path.

设置文件的路径可以通过变量来完成,否则可以使用“”包围的路径。
- in parameter 2 :
                 - false: to over write file . ( u can use false or 0 or off )
为假时覆盖写入
                - true: to append to file . ( u can use true or 1 or on )为真时追加写入
- in parameter 3 : the data you want to write to the file it will analyzed if it have variables can be array .

如果它的变量为数组,您要写入文件的数据将被分解。
```
        -varx str,path,"E:\temp1\log.txt"
         varx array,x[2]
         GetAPIName $x[0],{rax}
         write2file $path,1,$x[0]        here it will append data to the log file
         write2file $path,0,"API Name:" $x[0]     this will write the value of x[0]
         
         -varx array,x[2]
          setx $x[0],test
          setx $x[1],again
            Write2File "D:\t.txt",0,$x           this will write all x aary to t.txt file

```
//



我们先来一个最简单的:Write2File "c:\Test8.txt",true, 52pojie
难点和变数在参数3
有了这种东西,我们就可以把满足条件输出到日志中的内容,直接写入到文件了。
让它生成脚本的脚本。

注意问题:插件的使用时,编码你得用记事本保存为ascII的,否则打开直接乱码(直接编辑注释中的中文,自身的保存功能时,用调试器打开或记事本再编辑时)
比如我们人工在某位置按下F2设下断点,脚本并不会被断下来哟~~
所以脚本中最好设有其他的中断条件,配合前面的来使用,才能达到最大的杀敌效果。



条件设置断点窗口可以组成连招,这个当然也能办到。而且当整明白之后能办许多有创造性的事情。
昨天的脚本被我们稍加修改,就输出了脚本的脚本。
利用这个我们可以少些中间环节,还可以加入点花式玩法,比如InputBox,中间加入条件断点,使之应用场合更广泛。
今晚先写思路,明天再写实现。。。。先睡觉吧。

  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值