文章标题:脚本获得彩虹加密狗的eax密码
软件名称:Win计算器
使用工具:脚本插件
作者声明:只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
软件下载地址:http://bbs.pediy.com/showthread.php?s=&threadid=30893
原理是彩虹加密狗是将未加密的程序OEP处的4个字节,和加密后原OEP处4个字节进行异或运算
你肯定问我未加密那四个字节怎么得到,现在特定语言写的程序那四个字节一般都是不变的,例如VC6.0 55,8B,EC,6A
至于vb由于第一个是push xxxxxx,这个地址是一个字符串,不同程序编译时候这个地址可能不同,所以四个字节不能确定(也就是不是固定的),了解vb的高手,帮个忙。
var temp
gpa "ExitProcess", "kernel32.dll" //没发现狗,不论有没有提示,最终都调用ExitProcess函数
bp $RESULT //对ExitProcess下断
run//运行程序
mov temp,[esp]//[esp]指向返回地址
bc $RESULT//取消断点
mov eip,temp//把eip修改为返回地址,主要用于等下向下搜索特征码
find eip,#595A5F5EC9#//特征码
cmp $RESULT,0//没搜索到跳到error
je error
mov eip,$RESULT+5//eip指向特征码开始处的下5个字节,jmp oep
sto//单步,到oep
ask "请输入各类编程语言在OEP处特定的机器码,如何判断为何语言靠自己,嘿嘿!!!)"
cmp $RESULT_1,4
jne inputerror
rev $RESULT//反向用户输入的
mov temp,[eip]//取加密后oep处的四个字节和用户输入的四个字节进行异步或运算
xor temp,$RESULT//将加密后oep处的四个字节和用户输入的四个字节进行异步或运算
WRT "dump.txt",temp//保存运算结果
msg "脚本在目录下生成一个dump.txt文件,即为eax的密码值"
ret
inputerror:
msg "您没有输入4字节机器码,脚本即将终止"
ret
error:
msg "Error,无法找到特征码,估计不是彩虹狗壳或者该狗壳版本大于等于4.0"
ret
好了,有了这个脚本,可以方便算出程序用来解码的密码了。
我们现在拿ynwtjhvtk上传的计算器来开个刀。
先运行下脚本,在脚本弹出的对话框中要求输入数据,由于是win自带的计算器,什么语言就不用说了,原始的oep处的字节是6A7068E0(这个比较特殊,我在这里就偷个懒,至于怎么判断程序是什么语言写的,相信大家方法比我多的多),OK,继续
此时脚本产生一文件里面记录了在eax处的密码,并记录下此时eip的值,呵呵,其实就是oep,现在是乱码由于没有正确解码,等下就清晰了,把生成的文件先放一边等下用到。
OK,现在重新载入程序载入来到
01031FAC > $ 60 PUSHAD ; (initial cpu selection)
01031FAD $ 55 PUSH EBP
01031FAE . 8BEC MOV EBP,ESP
01031FB0 . 81EC 54030000 SUB ESP,354
01031FB6 . 53 PUSH EBX
01031FB7 . 56 PUSH ESI
01031FB8 . 57 PUSH EDI
01031FB9 . C685 F4FEFFFF>MOV BYTE PTR SS:[EBP-10C],0
01031FC0 . C685 F5FEFFFF>MOV BYTE PTR SS:[EBP-10B],0
01031FC7 . C685 F6FEFFFF>MOV BYTE PTR SS:[EBP-10A],0
01031FCE . C685 F7FEFFFF>MOV BYTE PTR SS:[EBP-109],0
01031FD5 . 8DBD F8FEFFFF LEA EDI,DWORD PTR SS:[EBP-108]
01031FDB . 33C0 XOR EAX,EAX
01031FDD . B9 3F000000 MOV ECX,3F
下断bp ExitProcess(因为他这个做的没有提示,如果有提示也可以下断bp MessageBox)
堆栈内容如下:
0012FCA8 01022E3A /CALL 到 ExitProcess 来自 加壳后CA.01022E37
0012FCAC 00000001 \ExitCode = 1
0012FCB0 00000000
0012FCB4 7FFDE000
0012FCB8 0012FFB0
Ctrl+G 01022E3A
01022DC1 /0F84 84000000 JE 加壳后CA.01022E4B ;跳转,不然就over
01022DC7 |A1 38D00201 MOV EAX,DWORD PTR DS:[102D038]
01022DCC |48 DEC EAX
01022DCD |8BC8 MOV ECX,EAX
01022DCF |8D0480 LEA EAX,DWORD PTR DS:[EAX+EAX*4]
01022DD2 |8D0480 LEA EAX,DWORD PTR DS:[EAX+EAX*4]
01022DD5 |8D0441 LEA EAX,DWORD PTR DS:[ECX+EAX*2]
01022DD8 |8D0445 10C00201 LEA EAX,DWORD PTR DS:[EAX*2+102C010]
01022DDF |05 14060000 ADD EAX,614
01022DE4 |8985 ACFEFFFF MOV DWORD PTR SS:[EBP-154],EAX
01022DEA |833D E2C50201 0>CMP DWORD PTR DS:[102C5E2],0
01022DF1 |74 27 JE SHORT 加壳后CA.01022E1A
01022DF3 |A1 5CCB0201 MOV EAX,DWORD PTR DS:[102CB5C]
01022DF8 |8985 50FDFFFF MOV DWORD PTR SS:[EBP-2B0],EAX
01022DFE |6A 40 PUSH 40
01022E00 |B8 10C00201 MOV EAX,加壳后CA.0102C010
01022E05 |05 D6050000 ADD EAX,5D6
01022E0A |50 PUSH EAX
01022E0B |8B85 ACFEFFFF MOV EAX,DWORD PTR SS:[EBP-154]
01022E11 |50 PUSH EAX
01022E12 |6A 00 PUSH 0
01022E14 |FF95 50FDFFFF CALL DWORD PTR SS:[EBP-2B0]
01022E1A |C705 40CB0201 0>MOV DWORD PTR DS:[102CB40],1
01022E24 |833D 40D00201 0>CMP DWORD PTR DS:[102D040],0
01022E2B |74 0F JE SHORT 加壳后CA.01022E3C
01022E2D |A1 64CB0201 MOV EAX,DWORD PTR DS:[102CB64]
01022E32 |8945 FC MOV DWORD PTR SS:[EBP-4],EAX
01022E35 |6A 01 PUSH 1
01022E37 |FF55 FC CALL DWORD PTR SS:[EBP-4]
01022E3A |EB 0F JMP SHORT 加壳后CA.01022E4B
01022E3C |6A 01 PUSH 1
01022E3E |FF15 F0F10201 CALL DWORD PTR DS:[102F1F0] ; kernel32.GetCurrentProcess
01022E44 |50 PUSH EAX
01022E45 |FF15 F4F10201 CALL DWORD PTR DS:[102F1F4] ; kernel32.TerminateProcess
01022E4B \A1 3ECA0201 MOV EAX,DWORD PTR DS:[102CA3E]
01022E50 3305 8CC00201 XOR EAX,DWORD PTR DS:[102C08C]
01022E56 A3 4CE00201 MOV DWORD PTR DS:[102E04C],EAX
01022E5B A1 4CE00201 MOV EAX,DWORD PTR DS:[102E04C]
01022E60 A3 C6C20201 MOV DWORD PTR DS:[102C2C6],EAX
01022E65 8D85 84FEFFFF LEA EAX,DWORD PTR SS:[EBP-17C]
01022E6B A3 58E00201 MOV DWORD PTR DS:[102E058],EAX
01022E70 C705 54E00201 0>MOV DWORD PTR DS:[102E054],0
01022E7A C705 5CE00201 0>MOV DWORD PTR DS:[102E05C],8
01022E84 E8 0C320000 CALL 加壳后CA.01026095
01022E89 8985 ECFEFFFF MOV DWORD PTR SS:[EBP-114],EAX
01022E8F 83BD ECFEFFFF 0>CMP DWORD PTR SS:[EBP-114],0
01022E96 75 12 JNZ SHORT 加壳后CA.01022EAA //不让他跳,否则over
01022E98 A1 36CA0201 MOV EAX,DWORD PTR DS:[102CA36]
01022E9D 3385 85FEFFFF XOR EAX,DWORD PTR SS:[EBP-17B]
01022EA3 A3 3ACA0201 MOV DWORD PTR DS:[102CA3A],EAX //eax值放的就是关键的密码了,如果错误就不能正确解码
01022EA8 EB 05 JMP SHORT 加壳后CA.01022EAF
01022EAA E9 47040000 JMP 加壳后CA.010232F6
01022EAF ^ E9 B8F4FFFF JMP 加壳后CA.0102236C
好的,重新加载程序,对01022DC1下断,如上提示,来到
01022EA3 A3 3ACA0201 MOV DWORD PTR DS:[102CA3A],EAX //eax值放的就是关键的密码了,如果错误就不能正确解码
呵呵,打开刚才脚本生成的密码E893A7B3
此时需要把E8放到最后,至于什么原因我也不懂正确的密码是(有时候没有乱,例如vb写的程序,他次序就是正确的vc7写的,要把换下首字节到尾部,反正最多也只不过是12种情况了,嘿嘿,这里就麻烦大家了,我又把vc和vb归纳出来了):93A7B3E8
刚才说到,来到01022EA3这一行,修改下eax值为93A7B3E8,OK,记得刚才的记录下了oep吗?嘿嘿,现在直接Ctrl+G到oep去F4,看到什么
01012475 6A 70 PUSH 70
01012477 68 E0150001 PUSH 加壳后CA.010015E0
0101247C E8 47030000 CALL 加壳后CA.010127C8
01012481 33DB XOR EBX,EBX
01012483 53 PUSH EBX
01012484 8B3D B8E00201 MOV EDI,DWORD PTR DS:[102E0B8] ; 加壳后CA.0102BE37
0101248A FFD7 CALL EDI
0101248C 66:8138 4D5A CMP WORD PTR DS:[EAX],5A4D
01012491 75 1F JNZ SHORT 加壳后CA.010124B2
01012493 8B48 3C MOV ECX,DWORD PTR DS:[EAX+3C]
01012496 03C8 ADD ECX,EAX
01012498 8139 50450000 CMP DWORD PTR DS:[ECX],4550
0101249E 75 12 JNZ SHORT 加壳后CA.010124B2
010124A0 0FB741 18 MOVZX EAX,WORD PTR DS:[ECX+18]
010124A4 3D 0B010000 CMP EAX,10B
010124A9 74 1F JE SHORT 加壳后CA.010124CA
010124AB 3D 0B020000 CMP EAX,20B
010124B0 74 05 JE SHORT 加壳后CA.010124B7
010124B2 895D E4 MOV DWORD PTR SS:[EBP-1C],EBX
010124B5 EB 27 JMP SHORT 加壳后CA.010124DE
010124B7 83B9 84000000 0>CMP DWORD PTR DS:[ECX+84],0E
010124BE ^ 76 F2 JBE SHORT 加壳后CA.010124B2
010124C0 33C0 XOR EAX,EAX
马上dump下,修复下IAT,运行下,发现不能运行
用OD载入,发现程序被偷的地方很多,每调用一次api壳都会得到一次控制权
可能是stolen code代码中的anti
下断bp ExitProcess
堆栈如下:
0012FD64 0102138E /CALL 到 ExitProcess 来自 dumped_.0102138B
0012FD68 00000001 \ExitCode = 1
0012FD6C 0102BE37 dumped_.0102BE37
0012FD70 FFFFFFFF
Ctrl+G来到0102138E
01021378 817D F4 0301000>CMP DWORD PTR SS:[EBP-C],103
0102137F 74 0D JE SHORT dumped_.0102138E //anti改为jmp
01021381 A1 64CB0201 MOV EAX,DWORD PTR DS:[102CB64]
01021386 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
01021389 6A 01 PUSH 1
0102138B FF55 FC CALL DWORD PTR SS:[EBP-4]
0102138E 7A 03 JPE SHORT dumped_.01021393
01021390 7B 01 JPO SHORT dumped_.01021393
01021392 B6 FF MOV DH,0FF
01021394 15 94F10201 ADC EAX,dumped_.0102F194
01021399 8945 D8 MOV DWORD PTR SS:[EBP-28],EAX
0102139C 833D C4DF0201 0>CMP DWORD PTR DS:[102DFC4],0
将je改为jmp去掉anti,保存文件,OK,软件正常运行,收工。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!