冥界3大法王 发表于 2020-7-27 11:25

冥界三大法王这吃货研究的第一个x32dbg脚本

本帖最后由 冥界3大法王 于 2020-7-27 11:38 编辑

https://www.lanzoux.com/iqYXOf0uu5a这个为测试程序(crackme.exe and upx3.91)
问题起源:https://www.52pojie.cn/thread-1230748-1-1.html
因为先前没有研究过一个OD的脚本,后来学了些编程,比如Delphi/AHK/Python尝到些甜头,就觉得有了编程很多东西可以自动化实现很多个性化特殊需求。
说得不对之处还希望海涵!关键是吸引出高手引起共鸣,解决一些问题!{:301_1006:}

从网上搜索x32dbg scriptintroduction guide teaching ,几乎找不到什么有用的东西
只要很少的几个脚本例子:
我这里仅贴一个 upx 3.91的
//start
msg "upx (3.91) unpacker"
msg "make sure you're at the entry point of the program before you continue"
pause

//clear breakpoints
bc
bphwc

//script start
step
bphws csp,r
erun
bphwc



//find oep jump
find cip,"80E9" //some pattern
cmp $result,0
je error

//go to OEP
bp $result+1
erun
bc
sti

//finish script
ret


error:
msg "didn't find oep jump"
ret


然后呢,我就一句句的粘到下面的命令行中来对比着学习

//start    这句学到了注释语句//开始,后面随意
msg "upx (3.91)继续之前请确保您在程序的入口点"   这个很简单就是弹信息框
还可以弹表达式
msg {2+3} 结果就是 消息框5
这个

msg oep
msg 就是弹框,后面是一个表达式,或跟一个变量
比如
var$aa1, 123455555    //有时定义会报错
var aa1$,123455555   //你也可以反着写
msg {aa1$} 就调用了这个变量
当然 还能太弹太多太多的结果

长长的列表,迷瞎了楼下的老花眼。。
具体可以看着帮助自行试验。
不试你是无法体会到x32dbg/x64dbg命令行的强大的。
pause   这个呢,就是暂停程序,相当于F12

一般使用时是这样的,先让你的目标程序暂停,或用一个断点断下,就可以加载运行了。
//clear breakpoint
bc    清除全部CC断点
bphwc清除硬件断点


//脚本开始,到这里,我们就开始正式的从入门地开始运行程序了

当前我的程序开始停在这里!
step   就相当于F8一下
bphws esp,r   想想你平时怎么esp定律的? esp变红,bulabula,下个硬件访问断点呗
erun    这句是无视异常运行程序
bphwc这个是清掉硬件断点



我们就来到了这一行
原来它是这样写的 find cip,"80E9" //在内存页尾查找特征码 80E9 ,到这里我就有些不明白了,cip是啥?

帮助中是这样描述的,但我不知对应我们x32dbg调试器中的哪里?
如果
msg {cip},结果是00409D56 | 8D4424 80                      | lea eax,dword ptr ss:         | :"繯F" 这地址行!
我发现我用它的这个找不到结果,所以
换成了findallmem
//查找内存页中oep跳转
findallmem esp,"E9 98 72 FF FF"

就只找到了一条结果,
于是到这里我就糊涂了。
cip如果是一个寄存器
当前结果是 00409D56 这地址

再往下就是下面这句 cmp $result,0

到这里,我又迷糊了,cmp 和一个结果变量做比较,另一个是0
你可以在命令行 打入 cmp $result,0无反应
我们msg {$result}
结果是1

到这里就实在是迷会加混乱了,谁跟谁做比较?
如何把内存中搜索到的特征码传递给这个结果的变量?
cip指的是哪里,对应于寄存器器的哪里?
为什么换成findallmemcip,"E9 98 72 FF FF" 却找不到?
可是cip指向 和 停在的地方 正是当前运行到的行
00409D56 | 8D4424 80                      | lea eax,dword ptr ss:         |


je error这句好解释,相等则转到错误 标签处


//转到OEP
bp $result+1    用找到的那个结果变量+1 ,设个断点,由于上面不明白,所以这句也解释不通了。{:301_977:}脚本执行到此行报错了;感觉老外给的脚本全是64位的。
erun无视异常运行
bc   清掉cc断点
sti       就是StepInto/sti其实就相当于F7了


//完成脚本
ret    一个函数一个子程序完成当然要return 返回了。

error:    这里定义了一个错误的标签后面加冒号
msg "不能找到oep跳转!"   弹框,任务失败!
ret                                          同理



https://static.52pojie.cn/static/image/hrline/2.gif


一个吃货的试验过程说完了,希望楼下的明白人能拨云见日,指点迷津。{:301_980:}

simakuangbiao 发表于 2020-8-11 09:07

VanceCZL 发表于 2020-8-1 17:47
求教导,怎么用DBG 脱壳的啊,用OD的ESP能脱,但是用DBG载入,发现与OD载入的完全不同,DBG载入的 ...

你这种情况是进入了系统领空(你看一下标题栏的模块名称,并不是你想要调试的程序名称)。
解决方式有2种:
1、依次选择菜单:【选项】-【选项】【事件】,只勾选入口断点,按【保存】按钮后重启调试器,就可以直接进入用户领空了。
2、依次选择菜单:【调试】-【运行到用户代码】或快捷键Alt+F9,也可以进入用户领空。
备注:通过观察标题栏的模块名称,可快速判断当前处于哪个领空。
希望对你有所帮助。

梁萧 发表于 2020-9-8 14:49

VanceCZL 发表于 2020-8-1 17:47
求教导,怎么用DBG 脱壳的啊,用OD的ESP能脱,但是用DBG载入,发现与OD载入的完全不同,DBG载入的 ...

你停在了系统断点或者TLS断点~ 在x64dbg的option里把tls断下和系统断点断下的勾取消掉.

xtuuqtbl 发表于 2020-7-27 11:36

好久没见法王了?隔离啦{:301_997:}

钢蛋蛋哥 发表于 2020-7-27 12:00

支持技术贴 感谢吾爱

mycc 发表于 2020-7-27 12:03

脚本语法跟OD的很像,竟然看得懂

罗萨 发表于 2020-7-27 15:17

求一份贴心伴侣{:301_1004:}

mycc 发表于 2020-7-27 16:05

冥界3大法王 发表于 2020-7-27 12:06
@mycc
指点一下吧。

都几乎全忘了,你指点一下我还差不多

lasolution 发表于 2020-7-27 16:16

过程非常详细,学习了。

一日就是一天 发表于 2020-7-27 21:06

好久不见法王了,特地来请安。虽然小弟混了近十年论坛,天赋所限,一无所成。但是法王大名还是如雷贯耳滴~

涛之雨 发表于 2020-7-27 22:43

你好像从来没有对我说过晚安,我在我们的聊天记录里搜索了关键字:“晚安”,你说过一次:我早晚安排人弄死你。
——摘自舔狗日记{:301_1001:}

星辰公子 发表于 2020-7-28 09:07

法王不灌水,居然走技术流了
法王桑,水区的樱花开了
不回来看看嘛
页: [1] 2
查看完整版本: 冥界三大法王这吃货研究的第一个x32dbg脚本