有个蛮不错的软件,注册费很便宜,不注册也只是在第一次打开时弹个框提示一下。由于很精致,就想看看其保护方式,发现居然没壳,用ollydbg查看找注册码,发现不好爆破。于是想找其弹框的函数,但CreateDialog等都断不下,最后用ShowWindow才断下,检查后知道是DialogBoxParamW。
找到相关的代码后就想直接用UE来处理,结果找不到特征码。。。于是直接在ollydbg中修改,再另存。运行时经常会出错!
对修改后的程序再动态调试发现,原先写的一堆90(NOP)有些变成了其他的指令,于是换成在前端写JMP,这才不出错了。
反复对比各个地址和指令后,考虑到该程序的基址会动态变化,所以Call指令,一些变量的mov等对应的地址其实是会变的,可能程序文件中存的只是个占位符,程序在运行时才把相关的地址填上去。
如下:
002F6EAA |. 8B0D 74C04000 mov ecx, dword ptr [40C074] ;
002F6EB0 |. 52 push edx ; /lParam
002F6EB1 |. 68 40E22600 push 0026E240 ; |DlgProc = xxxx.0026E240
002F6EB6 |. 50 push eax ; |hOwner
002F6EB7 |. 68 D6000000 push 0D6 ; |pTemplate = D6
002F6EBC |. 51 push ecx ; |hInst => 00250000
002F6EBD |. FF15 68D73900 call dword ptr [<&USER32.DialogBoxPar>; \DialogBoxParamW
002F6EC3 |. 5E pop esi ; 0019F6F8
002F6EC4 |. C2 0800 retn 8
002F6EC7 |> 6A 0E push 0E ; /Error = ERROR_OUTOFMEMORY
002F6EC9 |. FF15 14D43900 call dword ptr [<&KERNEL32.SetLastErr>; \SetLastError
002F6ECF |. 83C8 FF or eax, FFFFFFFF
002F6ED2 |. 5E pop esi
002F6ED3 \. C2 0800 retn 8