写点东西,顺便申请邀请码,等得实在受不了了。每天都只涨一点,有时受不了下载点东西就没了。有些区还进不去。

易语言的krnln.fne总是喜欢自作主张,把当前目录设置为exe程序所在的目录.
到易语言官方论坛上提也没人管.

以前用Depends.exe查看编译后的exe,发现导入表里找不到你插入的API,
觉得可能是用LoadLibrary载入,再用GetProcAddress取函数地址,最后在调用的.
今天比较无聊,就想看看到底是不是这样.
所以刚刚用易语言写了个程序试试,就是程序开始调用MessageBoxA,然后就返回而已.
就用OD载入看,程序进入krnln.fne里偶然看到调用SetCurrentDirectoryA,
我就想起以前的问题:这该死的易语言总是取不到当前目录,怎么都是EXE所在目录.
我就想自己修改它,让程序开始时不自动修改当前目录.

代码:
100602CD    FF15 10A40D10   call    dword ptr [<&KERNEL32.GetModuleF>; kernel32.GetModuleFileNameA
100602D3    8D85 ECFDFFFF   lea     eax, dword ptr [ebp-214]
100602D9    6A 5C           push    5C
100602DB    50              push    eax
100602DC    E8 7CC40400     call    100AC75D
100602E1    8BF8            mov     edi, eax
100602E3    83C4 08         add     esp, 8
100602E6    85FF            test    edi, edi
100602E8    74 19           je      short 10060303
100602EA    8D95 ECFDFFFF   lea     edx, dword ptr [ebp-214]
100602F0    8D8E EC000000   lea     ecx, dword ptr [esi+EC]
100602F6    52              push    edx
100602F7    C607 00         mov     byte ptr [edi], 0
100602FA    E8 1B130600     call    100C161A
100602FF    47              inc     edi
10060300    57              push    edi
10060301    EB 12           jmp     short 10060315
10060303    8D8E EC000000   lea     ecx, dword ptr [esi+EC]
10060309    E8 5A110600     call    100C1468
1006030E    8D85 ECFDFFFF   lea     eax, dword ptr [ebp-214]
10060314    50              push    eax
10060315    8D8E F0000000   lea     ecx, dword ptr [esi+F0]
1006031B    E8 FA120600     call    100C161A
10060320    837B 2C 02      cmp     dword ptr [ebx+2C], 2
10060324    74 0F           je      short 10060335
10060326    8B86 EC000000   mov     eax, dword ptr [esi+EC]
1006032C    50              push    eax
1006032D    FF15 98A30D10   call    dword ptr [<&KERNEL32.SetCurrent>; kernel32.SetCurrentDirectoryA
10060333    EB 4C           jmp     short 10060381
用GetModuleFileNameA取exe所在文件名的的.再去掉exe文件名获得exe所在目录,再用SetCurrentDirectoryA修改的,
我再重新运行,发现从开始直到我在易语言写的代码都只有这个地方调用SetCurrentDirectoryA的.所以肯定是这里修改了当前

目录的.
我不清楚SetCurrentDirectoryA的参数是什么,到百度百科上看看
Declare Function SetCurrentDirectory Lib "kernel32" Alias "SetCurrentDirectoryA" (ByVal lpPathName As String) 

As Long
一个参数,所以上面的push eax 就肯定是他的参数了.那就一起改吧.仔细数数"50FF1598A30D10"一共14个,nop是90,就是7个90


但是OD里怎么修改文件,我不知道.我根本不会用OD.
所以我就记下地址,用C32ASM改.用反汇编模式打开跳到1006032C.然后打开对应的HEX编辑,50FF1598A30D10改成90909090909090


保存就ok了.
最后写个程序.用 取当前目录 (),
把他放到环境变量path的目录下面,我直接放到C:\WINDOWS\
之后就在cmd里运行他,返回的就是当前目录了.

然后我们开始测试下.
易语言代码:

为什么用图片?,因为复制成文本的看起来比较怪,而且看起来也不方便.
在压缩包里有源代码.

编译后复制到C:\WINDOWS\test.exe
没有修改krnln.fne之前的.

看看,当前目录明明是"D:\EL\该死的当前目录",但易语言他就是要自动改成exe所在目录.

然后把krnln.fne替换成我们修改之后的文件再测试看看.


看到没有,取当前目录() 的结果是真正的当前目录了.不再是exe所在的目录.


还有就是,我这krnln.fne的版本是5.0.64.0,不同的版本要修改的地方不同。要自己找了。
简单的方法就是用c32asm打开,查看->输入表,kernel32.dll,SetCurrentDirectoryA,
这个krnln.fne里只调用了3次,我这个第一次调用的地方就是,双击他就自动跳转到了.
把call **和之前的一个push修改掉就可以了.
只要修改第一个就可以了,因为有些是其他地方要用的.
其他版本的也可能不是第一个,那就只修改一个,然后测试看有没有正确,如果不正确修改另一个.一个个试,总有一个是.注意备份.

忘记说了,krnln.fnr也可以用这个方法修改.


我已经把所有文件打包了,c32asm,OD在看雪这里就有下载了.
文件列表:
说明.txt   //现在正在写的这份东西.
exe源码.e  //易语言的测试源码
exe.exe    //测试源码编译后
修改krnln.fne  //已经修改的krnln.fne
原来krnln.fne  //没有修改的krnln.fne
打开cmd.bat  //运行cmd
复制到系统目录.bat  //复制exe.exe到C:\WINDOWS\test.exe
删除系统目录的程序.bat //删除 C:\WINDOWS\test.exe
file.txt   // 测试用的文件




然后最后一件事就是,我想要邀请码......
谢谢.



由于上传文件大小限制,所以把原来的krnln.fne分开一个压缩包.


可能是由于看雪这里几乎没有用易语言的,所以才这么少人看吧.
无论怎么样,感谢各位的支持.
上传的附件 所有文件.rar
原来krnln.rar