冥界3大法王 发表于 2020-7-27 09:42

求教CIP是什么东西? 有三句代码打死也看不懂,球高手解答!

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

https://www.lanzoux.com/iqYXOf0uu5a这个为测试程序


使用到的脚本
//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         //清全部cc断点
bphwc    //清全部硬件断点

//script start
step      //单步
bphws csp,r//为csp设一个硬件访问断点,但csp? 有这个寄存器吗 ?
erun      无视异常运行
bphwc清全部硬件断点

//find oep jump       查找oep
find cip,"80E9"   // 在内存页中 找代码码,cip又迷糊了,有这个寄存器???
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


光标执行到 00409D56 | 8D4424 80                      | lea eax,dword ptr ss:         
也就是脚本 bp $result+1 说什么执行脚本出错

// Author: Thomas Thelen
// Contact: https://github.com/ThomasThelen
// Comment: Takes you to the OEP of files packed with UPX from versions 2.02 to 2.03
// Date: 8/12/2015
// Instructions: Open the file in x64dbg and run the script.


//Begin Script
run
bc
bphwc


//Find the OEP
find CIP, E91B33FFFF// Signature of OEP jump我不明白CIP是啥?无论是32位的调试器还是64位的了,哪有去?
我也试过 findallmem esp,"E9 98 72 FF FF"这样搜索一页变多页就只有一个结果了。但是问题来,如何把这个的结果传给$result ?
网上x32dbg中仅有那么几个少的可怜的破脚本,还没有一个入门的详解。
RAX : 00007FF793770100   
RBX : 0000000000000000
RCX : 0000007E186C7000
RDX : 00007FF793770100   
RBP : 0000000000000000
RSP : 0000007E1887F758
RSI : 0000000000000000
RDI : 0000000000000000
R8: 0000007E186C7000
R9: 00007FF793770100
R10 : 00000FFEF26EE020
R11 : 0000000100400000
R12 : 0000000000000000
R13 : 0000000000000000
R14 : 0000000000000000
R15 : 0000000000000000
RIP : 00007FF793770100   


cmp $result, 0      // Check for success   帮助中所说比较两个数的结果 此命令比较两个表达式。请注意,当您要检查值是否更大或更小时,将进行arg1>arg2的比较。
如果此值的计算结果为true,则$_BS_FLAG将设置为1,表示该值更大。所以测试arg1是否大于/小于arg2。
arg1第一个要比较的表达式。
arg2要比较的第二个表达式。
je error      // Error otherwise
bp $result      // Set a breakpoint on the jump   这个是设一个断点(加上那个结果的变量) 怎么加,不明白。 我找了个upx3.95的做试验,卡住了。
run      
st      
sti      // Take jump to OEP
bc      // Clear Breakpoints
ret


error:
msg "Could not find the OEP."
ret

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


// Author: Thomas Thelen
// Contact: https://github.com/ThomasThelen
// Comment: Takes you to the OEP of files packed with UPX from versions 3.06 to 3.09
// Date: 8/12/2015
// Instructions: Open the file in x64dbg and run the script.


//Begin Script
run
bc
bphwc


//Find the OEP
find CIP, E9BA31FFFF// Signature of OEP jump====》还是上面的那些问题。
cmp $result, 0      // Check for success
je error      // Error otherwise
bp $result      // Set a breakpoint on the jump
run      
st
sti      // Take jump to OEP
bc      // Clear Breakpoints
ret


error:
msg "Could not find the OEP."
ret

冥界3大法王 发表于 2020-7-27 10:01

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

看了下帮助,说有cip
所有的寄存器(所有大小)可以用来作为变量。
大多数寄存器的变量名称与它们的名称相同,但以下寄存器例外:
x87 控制字标志:该寄存器的标志被这样命名:_x87CW_UM
除了在架构中的寄存器外,x64dbg 还提供下列寄存器:CAX、CBX、CCX、CDX、CSP、CBP、CSI、CDI、CIP。这些寄存器在 32-位平台上被映射到 32-位寄存器,而在 64-位平台上被映射到 64-位寄存器。例如,CIP 在 32-位平台是 EIP,而在 64-位平台是 RIP。该功能为了能支持独立于体系结构的代码。
但cip指的是哪里呢?

当行脚本执行到红箭头行!
msg {cip},结果是00409D56
msg {$result} 的 执行结果为1
怎么才能让bp结果+变量得到bp00409D63 给这行下断点呢?

oudaidai 发表于 2020-7-27 10:20

本帖最后由 oudaidai 于 2020-7-27 10:26 编辑

学习学习,下次不敢了

冥界3大法王 发表于 2020-7-27 10:23

oudaidai 发表于 2020-7-27 10:20
非常感谢

@oudaidai
感谢个屁,我很多求助未解决还成了收藏{:301_1008:}
楼主是糊涂蛋,楼下是超级糊涂蛋, 错了还害死一窝。{:301_971:}

不忘初心哟 发表于 2020-7-27 10:24

oudaidai 发表于 2020-7-27 10:20
非常感谢

人家求助都没有找到回答 你感谢个毛啊 怕是灌水灌上瘾了

oudaidai 发表于 2020-7-27 10:25

不忘初心哟 发表于 2020-7-27 10:24
人家求助都没有找到回答 你感谢个毛啊 怕是灌水灌上瘾了

sorry,我自己在学习selenium,试一下这种回帖方式

oudaidai 发表于 2020-7-27 10:27

冥界3大法王 发表于 2020-7-27 10:23
@oudaidai
感谢个屁,我很多求助未解决还成了收藏
楼主是糊涂蛋,楼下是超级糊涂蛋, 错了 ...

sorry,我自己在学习selenium,试一下这种回帖方式,对不起

chasels 发表于 2020-7-27 10:43

冥界3大法王 发表于 2020-7-27 10:23
@oudaidai
感谢个屁,我很多求助未解决还成了收藏
楼主是糊涂蛋,楼下是超级糊涂蛋, 错了 ...

笑死,本来想看看大神的解答呢

pack39 发表于 2020-7-29 16:37

在PEDIY我也回了你,这里再回你一次。
我不知道你在纠接什么,这个CIP,在32位里面就是指的EIP,如果在64位上就是RIP,EIP里保存了CPU即将执行的指令的地址,重点,是指令的地址,它会不断增加的。你也看得到现在的地址是00409D56,因为脚本停在这里,这个地址里目前保存的数据是8D442480(在计算机里指令和数据是分不开的),4个字节,所以它的下一个地址就是00409D5A -4 =00409D56,脚本的意思,从这个地址开始查找这些指令,比对,如果找到了80E9,E9就是JMP指令的哈,就把保存有80E9指令的地址返回给result,很显然,这个地址是指向80,而不是E9,而我们需要在E9上下断,所以会有result+1的做法。其实这个脚本也可以改成这样:find cip,"E9"然后bp $result   //下断在E9上,E9就是JMP啦,脚本作者可能是为了稳健才写成查找80E9的。你甚至可以改成:find cip,"E99872ffff"   ,这样result应该会是地址409D63, 然后精确的在E9上下断,bp $result ,再乱搞一下,你甚至可以find cip,"75FA",然后bp $result+5

pack39 发表于 2020-7-29 16:41

仔细看你贴子,难怪你得不到正确的result值,我晕,你自己看看,这条命令:      find CIP, E9BA31FFFF// Signature of OEP jump====》还是上面的那些问题。
Result返回的是地址,绝对不会是1,要么是0,谁会给它1呢
页: [1] 2
查看完整版本: 求教CIP是什么东西? 有三句代码打死也看不懂,球高手解答!