近日需将一rm转成mpeg,网上遍寻得此软件,可惜要注册收钱.祭出peid,检查为MoleBox v2.0壳,小子孤陋寡闻,未尝见过。好你个王八,以为披个马甲偶就认你是乌龟啊!立马调出windbg动态追踪,IDA静态排查,步骤如下:
用IDA载入该软件,不需要看反汇编结果,直接degugger菜单->start process,出一消息框,确认,程序就跑起来出现注册窗口了。随便填个用户名:MissileCat,密码:20080415,点确认,出错误用户消息框。
degugger菜单->take memory snapshot选all segments取内存影象。
结束程序。
IDA别关,开windbg
菜单启动Ultra RM Converter软件
命令: g 这时将出现注册窗口,点debug菜单->break断下程序
命令:bp peekmessagea "j(poi(poi(esp+4)+4)=0x201)'';'gc'"下消息断点,鼠标左键单击即断
命令:bp messageboxa 下对话框断点,出出错对话框即断
命令:g 继续运行
点用户名框准备输入用户名,此时会断下,不用管,再g,输入用户名:MissileCat,按tab继续输入密码:20080415 点注册,此时程序又断下,记下地址:
eax=00000001 ebx=77d1d7f9 ecx=00437c38 edx=0042d038 esi=0012ab4c edi=00000000
eip=77d1c96c esp=0012aab4 ebp=00437c6c iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
USER32!PeekMessageA:
77d1c96c 8bff mov edi,edi
命令:g 继续运行,此时又断:
eax=0043437c ebx=0012ab4c ecx=000806c4 edx=00ab0608 esi=0012ab4c edi=00437c38
eip=77d5058a esp=0012a434 ebp=0012abac iopl=0 nv up ei pl nz na po nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000202
USER32!MessageBoxA:
77d5058a 8bff mov edi,edi
关键了,打开windbg汇编窗口跟进:
按shift+F11跳出过程,在Ultra RM Converter那边点确认后,将跳出messageboxa API
程序来到这儿:
73d8de1d ff15b065dd73 call dword ptr [MFC42!_imp__MessageBoxA (73dd65b0)]
73d8de23 5e pop esi
73d8de24 c20c00 ret 0Ch
命令:s -a 1 0xfffffff "20080415" 查找密码地址
001576c8 32 30 30 38 30 34 31 35-00 00 00 00 00 00 00 00 20080415........
00373f38 32 30 30 38 30 34 31 35-00 f0 ad ba 0d f0 ad ba 20080415........
命令:ba r 1 0x373f38下断
点击错误对话框的确定后,再次点注册,在peekmessage中断后,会中断在这个位置
eax=0012a3c4 ebx=00000000 ecx=00000008 edx=7c92eb94 esi=000607e4 edi=00373f38
eip=77d32152 esp=0012a3ac ebp=0012a3d4 iopl=0 nv up ei pl nz na pe nc
cs=001b ss=0023 ds=0023 es=0023 fs=003b gs=0000 efl=00000206
USER32!GetWindowTextA+0x1f:
77d32152 8b4d08 mov ecx,dword ptr [ebp+8] ss:0023:0012a3dc=000607e4
打开反汇编窗口,连续按几次shift+f11跳出几个dll调用来到用户区域:
00413007 83c664 add esi,64h
看看反汇编情况为:
00413001 57 push edi
00413002 e87f290100 call image00400000+0x25986 (00425986)
00413007 83c664 add esi,64h
0041300a 56 push esi
IDA还没关吧 点jump 菜单下的jump to address ,输入00413002
0:00413000 dd 7FE85700h, 83000129h, 685664C6h, 404h, 2970E857h, 5E5F0001h
这是IDA刚dump下的内存区,也就是壳解压出来的代码
右键undifine那段东东,有一警告框,点确定
然后在00413002的位置右键点code,为什么呢,在windbg中我们已知道这就是一个call指令的地址
_0:00413002 call sub_425986
_0:00413007 add esi, 64h
_0:0041300A push esi
_0:0041300B push 404h
_0:00413010 push edi
_0:00413011 call sub_425986
_0:00413016 pop edi
_0:00413017 pop esi
_0:00413018 retn 4
在windbg的debug菜单点stop debug停止调试
在idapro _0:00413002 的位置设在这个位置上设硬件断点,方法是按f2,然后右键选Edit breakpoint 点hard break,然后在ida pro的debugger菜单下点运行,程序将断在
_0:00413002 call sub_425986
继续运行程序,输入用户名:MissileCat及密码:20080415,点注册后程序又中断,用f8跟进,遇到mfc42之类的东东就ctrl+f7跳出,直到
0:004130A8 lea esi, [ebx+64h] 又回到用户代码区
继续f8跟
_0:00413293 call sub_425A88 ; 显示出错对话框
好了 应该就是0:004130A8到_0:00413293这段代码有问题
在0:004130A8下断点,重新运行程序,点注册,直到在这个位置断下
然后f7单步跟,看一下其它的代码,因为只有这样才能看到一些解压的代码,不久后到了一个有趣的地方MBX@2A4@3C3238.___:00B11640 mov eax, large fs:0这东东不用说是一个she(结构化异常处理),这种玩意儿常用来欺骗调试器,小心了
看看代码,有戏:
MBX@2A4@3C3238.___:00B116E9 loc_B116E9: ; CODE XREF: sub_B11640+DE j
MBX@2A4@3C3238.___:00B116E9 mov al, [esp+ecx+3A0h+var_318]
MBX@2A4@3C3238.___:00B116F0 cmp al, 20h
MBX@2A4@3C3238.___:00B116F2 jz short loc_B11717
MBX@2A4@3C3238.___:00B116F4 test al, al
MBX@2A4@3C3238.___:00B116F6 jz short loc_B11717
MBX@2A4@3C3238.___:00B116F8 cmp al, 30h
MBX@2A4@3C3238.___:00B116FA jl short loc_B11700
MBX@2A4@3C3238.___:00B116FC cmp al, 39h
MBX@2A4@3C3238.___:00B116FE jle short loc_B11717
MBX@2A4@3C3238.___:00B11700
MBX@2A4@3C3238.___:00B11700 loc_B11700: ; CODE XREF: sub_B11640+BA j
MBX@2A4@3C3238.___:00B11700 cmp al, 61h
MBX@2A4@3C3238.___:00B11702 jl short loc_B11708
MBX@2A4@3C3238.___:00B11704 cmp al, 7Ah
MBX@2A4@3C3238.___:00B11706 jle short loc_B11717
MBX@2A4@3C3238.___:00B11708
MBX@2A4@3C3238.___:00B11708 loc_B11708: ; CODE XREF: sub_B11640+C2 j
MBX@2A4@3C3238.___:00B11708 cmp al, 41h
MBX@2A4@3C3238.___:00B1170A jl short loc_B11710
MBX@2A4@3C3238.___:00B1170C cmp al, 5Ah
MBX@2A4@3C3238.___:00B1170E jle short loc_B11717
判断我们的用户名是否为数字和字母
mov cl, [esp+eax+3A0h+var_318]
MBX@2A4@3C3238.___:00B11729 mov bl, [esp+eax+3A0h+var_110]
MBX@2A4@3C3238.___:00B11730 add cl, bl
MBX@2A4@3C3238.___:00B11732 mov [esp+eax+3A0h+var_214], cl
开始计注册码了,有兴趣的可以看看它是怎么加密的
我是没那兴趣了,点graph view看图表
00B11971 jnz loc_B119FA 这个跳转就是天堂和地狱的分别了,到这一点后
我直接看[esp+eax+3A0h+var_318]的位置,密码在那静静徜着呢:
:0012A138 var_318 db 30h
Stack[0000040C]:0012A139 db 32h ; 2
Stack[0000040C]:0012A13A db 34h ; 4
Stack[0000040C]:0012A13B db 42h ; B
Stack[0000040C]:0012A13C db 33h ; 3
Stack[0000040C]:0012A13D db 42h ; B
Stack[0000040C]:0012A13E db 31h ; 1
Stack[0000040C]:0012A13F db 36h ; 6
Stack[0000040C]:0012A140 db 0
转为字串就是:024B3B16
收工!
此文为学习目的,学偶这种没钱一族就当温习一下汇编知识,希望各位还是要尊重别人的劳动成果,有钱的还是买正版吧,
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!