某软件去Nag例子
本帖最后由 tianlong11 于 2010-9-25 17:57 编辑【文章标题】: 某软件去Nag例子
【文章作者】: whiley
【作者邮箱】: whiley@163.com
【作者主页】: 无
【作者QQ号】: 保留
【软件名称】: 不清楚
【下载地址】: 自己搜索下载
【作者声明】: 思路来自天草的教程,没什么可说的了
--------------------------------------------------------------------------------
【详细过程】
天草教程原来的一个很简单的例子,去掉某软件的Nag
首先OD打开软件,用到F12暂停法
看到以下代码,不管它,F9运行
00405095 K> $6A 74 push 74
00405097 .68 68674000 push KeyGen.00406768
0040509C .E8 FF020000 call KeyGen.004053A0
004050A1 .33DB xor ebx,ebx
004050A3 .895D E0 mov dword ptr ss:,ebx
004050A6 .53 push ebx ; /pModule => NULL
004050A7 .8B3D 68604000 mov edi,dword ptr ds:[<&KERNEL32.GetModuleHa>; |kernel32.GetModuleHandleA
004050AD .FFD7 call edi ; \GetModuleHandleA
004050AF .66:8138 4D5A cmp word ptr ds:,5A4D
F12暂停,然后Alt+K调用堆栈,看到以下代码
0012FE50 77D19418 包含ntdll.KiFastSystemCallRet USER32.77D19416 0012FE84
0012FE54 77D2DBA8 USER32.WaitMessage USER32.77D2DBA3 0012FE84
0012FE88 77D2593F USER32.77D2DA19 USER32.77D2593A 0012FE84
0012FEB0 77D25981 USER32.77D25889 USER32.77D2597C 0012FEAC
0012FED0 77D3B158 USER32.DialogBoxIndirectParamAorW USER32.77D3B153 0012FECC
0012FEFC 00402125 包含USER32.77D3B158 KeyGen.00402123 0012FEF8
0012FF1C 0040521A ? KeyGen.00402090 KeyGen.00405215
其实可以直接双击这行代码,直接到关键位置,但是为了...
0012FEFC 00402125 包含USER32.77D3B158 KeyGen.00402123
我们双击或右键显示调用,这行代码
0012FF1C 0040521A ? KeyGen.00402090 KeyGen.00405215
就来到了,这里
00405209 . /EB 03 jmp short KeyGen.0040520E
0040520B > |6A 0A push 0A
0040520D . |58 pop eax
0040520E > \50 push eax
0040520F .56 push esi
00405210 .53 push ebx
00405211 .53 push ebx
00405212 .FFD7 call edi
00405214 .50 push eax
00405215 .E8 76CEFFFF call KeyGen.00402090 ;调用对话框的CALL
0040521A .8BF0 mov esi,eax
0040521C .8975 C0 mov dword ptr ss:,esi
0040521F .395D E4 cmp dword ptr ss:,ebx
00405222 .75 07 jnz short KeyGen.0040522B
00405224 .56 push esi ; /status
00405225 .FF15 C8604000 call dword ptr ds:[<&MSVCR71.exit>] ; \exit
0040522B >FF15 CC604000 call dword ptr ds:[<&MSVCR71._cexit>] ;MSVCR71._cexit
然后我们F7,进入00405215 调用对话框的CALL,来到
00402090 /$56 push esi
00402091 |.57 push edi
00402092 |.6A 00 push 0 ; /pModule = NULL
00402094 |.FF15 68604000 call dword ptr ds:[<&KERNEL32.GetModuleHandl>; \GetModuleHandleA
0040209A |.68 6293BC00 push 0BC9362 ; /Color = RGB(98.,147.,188.)
0040209F |.A3 E0804000 mov dword ptr ds:,eax ; |
004020A4 |.FF15 30604000 call dword ptr ds:[<&GDI32.CreateSolidBrush>>; \CreateSolidBrush
004020AA |.A3 E8804000 mov dword ptr ds:,eax
004020AF |.A1 E0804000 mov eax,dword ptr ds:
004020B4 |.6A 67 push 67 ; /RsrcName = 103.
004020B6 |.50 push eax ; |hInst => NULL
004020B7 |.FF15 54614000 call dword ptr ds:[<&USER32.LoadIconA>] ; \LoadIconA
004020BD |.8B0D E0804000 mov ecx,dword ptr ds:
004020C3 |.6A 65 push 65 ; /RsrcName = 101.
004020C5 |.51 push ecx ; |hInst => NULL
004020C6 |.A3 EC804000 mov dword ptr ds:,eax ; |
004020CB |.FF15 50614000 call dword ptr ds:[<&USER32.LoadCursorA>] ; \LoadCursorA
004020D1 |.68 E0104000 push KeyGen.004010E0
004020D6 |.68 A0104000 push KeyGen.004010A0
004020DB |.68 60104000 push KeyGen.00401060
004020E0 |.68 50104000 push KeyGen.00401050
004020E5 |.68 00104000 push KeyGen.00401000
004020EA |.A3 E4804000 mov dword ptr ds:,eax
004020EF |.E8 57120000 call KeyGen.0040334B
004020F4 |.6A 00 push 0
004020F6 |.6A 68 push 68
004020F8 |.E8 980D0000 call KeyGen.00402E95
004020FD |.8BF0 mov esi,eax
004020FF |.56 push esi
以上的CALL里的代码我们都没必要管,因为这是个SDK写的程序,用Win32汇编写过程序的朋友都知道是什么
00402100 |.90 nop
00402101 |.90 nop
00402102 |.90 nop
00402103 |.90 nop
00402104 |.90 nop
00402105 |.8B15 E0804000 mov edx,dword ptr ds:
0040210B |.8B3D 48614000 mov edi,dword ptr ds:[<&USER32.DialogBoxPara>;USER32.DialogBoxParamA
00402111 |.83C4 20 add esp,20
00402114 |.6A 00 push 0 ; /lParam = NULL
00402116 |.68 B01E4000 push KeyGen.00401EB0 ; |DlgProc = KeyGen.00401EB0
0040211B |.6A 00 push 0 ; |hOwner = NULL
0040211D |.68 E8030000 push 3E8 ; |pTemplate = 3E8
00402122 |.52 push edx ; |hInst => NULL
00402123 |.FFD7 call edi ; \弹出对话框让你选择是还是否
以上调用的是DialogBoxparmA函数来显示对话框
00402125 |.A1 F0834000 mov eax,dword ptr ds: ;如果选择的是,那么这里就会给eax赋值1,如果是否那就是0
0040212A |.85C0 test eax,eax
0040212C |.74 16 je short KeyGen.00402144 ;这里就不会跳
0040212E |.A1 E0804000 mov eax,dword ptr ds:
如果不跳的话,就会单步一直走到主对话框这里,就显示了,那很明显了,我们去掉对话
框,这里我们有两个选择。
第一NOP掉00402123 这个CALL和 0040212C jeNop掉之后就会慢慢走到主程序这里。
第二NOP掉00402123 这个CALL和 00402125 mov eax,dword ptr ds: 这段代码我们
修改成 mov eax,1即可,为什么修改成1,因为eax = 1的话,je就不跳,eax = 0的话就跳
我们的目的就是不让它跳。
00402133 |.6A 00 push 0 ; /lParam = NULL
00402135 |.68 901A4000 push KeyGen.00401A90 ; |DlgProc = KeyGen.00401A90
0040213A |.6A 00 push 0 ; |hOwner = NULL
0040213C |.68 D0070000 push 7D0 ; |pTemplate = 7D0
00402141 |.50 push eax ; |hInst => NULL
00402142 |.FFD7 call edi ; \主对话框
00402144 |>8B0D E8804000 mov ecx,dword ptr ds:
0040214A |.51 push ecx ; /hObject => NULL
0040214B |.FF15 3C604000 call dword ptr ds:[<&GDI32.DeleteObject>] ; \DeleteObject
00402151 |.56 push esi
00402152 |.E8 970D0000 call KeyGen.00402EEE
00402157 |.83C4 04 add esp,4
0040215A |.6A 00 push 0
0040215C |.E8 6F000000 call KeyGen.004021D0
00402161 |.6A 00 push 0 ; /ExitCode = 0
00402163 \.FF15 6C604000 call dword ptr ds:[<&KERNEL32.ExitProcess>]; \ExitProcess
00402169 5F db 5F ;CHAR '_'
0040216A 5E db 5E ;CHAR '^'
0040216B CC int3
0040216C CC int3
0040216D CC int3
0040216E CC int3
0040216F CC int3
00402170 $C3 retn
--------------------------------------------------------------------------------
【版权声明】: 没啥版权之称,在天草教程里学到的东西,所以.......
2010年09月25日 17:43:39 天草被我删了。郁闷。 哈哈,沙发,沙发 不错!又可以学习了……
页:
[1]