🧿 잃어버린 결제모듈 소스코드와 VB6 P-Code
어느 계약직 X
어느 회사에 계약직으로 일하던 때였다. 이 이야기도 거의 2010여년 전후일 것 같다.
바보인척하며 그냥 명랑하게, 그리고 받은 일을 충실히 최선을 다하며 그냥 지내던 때였다.
정직원들은, 그렇게 친절하지는 못했다. 나이도 나보다 많았고, 이미 법정관리에 들어간(2번째) 회사였었는데, 어쨌든 그렇게 아름다운 관계는 되기 어려웠다. ㅎㅎ
친구들, 구내식당, 그리고 미성숙한 자신에 대한 후회
출퇴근하기 좋고, 어쨌든 남들이 뭐라고 하건 좋은 성과를 내고 충실하고 정직하게 일했던거 같다. 그리고 그게 나쁘진 않았다. 그냥 나를 이해해주고 제대로 평가해주는 팀장님이나 그냥 비슷한 또래의 다른 정직원이나 또다른 계약직과 친하게 지내며 21층 구내식당에서 행복하게 밥을 먹으며 서로 더러운 농담을 만들며 킬킬거리며 잘 지냈던거 같다. PC하지는 못한 농담들이었다. ♂️❤️
지금 돌아보면 좋은 우정이었던거 같다. 내가 그렇게 사귄 친구에게 어줍잖은 자존심이나 어설픈 사회적 성공을 갖고 지금보다 더 미성숙하던 내가 멍청한 소리들을 해서 지금은 헤어진 것이 후회스럽고 미안하다.
하지만 당시의 젊고 뭘몰랐고, 혼란스럽던 그 친구를 조금은 이해해줬으면 좋겠다. …이 사회에선 그렇게 돈이나 자리, 회사 같은 것에 혼란스러워 하는게 너무 보통이기도 한 세상이니까 말이다. 슬프고 허망하게도.
Java, Spring, Oracle DBMS, 거기에 프론트엔드 개발까지
속해 있던 팀은 회사내부의 ERP시스템이나, 중견기업이던 그 회사의 직원을 위한 쇼핑몰을 유지보수하는 역할이었다. 대부분은 Java + Spring, Oracle DBMS으로 삽질을 하며 보냈었다. 원래 있던 ‘유지보수’업무를 하던 정규직 직원들은 MiPlatform 정도만 가끔 하고, 사실 자바도, 오라클도 관심이 없었다.
거기에 ‘퍼블리셔’ 업무를 해주던 친구는 있었지만, 자바스크립트나 그 친구가 짜주는 HTML/CSS을 갖고 화면에 붙이고 로직을 붙이는건 전부 내몫이었다. 덕분에 jQuery을 쓰면서 DB/서버/프론트엔드까지 혼자 디자인과 퍼블리싱만 받은 쇼핑몰 개편을 해내거나, 매달 만드는 별거 없는 ‘행사’관련 퀴즈나 기획에 따라 간단한 낱말게임 같은걸 짜고는 했다. 재밌었다.
물론 당시엔 Backbone.js이나 Angular.js의 극초기였고, ‘프론트엔드’개발자는 생소한 개념이었으리라 싶다.
CVS, ViewCVS, Subversion: ‘로마에선 로마법을 따라라’
솔직히 거기 ‘정직원’이라며 건들거리던 분들은 좀 별로였던거 같다. 예를 들면, 팀에 합류할 때엔 CVS + ViewCVS -을 썼다고는 하지만, 이미 ViewCVS은 제대로 동작하지 않고 있었었고, 누가 어디를 고쳤는지 명확히 알기 어렵기 때문에 자기들이 문제를 만들어 놓고 그걸 나중에 합류한 n00b이 문제라며 뒤집어 씌우거나 하는 정도의 우리 사회에 평범하다면 평범한 수준의 사람들이었다.
그런 상황에 팀장도 골치가 아프니, 설득해서 당시엔 쓸만하던 Subversion-으로 전환했다. 그 다음에 정말 말그대로 멱살을 잡혀서 옥상에 끌려가서 ‘로마에 가면 로마법을 따라야 한다’며 그 정직원들에게 헛소리를 들어야 했다. 물론 그때에도 헛소리인걸 너무 잘 알아서 그냥 신경도 쓰지 않았다.
헤드헌팅업체와 남의 대학원 논문
물론, 나도 딱히 그들에게 고분고분한 ‘어린 후배’ 역할을 해주진 않은 것 같다. 매일 밀려드는 업무를 쳐내느라, 또 야근눈치를 너무 노골적으로 주던 곳이라 매일 야근에 근태는 별로 관심 없었다. 그리고 나아가서 중간 ‘헤드헌팅’업체는 좀 과하게 떼먹는 것 같고 그렇다고 제대로 계약금을 올려주지도 못하는, 어쨌든 내가 계약을 유지해주는걸 고마워하지도 않는 곳이었다.
더군다나 다른 총책임자는 자기 대학원 논문을 위한 코딩을 냉면 한 그릇 사주고 부탁하거나(물론 당시 말대로 ‘KIN’때려야 할 정도의 부탁이었다) 하는, 지금 생각해도 어질어질한 상황이었다.
그래도 그냥 잘 건강히 지내려고 노력한 것 같다
말했듯이, 그 사람들은 일에 대해서도, 그리고 감정휴지통으로서도 좋지 못하게 악용하며 대하는 인격적으로 별로 기대하기 어려울 사람들인걸 당시에도 잘 알고 있었다. 그리고 그때나 지금이나 어떤 사회에선 그렇게 행동해도 될거라고 착각하며, 결국 스스로에게 가장 좋지 않은 영향만 만들어 내는 사람들이 있다.
지금 돌아보면, 그렇게 행동한다고 그 나중에 엄청난 이익을 얻거나 하는 것도 아니다. 반면, 그렇게 쓰레기이기만 한 일도 아니었다. 성실히 진지하게 대했어도 될 일들이었다.
그런 사람들은, 항상 그 양극단을 자기정당화를 위해 오가며 선택한다. 하지만 반대가 훨씬 좋은거 같다. 겸허할 곳을 알며 한편으로는 진지하게 최선을 다하는게 내겐 더 좋은 관점인 것 같다.
그리고 또다른 모험의 여명 ⚔️🪄
그렇게 지내던 중에, 그 쇼핑몰에 또다른 결제방식인 ‘escrow방식’을 추가해야 한다는 이슈가 발생했다. 어디서 나왔는진 모르겠다.
재밌는건, 그 결제모듈은 당시 Internet Explorer / Windows만을 위한 그 쇼핑몰 웹사이트에서 사용하기 위해 제작된 ActiveX였는데, 그 소스코드를 잃어버렸다고 하는 것이었다.
글쎄다, 지금에 와서 생각해보면, 그 정직원분들이 앙심에 그러는 것일 수도 있고, 정말 잃어 버렸을지도 모르겠다 싶다. 이미 버전관리가 어떤지 봐왔었으니 충분히 그럴만도 하다 싶다. 그리고 한편으로는 그런 허술한 측면을 자신들의 무기로 만들려고나 드는 정도의 인격인걸 알기 때문에 고의적일거라는 의심이 드는 것도 타당할 것 같다.
하옇튼 나는 그냥 모른척 해도 됐을거 같다. 소스코드를 잃어 버렸다는데 뭐 어쩔건가. 그런데 그냥 뭔가를 시작했다.
초기분석과 계획수립 🔬
소스코드는 잃어버렸다고 해도, 바이너리는 있으니 OCX/DLL 파일 분석을 해봤다.
결과는 나름 행운이었던거 같다. 아니면 그냥 Visual Basic 6-을 사용해준 조금은 게으른 누군가에게 고마워 해야 했을까.
어쨌든 분석으로 얻은 지식은:
- VB6으로 작성했다.
- 그리고 단순히 다른 결제업체(“PG업체”)가 제공한 DLL을 호출하는 방식.
- ActiveX인 이유는, IE에서 사용하기 위해서.
그리고 VB6은, 현재의 Visual Basic .NET-와 달리, 그리고 Delphi 등과는 또 다른 방식으로 코드를 컴파일했다.
만약 전자의 .NET 방식으로 컴파일되었다고 하더라도 리버싱이 수월했을 것 같다. 하지만 그렇진 않았다.
다만, 델파이나 Visual C++ 등이 진짜 x86 기계어코드를 생성해 내는 것과 다르게, VB6은 P-code-이라고 불리는 바이트코드으로 컴파일해놓고, 그걸 나중에 그 이미지가 실행될 때에, VB6을 위한 VM이 실행하는 ‘사실은 interpreted’-방식이었다.
실제로는, VB6이 네이티브코드를 생성하는 것도 가능했겠지만, 그런 ‘자잘한건’ 그 약간 게을렀던 누군가는 관심이 없었던 것 같다.
결론적으로, 내게는 Jackpot! 🎃
P-code 문해능력 👓
그렇게 얻어낸 P-code을 모두 출력해서 그냥 읽기 시작했다.
인터넷을 뒤져서 당시에도 고대의 지식이어서 사라져가던 VB6 P-code에 대한 자료들을 모아서 공부했다.1
그렇게 이해한 것을 기반으로, 출력한 바이트코드에 메모를 해가면서 재구성해나갔다. 어차피 VB6이 그렇게 많은 Syntax construct을 갖지는 않았기 때문에 조금 오래 걸리지만 명확하게 정리해 나갈 수 있었다.
PG API와 재구성 완료 😘
그리고 한편으로는 ‘PG모듈’의 API문서와 예제들을 읽고 이해하고, 분석한 사용코드와 짝을 맞춰 나갔다. …그리고 Voilà!
모든 기능을 그대로 다 재구성해내고, 원래의 목적이던 새롭게 지원되기 시작한 결제방식도 잘 붙여줬다.
그리고 무엇보다 이번엔 SVN 저장소에 잘 커밋해서 잃어버렸다는 이야기가 생기지 않도록 노력했다. 🤣
뒤돌아보며 🎒
이 포스팅을 시작하며, 얼마나 같이 있던 사람들이 악한 사람들인지 떠들었던거 같다. 하지만, 실은 그런 사람들도 미성숙하고 무력한 사람들이었던거 같다. 어떻게든 사회에서 먹고 살고 살아남으려 애쓰던 것 뿐이다. 물론 그 방식이나 정도가 잘못되었고 그럴 방향도, 그렇게 마음 먹어야 할 필요도 없이 악하게 굴었던건 사실이다.
하지만, 오랜 시간이 흐른 지금에 돌아보며, 또 그들이 어떻게 지내는지를 알고 있는 입장에선, 그렇게 살아서는 절대 좋지 않구나 생각이 든다.
그리고 이 글이 기술적인 내용보다, 훨씬 역학적인 상황이나 인간에 대한 이야기가 많은 이유는, 그다지 밉지 않기 때문이다. 물론 친구로 사귀거나 같이 일하고 싶진 않다. 하지만 그렇게 그들이 해준 덕분에, 그들이 감히 어디서 굴러들어온 외주계약직이 해낼거라 믿지 않아준 덕분에, 내가 실패할거라 기대해준 덕분에 이 리버싱을 성공할 수 있었고, 멋진 성취감을 느낄 수 있었다. 그리고 그런 성취감은 계속해서 나를 어떤 특정한 방향으로 성장시켜줬던거 같다.
그 이후에도 그러한 방식으로 나를 대하는 사람들을 접하게 되어도 더 깊이 이해하게 되었다. 오히려 내 상대로 있는 그런 사람들은 적어도 그 시점엔 절대로 이해하지 못할 관점과 깊이로서 나는 그런 상대를 이해할 수 있게 된 것에 감사한다.
그리고 그때의 인연들중에 지금에 와서 감사하다고 말하고 싶은 좋은 사람들도 많다.
기술적으로 어떤 교훈보다는, 그것들을 어떻게 바라보고 받아들이는지는 이 글을 통해서 이미 충분히 이야기한 것 같다. 그리고 그게 정말 중요하다고 생각한다.