写点东西,顺便申请邀请码,等得实在受不了了。每天都只涨一点,有时受不了下载点东西就没了。有些区还进不去。
易语言的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
我再重新运行,发现从开始直到我在易语言写的代码都只有这个地方调用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分开一个压缩包.
可能是由于看雪这里几乎没有用易语言的,所以才这么少人看吧.
无论怎么样,感谢各位的支持.