#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <windows.h>
#include <tchar.h>
#include <tlhelp32.h>
#include <psapi.h>
char
* replace_substring(
char
* str,
const
char
* old_substr,
const
char
* new_substr) {
char
* result;
int
i, cnt = 0;
int
new_len =
strlen
(new_substr);
int
old_len =
strlen
(old_substr);
for
(i = 0; str[i] !=
'\0'
; i++) {
if
(
strstr
(&str[i], old_substr) == &str[i]) {
cnt++;
i += old_len - 1;
}
}
int
new_str_len = i - cnt * (old_len - 1) + cnt * new_len + 1;
result = (
char
*)
malloc
(new_str_len *
sizeof
(
char
));
if
(!result) {
perror
(
"Memory allocation failed"
);
exit
(EXIT_FAILURE);
}
i = 0;
char
* ptr = result;
while
(*str) {
if
(
strstr
(str, old_substr) == str) {
char
buffer[256];
strcpy_s(ptr,
sizeof
(ptr), new_substr);
ptr += new_len;
str += old_len;
}
else
{
*ptr++ = *str++;
}
}
*ptr =
'\0'
;
return
result;
}
FARPROC GetRemoteProcAddress(
HANDLE
hProcess,
HMODULE
hModule,
LPCSTR
lpProcName) {
BYTE
buffer[4096];
SIZE_T
bytesRead;
if
(!ReadProcessMemory(hProcess, hModule, buffer,
sizeof
(buffer), &bytesRead)) {
return
NULL;
}
PIMAGE_DOS_HEADER dosHeader = (PIMAGE_DOS_HEADER)buffer;
PIMAGE_NT_HEADERS32 ntHeaders = (PIMAGE_NT_HEADERS32)((
BYTE
*)buffer + dosHeader->e_lfanew);
DWORD
RVAForExpDir = ntHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
if
(!ReadProcessMemory(hProcess, (
BYTE
*)hModule + RVAForExpDir, buffer,
sizeof
(IMAGE_EXPORT_DIRECTORY), &bytesRead)) {
return
NULL;
}
PIMAGE_EXPORT_DIRECTORY exportDir = (PIMAGE_EXPORT_DIRECTORY)buffer;
DWORD
funcAddr = (
DWORD
)(exportDir->AddressOfFunctions);
DWORD
nameAddr = (
DWORD
)(exportDir->AddressOfNames);
DWORD
nameOrdAddr = (
DWORD
)(exportDir->AddressOfNameOrdinals);
for
(
DWORD
i = 0; i < exportDir->NumberOfNames; i++) {
char
name[256];
DWORD
TrueNameAddr;
WORD
TrueOrd;
DWORD
TrueFuncAddr;
if
(!ReadProcessMemory(hProcess, (
BYTE
*)hModule + nameAddr +
sizeof
(
DWORD
) * i, &TrueNameAddr,
sizeof
(TrueNameAddr), &bytesRead)) {
return
NULL;
}
if
(!ReadProcessMemory(hProcess, (
LPCVOID
)((
BYTE
*)hModule + (
DWORD
)TrueNameAddr), name,
sizeof
(name), &bytesRead)) {
return
NULL;
}
if
(_stricmp(name, lpProcName) == 0) {
DWORD
LoadLibraryAddr = 0;
if
(!ReadProcessMemory(hProcess, (
BYTE
*)hModule + nameOrdAddr +
sizeof
(
WORD
) * i, &TrueOrd,
sizeof
(TrueOrd), &bytesRead)) {
return
NULL;
}
if
(!ReadProcessMemory(hProcess, (
BYTE
*)hModule + funcAddr +
sizeof
(
DWORD
) * (TrueOrd), &TrueFuncAddr,
sizeof
(TrueFuncAddr), &bytesRead)) {
return
NULL;
}
return
(FARPROC)(TrueFuncAddr + (
BYTE
*)hModule);
}
}
return
NULL;
}
FARPROC GetLoadLibraryW(
HANDLE
hProcess) {
HMODULE
hMods[1024];
DWORD
cbNeeded;
unsigned
int
i;
FARPROC ret = NULL;
if
(EnumProcessModulesEx(hProcess, hMods,
sizeof
(hMods), &cbNeeded, LIST_MODULES_32BIT)) {
for
(i = 0; i < (cbNeeded /
sizeof
(
HMODULE
)); i++) {
TCHAR
szModName[MAX_PATH];
if
(GetModuleBaseName(hProcess, hMods[i], szModName,
sizeof
(szModName) /
sizeof
(
TCHAR
))) {
if
(!_wcsicmp(L
"kernel32.dll"
, szModName)) {
ret = GetRemoteProcAddress(hProcess, hMods[i],
"LoadLibraryA"
);
}
}
}
}
return
ret;
}
int
main() {
const
char
* str1 =
"外1"
;
const
char
* str2 =
"外"
;
char
* result =
"qwe外额"
;
char
* new_text = replace_substring(result, str2, str1);
printf
(new_text);
DWORD
dwProcessId;
HWND
hWnd = FindWindowA(
"#32770"
,
"krc2lrc v1.2"
);
if
(hWnd != NULL) {
printf
(
"窗口句柄: %d\n"
, (
void
*)hWnd);
GetWindowThreadProcessId(hWnd, &dwProcessId);
}
else
{
printf
(
"未找到窗口\n"
);
}
printf
(
"pLoadLibraryA failed (%d).\n"
, dwProcessId);
FARPROC pLoadLibraryA = GetLoadLibraryW(dwProcessId);
printf
(
"pLoadLibraryA failed (%d).\n"
, pLoadLibraryA);
printf
(
"pLoadLibraryA1 failed (%p).\n"
, pLoadLibraryA);
return
0;
}