• 标 题:菜鸟的一篇拙文 (6千字)
  • 作 者:八鸟@
  • 时 间:2002-2-16 17:23:24
  • 链 接:http://bbs.pediy.com

学习pj也有二十几天了,头一次遇上vb程序,而初次接触的感觉真叫人头疼。先说明一下,我对vb的bp函数,处理形式,以及常用判断方式一窍不通。但菜鸟有菜鸟的方法。下面就介绍我是怎么KO它的(格斗游戏打多了)。:)    当然可能犯许多错误,欢迎指出,高手勿笑。

    软件名称:OverNimble Localize Plus 1.2
    简    介:说明上写:“查找 ASCII 所生成的对照文件的扩展名定为“.a.txt”,请尽量保留,因为对照表文件除了扩展名用来标示类型外,没有其它的方法。对 PE 文件,使用 VA 方式查找可以增加准确率,而且可以查找其它语系的程序(如中文、日文)。”
    因为非注册用户第一个功能就不可使用不能不让人光火,虽然它只有100多k。
    使用工具:trw1.23;hiew(我也只有这两件)
 
    首先运行主程序,打开注册窗口,键入用户名和注册号(废话),用trw设断:bpx messageboxa,bpx messageboxexa,bpx getdlgitemint,bpx getdlgitemtexta......
    什么什么,一个都没拦下!? 岂有此理,用“万能断点”!!bpx hmemcpy,ok了,不愧是万能的。往下一看,妈呀~怎么都是msvbvm50!__vbaXXXXX,跟进去就到了它的领空了,它调用了好几次我都找不到注册码,因为我不清楚是什么意思,只能放弃追注册码了。:(
    现在从它的警告窗口着手,非注册用户按它主界面上的“查找ASCII”按钮就会弹出非注册用户不能使用的nag。我下了好多断点都没拦着它,前面说过了I'm菜鸟。后来想到了bpx lockmytask,在窗口弹出后我们看到:

:00413923 83C40C                  add esp, 0000000C      (从这儿开始,如不对再向上)
:00413926 8B9A6C030000            mov ebx, dword ptr [edx+0000036C]
:0041392C 57                      push edi
:0041392D FFD3                    call ebx
:0041392F 50                      push eax
:00413930 8D45E4                  lea eax, dword ptr [ebp-1C]
:00413933 50                      push eax
:00413934 FF15B8044300            Call dword ptr [004304B8]
:0041393A 8BF0                    mov esi, eax
:0041393C 8D956CFFFFFF            lea edx, dword ptr [ebp+FFFFFF6C]
:00413942 52                      push edx
:00413943 56                      push esi
:00413944 8B0E                    mov ecx, dword ptr [esi]
:00413946 FF91F0000000            call dword ptr [ecx+000000F0]
:0041394C 85C0                    test eax, eax
 
                            .
                            .
                            .
                            .
:00413A79 6A00                    push 00000000
:00413A7B 50                      push eax
:00413A7C C745A008400000          mov [ebp-60], 00004008
:00413A83 FF15C0044300            Call dword ptr [004304C0]---这里出现警告窗口

ok,拦下就好办了,又是调用msvbvm50!XXXX,看不懂啦。我们把光条往上拉,再按那个按钮,程序在00413923拦下了。我们知道现在下面有好多跳转能够跳过这个call,肯定有一个是判断注册标记的。来,F10跟进.....

:0041394E 7D12                    jge 00413962 ----这里没有过00413a83
:00413950 68F0000000              push 000000F0
:00413955 6834AD4000              push 0040AD34
:0041395A 56                      push esi
:0041395B 50                      push eax
:0041395C FF156C044300            Call dword ptr [0043046C]
:00413962 8BB56CFFFFFF            mov esi, dword ptr [ebp+FFFFFF6C]
:00413968 8D4DE4                  lea ecx, dword ptr [ebp-1C]
:0041396B FF15F8064300            Call dword ptr [004306F8]
:00413971 0FBFC6                  movsx eax, si
:00413974 85C0                    test eax, eax
:00413976 0F8430010000            je 00413AAC  ----让这里....(jump)^_^            :0041397C 0F8E3C010000            jle 00413ABE
:00413982 83F803                  cmp eax, 00000003
:00413985 0F8F33010000            jg 00413ABE:00413A76 8D45A0               

  抱着运气试试,到00413976时下命令a,键入jnz 00413aac,强迫它跳,g!
没想到一下子成功了,出现分析完毕窗口。我想,编这个程序员也许也是菜鸟,在软件运行中居然不断给出提示,包括注册名没填啦什么的,这可是大忌,但对我们来说好事。现在运行command——hiew...什么什么,找到地址不对!?一定是加了壳,用trw load它,果然下面写着upx1+...领空。可菜鸟不会脱壳,不要紧,我们下命令d413976,看到?? ?? ??.....说明程序还未解压,我们继续跟踪,直到:

0043B01C: 8B02                        mov        eax,[edx]
0043B01E: 83C204                      add        edx,004 ;""
0043B021: 8907                        mov        [edi],eax
0043B023: 83C704                      add        edi,004 ;""
0043B026: 83E904                      sub        ecx,004 ;""
0043B029: 77F1                        ja        .00043B01C  -------- (1)
0043B02B: 01CF                        add        edi,ecx
0043B02D: E9A9000000                  jmp        .00043AF7E  -------- (2)
0043B032: 5E                          pop        esi
0043B033: 89F7                        mov        edi,esi
0043B035: B96B020000                  mov        ecx,00000026B ;"  k"
0043B03A: 8A07                        mov        al,[edi]

从上面开始到(2)跳转是一个循环,我们把光条拖到43b032上按F7,看到413976已经有数据了,我们u413976:

00413976 0F8430010000            je 00413AAC                                              0041397C 0F8E3C010000            jle 00413ABE
00413982 83F803                  cmp eax, 00000003
                          .
                          .
                          .
就是我们要改的数据,且没有加密,在hiew下找一块空地如下,现在就在(2)上打补丁,让它j到这块空地的基址:

0043B0D7: 0000                        add        [eax],al
0043B0D9: 0000                        add        [eax],al
0043B0DB: 66C705763941000F85          mov        w,[000413976],0850F ;"?"
0043B0E4: E995FEFFFF                  jmp        .00043AF7E  -------- (1)
0043B0E9: 0000                        add        [eax],al
0043B0EB: 0000                        add        [eax],al
0043B0ED: 0000                        add        [eax],al

本来都是0000      add    [eax],al,那两行是自己加进去的,注意43b0e4的意思是mov word ptr[413976],850f,用hiew的同胞们要小心,最后再让它j回原本要跳的地址。
ok了,运行此vb程序,按了ascII按钮没有了刚才的提示,正常工作了,和已注册不是一样吗:),可惜此软件太戆,vb实在编不出什么好东西(纯属个人观点),而只会给ck带来麻烦,以后microsoft会越发把编程倾向简单化,不希望程序员去了解底层操作。何况vb的用途越来越难开发,因为功能本身定制好了,只会用控件进行“搭积木”式编程,代码短短几十行,编个病毒吧,难道还带个1M的运行库给别人?而且兼容性越来越差,据说vb7版本mic为了赶borland的delphi,竟忽视了语言本身的兼容性!!显然是不可接受的,这就是大多vb程序员改行delphi的另一原因。