首先拿到程序,先跑一遍,看看大致的流程.
程序一启动会弹出一个NAG,要去除它.
一般来说,只要是启动窗口都会调用函数名字里有MessageBox的函数.于是在跨模块调用中搜索:
可以发现,这些函数都是user32.dll中的函数,属于系统函数,因为VB的特性,它最终会调用系统函数,所以在此处断应该是没有问题的.
起初,在MessageBoxA/W这两个函数中下断点,结果都没有断下来.很疑惑,又在MessageBoxIndirectA中下断,发现停了下来,在浏览器搜索得知,此函数也可以创建消息框.
我最开始的思路是,继续往里走,直到看见最里层的调用,结果走在里层发现会循环调用<user32.TranslateMessage>等函数.然后调用<win32u.NtUserShowWindow>初始化窗口,再加载窗口
于是返回到调用这个函数的外面.再次观察,一般来说,若被调用的函数传入的参数没有使用到外面的堆栈,调用函数后也没有需要用到函数内的flag值,直接将函数nop掉是可以成功的.
也有可能在编译完程序后再使用汇编代码将程序进行修改.
不管怎么说,先打算尝试一下.首先观察在函数执行前后寄存器有什么变化(并且查询此函数的返回值),了解到此函数:
并且实际操作中:
有实际意义的寄存器中EAX ECX EDX寄存器发生了变化,继续往下执行,发现后面的代码在执行过程中并没有使用到ECX.因此判断EAX即为返回值,EDX 始终都返回0x460000.
因此只需要:
修改后直接运行,正常没有弹窗.
但是,由于这个方法直接阻断了其它函数的调用,因此在点击 Register Me的时候同样不会弹出窗口告诉你是否注册正确.
因此需要换一种方法,由于本方法没有采用书上直接搜索rtcMsgBox的方法,因此需要耗费时间找到MsgBox函数.大致的方法就是直接步过,如停下来了,就在此处下断,重启程序,运行到下断的地方,
步进,再接着步过.直到最后找到想要的函数.
有趣的是,在定位到想要的函数的时候,发现程序竟然断在了用户代码领空.
同样在运行该函数之前和之后做比较,edx ecx eax均改变,但是edx ecx 在执行完之后被立刻赋予新值,故只有eax是返回值.但堆栈有变化,因此需要进入函数重新修改.
继续运行,就成功修改了.
直接搜索字符串,找到strcmp,下断点,运行:
可知,密钥是 I'mlena151.
总体来说,这是一个很简单的程序