Hi!
I modify an exe file (systeminformation.exe). Added new section .text2. In Pelles I create my project, compilled my exe and manually in hexeditor put my code from my exe to target exe. Currently I have 100% worked hacked systeminformation.exe with loading PNG file!
In my project I use this branching code:
#define ADRofFindWindowW 0x1234 // address in import table in hacked exe
#define chunc_code(adr) {__asm LDR R12,[PC];__asm LDR PC,[R12];__asm dd adr;}
static __declspec(naked) HWND __stdcall myFindWindowW(LPCWSTR lpClassName, LPCWSTR lpWindowName)
chunc_code(ADRofFindWindowW)
#define FindWindowW(a,b) myFindWindowW(a,b)
int WINAPI WinMain{
...
HWND hw=FindWindowW(L"HHTaskBar",NULL);
...
return 0;
}
I would like to change type of myFindWindowW to "__inline" and get compiler to make code like BL offset ADRofFindWindowW without LDR PC, [dcd_YYY]; dd YYY . It's possible in Pelles C?
__asm BL #0x1234; - worked but not properly (compiled to "34 12 00 EB")
__asm BL offset 0x1234; - error #3151: [asm] Syntax error.
__asm BL #(offset 0x1234); - error #3151: [asm] Syntax error + error #3152: [asm] Expected ')'.
__asm BL #(PC-0x1234)/4; - error #3140: [asm] Relocation expression is too complex.
__asm label_curadr: BL #( (label_curadr-0x1234)/4-2 ); - error #3140: [asm] Relocation expression is too complex.
__asm BL #( (0x11040-0x1234)/4-2 ); - compilled properly, but this way very silly. Current address of asm instruction is not constant and changing all the time
Please help!
Solved! My way is long but work perfectly. Compiller now maked instructions BL <My_label>
1. Look at sections on target file (systeminformation.exe).
.text 00011000-0001E000
.rdata 0001E000-0001F000
.pdata 00021000-00022000
.idata 0001F000-0001F184
.data 0001F184-00021000
2. In my Pelles C project I adder this 000.asm:
...
EXPORT _0x1DEF8; addr of FindWindow in systeminformation.exe
...
AREA .content, DATA
_0x11000: dcd 0
_0x11004: dcd 0
_0x11008: dcd 0
_0x1100C: dcd 0
_0x11010: dcd 0
...
_0x1DEF8: dcd 0
...
_0x209F8: dcd 0
_0x209FC: dcd 0
align 0x1000
dcd 0,0,0,0
3. In main.c:
#pragma comment(linker,"/BASE:0x10000")
#pragma comment(linker,"/align:0x1000")
#pragma comment(linker,"/merge:.data=.SIL.")
#pragma comment(linker,"/merge:.text=.SIL.")
#pragma comment(linker,"/merge:.pdata=.content")
#pragma comment(linker,"/noentry")
...
#define chunk_declare2(adr, func) extern void adr(void); typedef func;
...
chunk_declare2(_0x1DEF8, HWND __stdcall FindWindowW_(LPCWSTR lpClassName, LPCWSTR lpWindowName));
#define FindWindowW (*(FindWindowW_*)_0x1DEF8)
...
extern void HideTaskBar(void){
HWND hwnd=FindWindow(L"HHTaskBar",0);
if(hwnd) ShowWindow(hwnd,0);
}
...
4. Done. Sections in my project.exe: .content: 00011000-00022000, .SIL.: 00022000-00025000.
Copy section .SIL. from project.exe to systeminformation.exe (start address of sections is same!)
Look at IDA on my function HideTaskBar:
...
.SIL.:00022220 sub_22220
.SIL.:00022220 var_4 = -4
.SIL.:00022220 STR LR, [SP,#var_4]!
.SIL.:00022224 LDR R0, =aHhtaskbar
.SIL.:00022228 MOV R1, #0
.SIL.:0002222C BL FindWindowW
.SIL.:00022230 CMP R0, #0
.SIL.:00022234 BEQ locret_22240
.SIL.:00022238 MOV R1, #0
.SIL.:0002223C BL ShowWindow
.SIL.:00022240 locret_22240
.SIL.:00022240 LDR PC, [SP+4+var_4],#4
...
.text:0001DEF8 FindWindowW
.text:0001DEF8 LDR R12, =__imp_FindWindowW
.text:0001DEFC LDR PC, [R12]
.text:0001DF00 off_1DF00 DCD __imp_FindWindowW
...[color=red][/color]