本帖最后由 没有细胞的人 于 2020-2-26 10:30 编辑
首先这个方法非常简单,求大神嘴下留情!
话不多说,开整!
首先看一下这个软件“RegisterMe.Oops.exe”
打开后会有一个弹窗,提示我们,让我们移除这个窗口
接下来,则出现了这个程序主界面
关掉后,又会出现一个弹窗
然后,就没有然后了,,
我们今天重点来讲去除第一个弹框
既然明白了,那就开始吧!
先查下壳
嗯,没壳(注意!“MASM32 / TASM32”是一个编译器,他不是壳)
好,直接拖进OD
嗯,可以看到这个程序其实非常简单,短短二十几行代码,要破解也是非常容易的!
但是,我们还是要分析一下,
我们来看第一个弹窗
就是这个东东
00401000 >/$ 6A 00 push 0x0 ; /pModule = NULL
00401002 |. E8 0D020000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
可以看到,开始调用了GetModuleHandleA函数,获取程序句柄,然后将获取的模块句柄,存放到eax寄存器当中
0040100C |. 83F8 00 cmp eax,0x0
0040100F |. 74 13 je short Register.00401024
00401011 |. 6A 00 push 0x0 ; /Style = MB_OK|MB_APPLMODAL
00401013 |. 68 7D304000 push Register.0040307D ; |Title = "Register Me"
00401018 |. 68 34304000 push Register.00403034 ; |Text = "Remove the nags to register
This will make program fully registered :))"
0040101D |. 6A 00 push 0x0 ; |hOwner = NULL
0040101F |. E8 C6010000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401024 |> 6A 0A push 0xA
接下来有一个cmp,来比较eax和0,是否相等,但是我们知道,前面程序调用了GetModuleHandleA来获取句柄并存放到eax寄存器当中,既然如此,eax就不可能为0,也就是说,只要这个程序启动了,那么它就一定会跳转,至于为什么程序员要这么写,,,emmmm,咋也不懂,咋也不敢问{:301_1008:} 。(程序员就是让我们去除掉这个弹窗。)
emmmm,那就太简单了,有很多方法可以做到,就比如把je nop掉啊、用mov指令给eax赋值为0啊、直接nop那个call啊等等
但是,今天我们要用一种特殊的方式来实现去除这个弹窗
00401024 |> \6A 0A push 0xA
我们可以看到,在这条指令上方的全部都是没有用的(其中也包括弹出第一个弹窗),那么我们就可以直接修改程序的入口点,把程序入口点设置在00401024的位置,就可以实现去除第一个弹窗啦!那么怎么做嘞?
我们可以点击OD上面的那个“M”(我也不知道这个M代表啥,有知道的大佬阔不阔以告诉我,嘿嘿)
然后在这里找到PE的文件头部,就是这个00400000,然后双击进来
箭头指的那个,标志着PE结构的开始
这里不得不提一下,为什么左边是C0000000而右边则是000000C0呢?
其实左边是机器读的数据,而右边使我们正常人类读的数据,机器喜欢把第一个字节放在最后,第二个字节放到倒数第二个位置······等等,就是把各字节位置倒过来而已,就比如正常人读的是12 34 56 78,而机器读的则是78 56 34 12,应该能理解吧,,,
继续,我们知道PE文件头是400000,这个Offset to PE signature就表示真正指向PE头的一个偏移地址,在这里它是C0,所以真正的PE头就是00400000+C0=004000C0
那么直接ctrl+G跟随004000C0,然后就来到了PE头部
可以看到有一个这个东东
004000E8 00100000 DD 00001000 ; AddressOfEntryPoint = 0x1000
这个AddressOfEntryPoint就是程序指向的就是程序的入口点,也就是PE入口点加上这个AddressOfEntryPoint就是程序入口点,也就是00400000+1000=00401000
那么就是说,我们要改程序的入口点,就可以改AddressOfEntryPoint的值即可。好,我们记一下它的地址004000E8
我们回到反汇编窗口
我们再来看代码
00401000 >/$ 6A 00 push 0x0 ; /pModule = NULL
00401002 |. E8 0D020000 call <jmp.&KERNEL32.GetModuleHandleA> ; \GetModuleHandleA
00401007 |. A3 1C314000 mov dword ptr ds:[0x40311C],eax
0040100C |. 83F8 00 cmp eax,0x0
0040100F |. 74 13 je short Register.00401024
00401011 |. 6A 00 push 0x0 ; /Style = MB_OK|MB_APPLMODAL
00401013 |. 68 7D304000 push Register.0040307D ; |Title = "Register Me"
00401018 |. 68 34304000 push Register.00403034 ; |Text = "Remove the nags to registerThis will make program fully registered :))"
0040101D |. 6A 00 push 0x0 ; |hOwner = NULL
0040101F |. E8 C6010000 call <jmp.&USER32.MessageBoxA> ; \MessageBoxA
00401024 |> 6A 0A push 0xA
00401026 |. FF35 20314000 push dword ptr ds:[0x403120]
0040102C |. 6A 00 push 0x0
0040102E |. FF35 1C314000 push dword ptr ds:[0x40311C]
00401034 |. E8 19000000 call Register.00401052
00401024地址之前都是我们不需要的,所以我们可以将入口地址改为00401024这个地址,也就是将AddressOfEntryPoint改为1024
那么我们就可以在左下角那里按ctrl+G,来到004000E8处
可以看到前面有00 10,它表示的就是1000(因为字节倒过来了,前面说过)
我们就可以选中00 10,然后空格,将它改为24 10即可
然后右键-复制到可执行文件-保存文件即可,打开看看,是不是程序开始没有那个弹框了呢
这样我们就成功了
第二个窗口我就不说了,太简单了,把call nop掉就好了
另外,本人纯小白,请大佬别喷{:301_973:}
谢各位{:301_978:}
最后,附上软件链接:https://www.lanzouj.com/i9o9txe |